辣鸡随机cos图片
体验地址bbimg.rbq.ai
该链接运行在魔王到云上萝莉香港姬上,速度挺不错到。
cos图片分辨率比较高可能有些图片比较大
现在默认是每日Top50
功能
- 图片文件缓存到本地目录(不是直接重定向)
- 可以排除大于/小于指定大小到图片(解决沙雕表情包和长长长图)
- 允许设置最大存储容量(过大随机选择一些幸运的删除)
- 允许设置访问一次去下载几张图片
- 可以改到画友/私服到输出
- 下载链接只需一次获取(不用每次下载都爬)
- 随机输出目录图片缓存(不用每次扫描目录随机)
- 单文件,只需要一个index.php即可无需更多文件
缺点就是有些图会混进来,比如飞机模型或奇怪的图,虽然判断文件大小可以过滤很多,但是有些图片内容比较差,这个没办法,图片长宽比咱感觉都可以接受
更多代完善,因为不是什么复杂代码,就放到RBQ.AI 好了,没必要放到Github什么的
废话不多说上代码(注释比较少)
<?php /** * 随机输出一张获取bilibili相册top50 * Created 2019-04-02 21:02 RPC * Updated 2019-04-03 23:12 RPC * EMail [email protected] * User yfsama */ define("SAVE_IMAGES_PATH", 'Resource'); define("SAVE_LOG", true); define("SAVE_LOG_PATH", 'Log'); define("SPIDER_MODE", 'cos'); define("BILIBILI_BIZ", 2); define("RANK_TYPE_BIZ", "day"); define("SAVE_NUM", 1); // 每次下载数量 define("CACHE_FILE", "cache"); //缓存文件 define("IMAGES_CACHE_FILE", "images_cache"); //图片下载缓存 define("CACHE_TIME", 120); define("MAX_SAVE_STORAGE", 1500);//M 最多存储图片 define("MAX_IMG_STORAGE", 4096);//kb 图片大于这个大小删除 define("MIN_IMG_STORAGE", 150);//kb 图片小于这个大小删除 $userAgent = [ "Connection: keep-alive", "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "Upgrade-Insecure-Requests: 1", "DNT:1", "Accept-Language:zh-CN,zh;q=0.8", "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36" ];//设置用户user-agent //Public function function init_mkdir($name) { if (!file_exists($name)) { mkdir($name, 0777, true);//创建文件夹 } } function curl_get($url, $user_agent) { $ch = curl_init(); //初始化一个cURL会话 curl_setopt($ch, CURLOPT_URL, $url);//设置需要获取的 URL 地址 curl_setopt($ch, CURLOPT_HTTPHEADER, $user_agent); // 设置浏览器的特定header curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//不返回数据 if (empty($result = curl_exec($ch))) { print_r('无法连接' . $url); die(); };//执行一个cURL会话 return $result; } function image_save($file_url, $dir_name) { //下载 foreach ($file_url as $images) { foreach ($images as $key => $value) { if (file_exists($dir_name . DIRECTORY_SEPARATOR . $key)) {//检测是否存在 continue; } else { if (@$image_save = file_get_contents($value)) { if (SAVE_LOG) { $filename = SAVE_LOG_PATH . DIRECTORY_SEPARATOR . date('y-m-d') . "Log"; if (!file_exists($filename)) { touch($filename); } file_put_contents($filename, $key . "=>" . $value . PHP_EOL, FILE_APPEND); } @file_put_contents($dir_name . DIRECTORY_SEPARATOR . $key, $image_save); } else { if (SAVE_LOG) { $filename = SAVE_LOG_PATH . DIRECTORY_SEPARATOR . date('y-m-d') . "Log"; file_put_contents($filename, $key . "=>" . $value . "获取失败" . PHP_EOL, FILE_APPEND); } } } } } } function get_images($result) { $images_arr = []; foreach (@$result->data->items as $items) { $user_name = $items->user->name;//获得用户名 $items_obj = $items->item->pictures; $image_num = 1;//图片没有单独的ID 当拥有多张图片当时候防止重复 foreach ($items_obj as $src_obj) { $src = $src_obj->img_src; $format = explode('.', $src); $filename = $items->item->title . "-" . $user_name . "-" . $items->item->doc_id . "-" . $image_num . "." . $format['3']; array_push($images_arr, [$filename => $src]); $image_num++; } unset($image_num); } return $images_arr; } //Run init_mkdir(SAVE_IMAGES_PATH); init_mkdir(IMAGES_CACHE_FILE); if (SAVE_LOG) { init_mkdir(SAVE_LOG_PATH); } $imgCacheName = IMAGES_CACHE_FILE . date('Y-m-d'); if (!file_exists(IMAGES_CACHE_FILE . DIRECTORY_SEPARATOR . $imgCacheName)) { $parm = "biz=" . BILIBILI_BIZ . "&category=" . SPIDER_MODE . "&rank_type=" . RANK_TYPE_BIZ . "&date=" . date('Y-m-d') . "&page_num=0&page_size=50"; $result = curl_get("http://api.vc.bilibili.com/link_draw/v2/Doc/ranklist?" . $parm, $userAgent); $result = json_decode($result); $images_arr = get_images($result); touch(IMAGES_CACHE_FILE . DIRECTORY_SEPARATOR . $imgCacheName); file_put_contents(IMAGES_CACHE_FILE . DIRECTORY_SEPARATOR . $imgCacheName, serialize($images_arr)); } else { $images_arr = unserialize(file_get_contents(IMAGES_CACHE_FILE . DIRECTORY_SEPARATOR . $imgCacheName)); } if (count($images_arr) >= 1) { shuffle($images_arr); $new_images_arr =[]; for ($i=1;$i <= SAVE_NUM;$i++){ $new_images_arr[] = array_pop($images_arr); } @file_put_contents(IMAGES_CACHE_FILE . DIRECTORY_SEPARATOR . $imgCacheName, serialize($images_arr)); @image_save($new_images_arr, SAVE_IMAGES_PATH, "BILIBILI" . SPIDER_MODE); } //输出图片 //Cache list if (empty($str) or empty($str['data']) or (time() - $str['time'] >= CACHE_TIME)) { $arr = []; $allSize = 0; foreach (scandir(SAVE_IMAGES_PATH) as $item) { if ($item == "." or $item == "..") { continue; } $size = filesize(SAVE_IMAGES_PATH . DIRECTORY_SEPARATOR . $item); // var_dump((int)$size / 1024); // die(); if ($size / 1024 <= MIN_IMG_STORAGE || $size / 1024 >= MAX_IMG_STORAGE) { unlink(SAVE_IMAGES_PATH . DIRECTORY_SEPARATOR . $item);//如果文件名出现..估计将mmp了 continue; } $allSize += $size; $arr['data'][] = $item; } if ($allSize / 1024 / 1024 >= MAX_SAVE_STORAGE) { shuffle($arr); $arr = array_slice($arr, 0, 10); foreach ($arr as $item){ unlink(SAVE_IMAGES_PATH.DIRECTORY_SEPARATOR.$item); } } $arr['time'] = time(); $serialize = serialize($arr); file_put_contents(CACHE_FILE, $serialize); $str = file_get_contents(CACHE_FILE);//reload $str = unserialize($str); } //Error return if (empty($str['data'])) { echo "没有图片可以加载"; die; } //Rand images $imgName = $str['data'][mt_rand(0, count($str['data']) - 1)]; $img = file_get_contents(SAVE_IMAGES_PATH . DIRECTORY_SEPARATOR . $imgName); $type = substr($imgName, -3, 3); if ($type == "png") { //Check jpg/png $header = "Content-type: image/png"; } else { $header = "Content-type: image/jpeg"; } //Print Images header($header); echo $img;
FAQ 题外话
关于直接使用这个作为链接放多个在浏览器看起来一样,可以通过链接后面用js随机加一些参数来让浏览器重新加载,例如 ?r=awsl2333
关于为什么不直接缓存链接重定向?因为下载的这些文件咱还有其他用途哟!!!
域名解析错误? 测试网址打不开啦
@RoyalFlare 可能咱改解析商忘记解析了,白给了
呜哇,封面图好看