众所周知,Pixiv(以下简称 p 站)因各种不可抗力,在部分地区无法正常访问站点,并且图片服务器域名 i.pximg.net 具有盗链保护,只要 Referer 不是来自 p 站的请求,都会返回 403 状态码。那么,我们如何才能通过 URL 直接访问到图片资源?
为什么要代理图片?你可能首先就想到了反向代理,可 p 站都被墙了这么多年,既然都准备走反代了,为什么还要单独针对图片?直接搭建反代站点不是更好么?
首先,反代站点存在着风险,可能会导致 p 站向主机商发送投诉邮件,甚至还会导致 VPS 等服务被终止。其次是包括我在内的大多数人,都只有简单的看色图需求,没有特别复杂的使用场景。
类似例如 lolicon、acgmx 等许多基于 p 站的涩图 API,返回的也都是官方图片链接,并不能直接访问,所以便有了单独针对图片代理的需求。
第三方代理若不会自己搭建,也可以直接使用第三方服务。pixiv.cat 就是一个专门用于 p 站图片代理的站点,甚至能直接通过图片 id 请求获取插画。
我最初也是使用的该服务,不过后续因主域名在我所在的地区被墙,导致服务全挂掉了(我当时还以为是服务器坏了,排查了近十分钟才发现是代理的问题),便有了自建的想法。
反向代理如果你有自己的服务器,可以使用 nginx 进行代理。
12345678910111213141516171819202122232425proxy_cache_path /path/to/cache levels=1:2 keys_zone=pximg:10m max_size=10g inactive=7d use_temp_path=off;server { listen 443 ssl http2; ssl_certificate /path/to/ssl_certificate.crt; ssl_certificate_key /path/to/ssl_certificate.key; server_name i.pixiv.cat; access_log off; location / { proxy_cache pximg; proxy_pass https://i.pximg.net; proxy_cache_revalidate on; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; proxy_cache_lock on; add_header X-Cache-Status $upstream_cache_status; proxy_set_header Host i.pximg.net; proxy_set_header Referer "https://www.pixiv.net/"; proxy_cache_valid 200 7d; proxy_cache_valid 404 5m; }}
没有服务器也没关系,我们可以利用 Cloudflare 的 Workers 白嫖,每日免费提供 10 万次请求,完全满足日常使用。总不至于不够用吧?别冲了,人要冲死了。
1234567891011export default { async fetch(request) { const url = new URL(request.url); url.hostname = 'i.pximg.net'; const proxyRequest = new Request(url, request); proxyRequest.headers.set('Referer', 'https://www.pixiv.net/'); return fetch(proxyRequest); },};
你如果看过其它提供反向代理的教程,可能已经发现了,我写的 Workers 代码与别人贴的不太一样。这是因为 Workers 早就不推荐使用 CommonJS 规范了,官方文档的示例代码也全都更改为了 ESM 规范。
12345678910111213addEventListener('fetch', event => { const url = new URL(event.request.url); url.hostname = 'i.pximg.net'; const request = new Request(url, event.request); event.respondWith( fetch(request, { headers: { Referer: 'https://www.pixiv.net/', }, }), );});
这种写法其实也可以,但它已经过时了,所以我并不推荐。
我要色色!配置相关 DNS 解析后,就可以直接通过 URL 直接访问 p 站图片了。
p 站上的原始链接(直接打开或在其他网站使用会返回 403):https://i.pximg.net/img-master/img/2021/06/10/18/09/04/90457556_p0_master1200.jpg
反向代理(i.yuki.sh)(能正常访问):https://i.yuki.sh/img-master/img/2021/06/10/18/09/04/90457556_p0_master1200.jpg
嘛,如果你看完文章还是嫌麻烦,也可以直接把 i.yuki.sh 拿去用,给个 blog 点个 star 就行了(笑)
罗翔说法张三在网上,用别人提供的 API 服务,居然在 QQ 群里发 R18 的图片,请问张三这一行为触犯了哪项法律?
技术虽无罪,但还是提醒一下,发送的图片请务必遵守你所在国家及其地区的法律法规,别被请喝茶了。
后记
2022-10-03
出于几个月前发生的事情(关注 p 站的应该都知道,有人用别人搭建的反代服务盈利),特别强调一下,本来就靠爱发电,某些人别把开源环境弄得越来越恶臭。
2023-12-16
这个周末,我还是和往常一样,惬意地吹着暖气,打着 gal。就在这时,我突然收到了一封来自服务商的邮件,不看不知道,一看吓一跳,我的反代服务突然出现了大量的请求。
是被 DDoS 了?咱平时也没做坏事呀… 带着这个疑问,我立即查看了后台数据,看到 7/s 的访问频率已经持续了一个小时。这么低的频率看来并不是被恶意攻击了,而且 IP 也没发现异常,这让我松了一口气。为了保证 API 能够正常使用,我立马将服务做了升级,随后继续打着黄油。
万万没想到,这种状况一直持续了近 24 小时。起初我其实并不介意,有人能用我的代理服务是一件很开心的事情,因为我做的东西帮到了他人。不过在好奇心的驱使下(到底是谁能冲这么久),我去看了眼日志,当时血压就上来了,喵了个咪的居然一直在请求 R18 的图片。
我立即制作了这张图片,用作 API 的固定返回结果,并要求当事人与我取得联系。
说实话,我从没这么生气过,用着别人的代理服务一直发 R18 的图片,一天请求了百万次都是小事,但是 IP 全部来自国内,各种不堪入目的图片出现在公共场合,这是一件很自豪的事情么?关注 gal 圈的应该都知道,上个月就是因为发生了类似的事件,导致站长受了牵连。
直到今天,当事人也没有与我取得联系,在群友的帮助下,我大概了解到了事情的经过。起因是一个链接在各大 QQ 群疯传,专门用来获取 R18 图片,而那个 API 正是使用了我的代理服务。当时我正在气头上,准备去找当事人理论理论,点进 blog 一看… 嗯,年纪挺小的一小孩,好像也就没那么生气了。毕竟不知者无罪,也难怪胆子那么大,这件事也算是给我自己起到了一个警示。
2023-10-20
反代服务 pixiv.yuki.sh 已更换为 i.yuki.sh,原地址将作为随机图片 API 来使用,详见 随手做了一个 Pixiv 图片小工具。