抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Yuki 妙妙屋

不要因为走得太远,就忘了当初为什么出发。

众所周知,Pixiv 在大陆被墙,并且图片服务器域名 i.pximg.net 有盗链保护,只要 Referer 不是来自 Pixiv 的请求都会返回 403。那么,如何才能在大陆地区直接访问图片资源?

为什么要代理图片?

p 站都被墙了这么多年,既然都准备走反代了,为什么还要单独对图片?直接搭建反代站不是更好么?

首先,反代站可能会导致 P 站发邮件到您的主机商投诉,甚至还会导致 VPS 服务等被终止。其次是我当初只是想简单给群里做一个涩图机器人,没有特别复杂的使用场景(

类似例如 loliconacgmx 等许多基于 p 站的涩图 API,返回的都是 Pixiv 官方图片链接,并不能直接访问,所以便有了单独针对图片代理的需求。

第三方代理

若不会自己搭建,也可以直接使用第三方服务。pixiv.cat 就是一个专门用于 p 站图片代理的站点,甚至能直接通过图片 id 请求获取插画。

我最初也是使用的该服务,不过后续因主域名在大陆被墙,导致服务全挂掉了(我当时还以为是机器人坏了,排查了近十分钟才发现是代理的问题),便有了自建的想法。

反向代理

如果你有自己的服务器,可以使用 nginx 进行代理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
proxy_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 万次请求,完全满足日常使用。总不至于不够用吧?别冲了,人要冲死了。

1
2
3
4
5
6
7
8
9
10
11
export 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。

1
2
3
4
5
6
7
8
9
10
11
12
13
addEventListener('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 站图片了。

Pixiv 网站上的原始链接(直接打开或在其他网站使用会返回 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
kokkoro

嘛,如果你看完文章还是嫌麻烦,也可以直接把 i.yuki.sh 拿去用,给个 blog 点个 star 就行了(笑)

罗翔说法

张三在网上,用别人提供的 API 服务,居然在 QQ 群里发 R18 的图片,请问张三这一行为触犯了哪项法律?

offend

技术虽无罪,但还是提醒一下,发送的图片请务必遵守你所在国家及其地区的法律法规,别被请喝茶了。

2022-10-03

出于几个月前发生的事情(关注 p 站的应该都知道,有人用别人搭建的反代服务盈利),特别强调一下,本来就靠爱发电,某些人别把开源环境弄得越来越恶臭。

2023-12-16

这个周末,我还是和往常一样,惬意地吹着暖气,打着 gal。就在这时,我突然收到了一封来自服务商的邮件,不看不知道,一看吓一跳,我的反代服务突然出现了大量的请求。

是被 ddos 了?咱平时也没做坏事呀… 带着这个疑问,我立即查看了后台数据,看到 7/s 的访问频率已经持续了一个小时。这么低的频率看来并不是被恶意攻击了,而且 ip 也没发现异常,这让我松了一口气。为了保证 api 能够正常使用,我立马将服务做了升级,随后继续打着黄油。

万万没想到,这种状况一直持续了近 24 小时。起初我其实并不介意,有人能用我的代理服务是一件很开心的事情,因为我做的东西帮到了他人。不过在好奇心的驱使下(到底是谁能冲这么久),我去看了眼日志,当时血压就上来了,喵了个咪的居然一直在请求 R18 的图片。

calling card

我立即制作了这张图片,用作 api 的固定返回结果,并要求当事人与我取得联系。

说实话,我从没这么生气过,用着别人的代理服务一直发 R18 的图片,一天请求了百万次都是小事,但是 ip 全部来自国内,这是一件很自豪的事情么?关注 gal 圈的应该都知道,上个月就是因为发生了类似的事件,导致站长受了牵连。

直到今天,当事人也没有与我取得联系,在群友的帮助下,我大概了解到了事情的经过。起因是一个链接在各大 QQ 群疯传,专门用来获取 R18 图片,而那个 api 正是使用了我的代理服务。当时我正在气头上,准备去找当事人理论理论,点进 blog 一看… 嗯,年纪挺小的一小孩,好像也就没那么生气了。毕竟不知者无罪,也难怪胆子那么大,这件事也算是给我自己起到了一个警示。

评论