代码来自@mokeyjay的 Pixiv每日排行榜Top50小部件,本人做了一些修改来专用于输出第一张图片的完整图片(也可以输出其他的图片)
可用于获取Pixiv每日排行榜第一张图片并直接输出,比如作为博客背景图像(配合高斯模糊食用效果最佳)
食用方法:(两种任选)
第一种:直接把图片路径指向这个php文件
第二种:图片路径指向保存文件路径(默认为pixiv.jpg),然后挂个计划任务每天自动调用pixiv.php来刷新图片
以下是代码:【建议保存为pixiv.php】
<?php
/**
* 自动获取Pixiv每日排行榜第一张图片
* @author Kenvix <i@kenvix.com>
* @url https://kenvix.com
* ------------------------------------------------------
* 可随意修改、二次发布。但请保留上方版权声明及注明出处
*/
error_reporting(0);
set_time_limit(20); //超时时间 0为永久不超时
define('DAT','pixiv.jpg'); //保存文件路径
define('IMG', 0); //表示获取0号图片,若要获取其他图片,修改数字,比如获取第三张图片表示为2
$time = file_exists(DAT) ? filemtime(DAT) : '';
if(!isset($_GET['text'])) header('Content-type: image/jpg');
if(empty($time) || (!empty($_GET['force']) && $_GET['force'] == 'forcepassword') || (time() - $time) > 86400) { //修改forcepassword可以设置强行刷新图片的密码,访问 pixiv.php?force=forcepassword 即可强制刷新图片
$html = curl_get('http://www.pixiv.net/ranking.php?mode=daily&content=illust');
// 匹配缩略图url
preg_match_all('|http://i\d\.pixiv\.net/c/240x480/img-master/img/\d{4}/\d{2}/\d{2}/\d{2}/\d{2}/\d{2}/(.*?\.\w{3})|', $html, $image);
// 匹配链接
preg_match_all('|member_illust.php\?mode=medium&illust_id=\d+&ref=rn-b-\d+-title-\d&uarea=daily|', $html, $url);
$url = str_ireplace('240x480','600x600',$image[0][IMG]);
$f = curl_get($url, array(
'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',
'Referer: http://www.pixiv.net/member_illust.php?mode=medium&illust_id=' . str_ireplace('_p0_master1200.jpg','',$image[1][IMG])
));
//拒绝写入无效图片
$info = getimagesizefromstring($f);
if(empty($info)) {
//无效图片处理方法
echo 'Err#0';
} else {
file_put_contents(DAT, $f);
echo $f;
}
die;
}
readfile(DAT); //直接输出
/**
* CURL读取数据
* @param $url
* @return mixed
*/
function curl_get($url, array $header = array()){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}