180行随手写的辣鸡随机bilibili相簿cos图片-还是下载到本地那种!

微信扫一扫,分享到朋友圈

180行随手写的辣鸡随机bilibili相簿cos图片-还是下载到本地那种!
3

辣鸡随机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

关于为什么不直接缓存链接重定向?因为下载的这些文件咱还有其他用途哟!!!

咱很菜的,是个智障。 人设非常容易崩。
上一篇

FisherCoffee樱花布丁-来自洪都拉斯皮诺庄园的咖啡

你也可能喜欢

3 条评论

  1. 域名解析错误? 测试网址打不开啦

    1. @RoyalFlare 可能咱改解析商忘记解析了,白给了

  2. 呜哇,封面图好看

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片

排行榜

    抱歉,30天内未发布文章!
返回顶部