用PHP Laravel随机你的洛谷主页(Powered by Pixiv)
  • 板块灌水区
  • 楼主jjz080
  • 当前回复12
  • 已保存回复12
  • 发布时间2023/11/12 16:18
  • 上次更新2023/11/12 17:47:19
查看原帖
用PHP Laravel随机你的洛谷主页(Powered by Pixiv)
1027814
jjz080楼主2023/11/12 16:18

成品URL

https://zkg.me/api/picshow

用法

直接使用Markdown语法插入

Eg:

核心代码

1.获取Pixiv Ranking(由于rank界面不需要登录所以不用担心nsfw)

<?php

namespace App\Http\Controllers;

use GuzzleHttp\Client;
use App\Http\Requests\PixivRequest;

class PixivController extends Controller
{
    public function show(PixivRequest $request)
    {
        $client = new Client();

        $response = $client->request('GET', 'https://www.pixiv.net/ranking.php', [
            'headers' => [
                'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
                'Accept-Language' => 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
                'Cache-Control' => 'max-age=0',
                'Sec-Ch-Ua' => '"Microsoft Edge";v="117", "Not;A=Brand";v="8", "Chromium";v="117"',
                'Sec-Ch-Ua-Mobile' => '?0',
                'Sec-Ch-Ua-Platform' => '"Windows"',
                'Sec-Fetch-Dest' => 'document',
                'Sec-Fetch-Mode' => 'navigate',
                'Sec-Fetch-Site' => 'same-origin',
                'Sec-Fetch-User' => '?1',
                'Upgrade-Insecure-Requests' => '1'
            ],
            'referrer' => 'https://www.pixiv.net/ranking.php',
            'referrerPolicy' => 'strict-origin-when-cross-origin',
            'body' => null,
            'mode' => 'cors',
            'credentials' => 'include'
        ]);

        $body = $response->getBody();

        // 这里你可以处理响应体
        // 获取响应体
        $body = (string) $response->getBody();

        // 创建一个新的DOMDocument实例
        $dom = new \DOMDocument();

        // 由于HTML可能不是完全有效的,我们禁用错误报告
        libxml_use_internal_errors(true);

        // 加载HTML到DOMDocument
        $dom->loadHTML($body);

        // 创建一个新的XPath实例
        $xpath = new \DOMXPath($dom);

        // 使用XPath查询搜索所有的img元素
        $imgs = $xpath->query('//img');

        // 创建一个数组来存储匹配的图片URL
        $srcs = [];

        // 遍历所有的img元素
        foreach ($imgs as $img) {
            $src = $img->getAttribute('data-src');

            // 检查src属性是否匹配我们的模式
            if (preg_match('/https:\/\/i\.pximg\.net/', $src)) {
                // 将匹配的图片URL添加到数组中
                $srcs[] = $src;
            }
        }

        // 将数组中的每个值封装到一个数组中
        $values = array_map(function ($src) {
          //更换为镜像站点
            $src = str_replace('/240x480', '/768x1200_80', $src);
            $src = str_replace('i.pximg.net', 'i.pixiv.re', $src);
            return ['value' => $src];
        }, $srcs);

        // 将字符串封装到一个数组中,并返回一个JSON响应
        return response()->json($values);
    }
}

2.创建新的controller用于返回random图片url

<?php

namespace App\Http\Controllers;

use Illuminate\Http\ImageRequest;
use GuzzleHttp\Client;

class ImageController extends Controller
{
    public function show()
    {
      //rand吐回50个value
        $random = rand(0, 49);
        $client = new Client();
        $response = $client->request('GET', 'https://zkg.me/api/pixivrank');
        $data = json_decode($response->getBody(), true);
        $image_url = $data[$random]['value'];
      //使用header节省自身服务器资源
        return redirect($image_url);
    }
}
2023/11/12 16:18
加载中...