180行随手写的辣鸡随机bilibili相簿cos图片-还是下载到本地那种!
编辑
12
2019-04-03
辣鸡随机cos图片
体验地址bbimg.rbq.ai 该链接运行在魔王到云上萝莉香港姬上,速度挺不错到。 cos图片分辨率比较高可能有些图片比较大 现在默认是每日Top50功能
- 图片文件缓存到本地目录(不是直接重定向)
- 可以排除大于/小于指定大小到图片(解决沙雕表情包和长长长图)
- 允许设置最大存储容量(过大随机选择一些幸运的删除)
- 允许设置访问一次去下载几张图片
- 可以改到画友/私服到输出
- 下载链接只需一次获取(不用每次下载都爬)
- 随机输出目录图片缓存(不用每次扫描目录随机)
- 单文件,只需要一个index.php即可无需更多文件
<?php
/**
* 随机输出一张获取bilibili相册top50
* Created 2019-04-02 21:02 RPC
* Updated 2019-04-03 23:12 RPC
* EMail yf@rbq.ai
* 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 关于为什么不直接缓存链接重定向?因为下载的这些文件咱还有其他用途哟!!!- 0
- 2
-
分享