#1 - 2021-2-4 15:31
⏳TraceBack⏳ (大胆想象,谨慎思考)
不知道有没有班友在用 eagle 收集色图,然后遇到了和我一样的问题
这个问题(讨论?)可能有点冷门刁钻…
不过这真的不是广告
TL; DR: 可能因为 edge88 更新缓存访问机制与 CORS 的限制,浏览器插件无法访问 i.pximg.net 里的文件(色图)
事情是这样的,大概从 1/22 起,eagle 的 edge extension 就无法通过右键下载或者拖拽的方式获取 pixiv 上的色图了。
eagle 的 extension 获取色图的方法是,在图片上拖拽/通过右键菜单即可收藏。而实现逻辑是
1. 如果能在前端发起请求获取该图片的 base64 则发起,如果出错则转交给后端
2. 后端,即 eagle 的主程序有两个接口,一套 Open API 和一套原本插件使用的 api,只有原生的 API 能够处理前端获取的 base64 以及 url 形式,只有 Open API 能够自定义请求的 header。
就在这段时间,发生了 edge88 更新、eagle 在 edge 的 extension 更新和 eagle 2.0.0 的更新。我简单通过时间顺序排查了一下,如果影响因素单一,edge88 的更新导致色图无法获取的可能性最高,以前可能是因为缓存的问题,以前在获取 base64 的时候直接访问缓存,正好绕过了 pixiv 的防盗链,但是现在不行了(存疑)。
我尝试从修改 eagle extension 入手,但是发现不太可能。因为
1. 从前端硬修改 referer 基本不可能,所以只能从浏览器插件向 pixiv.net 注入代码入手,i.pximg.net 访问的前提是 referer: https://www.pixiv.net
2. 如果要通过 inject,必然是向主站进行前端注入,而若在此时访问 i.pximg.net 会导致跨域安全问题
3. 对于上面的问题,油猴脚本的 GM_xmlhttpRequest 可以解决问题,但是为了解决这个问题引入油猴有点太过复杂了点QAQ
说实话我对油猴脚本为什么能进行跨域访问挺好奇的,这个有没有可能解决部分问题
但是,不知道是因为 bug 还是什么原因,通过 Open API 添加 header 来绕过盗链的办法行不通,eagle 就是无法下载图片(应该不是代理的问题,说巧不巧,eagle 2.0.0 取消了自定义代理,因此连抓包都变得复杂…)。
目前有几个解决方案,可以在 VPS 上自搭一个获取图片 b64 的脚本,然后通过 CORS 简单请求来访问那个脚本以获取 b64。还有一个解决方案是通过油猴脚本来进行跨域请求,然后通过这个骚操作(通过注入脚本以与油猴脚本建立联系)(类似)
将该脚本放到拓展的源文件中,再添加 pixiv.js 用于注入,来进行信息的共享,不知道可不可行。
但是这两个方案都一个比一个扯,不想折腾(小声),我也暂时想不到更好的方案
。放开 CORS 也不太好。
我本身并不会前端,因为昨天下午忽然发现下不了色图了气得我血脉喷张,于是花了点时间尝试解决这个问题 但是好像依然没有完美的解决办法,我已经快累得放弃了qaq
各位有什么比较好的解决方案吗
---
Update: 2021/02/04
在 background.js 中 toDataURL() 函数里添加
可以使用现成的反代或者 Cloudflare Worker
我是真的没想到还有现成的反代这招啊啊啊啊
不过也算没白研究吧,感谢各位的支持
真的感谢各位
更没想到的是 eagle 的beta版修复了这个功能...(捂脸
这个问题(讨论?)可能有点冷门刁钻…
不过这真的不是广告
TL; DR: 可能因为 edge88 更新缓存访问机制与 CORS 的限制,浏览器插件无法访问 i.pximg.net 里的文件(色图)
事情是这样的,大概从 1/22 起,eagle 的 edge extension 就无法通过右键下载或者拖拽的方式获取 pixiv 上的色图了。
eagle 的 extension 获取色图的方法是,在图片上拖拽/通过右键菜单即可收藏。而实现逻辑是
1. 如果能在前端发起请求获取该图片的 base64 则发起,如果出错则转交给后端
2. 后端,即 eagle 的主程序有两个接口,一套 Open API 和一套原本插件使用的 api,只有原生的 API 能够处理前端获取的 base64 以及 url 形式,只有 Open API 能够自定义请求的 header。
就在这段时间,发生了 edge88 更新、eagle 在 edge 的 extension 更新和 eagle 2.0.0 的更新。我简单通过时间顺序排查了一下,如果影响因素单一,edge88 的更新导致色图无法获取的可能性最高,以前可能是因为缓存的问题,以前在获取 base64 的时候直接访问缓存,正好绕过了 pixiv 的防盗链,但是现在不行了(存疑)。
我尝试从修改 eagle extension 入手,但是发现不太可能。因为
1. 从前端硬修改 referer 基本不可能,所以只能从浏览器插件向 pixiv.net 注入代码入手,i.pximg.net 访问的前提是 referer: https://www.pixiv.net
2. 如果要通过 inject,必然是向主站进行前端注入,而若在此时访问 i.pximg.net 会导致跨域安全问题
3. 对于上面的问题,油猴脚本的 GM_xmlhttpRequest 可以解决问题,但是为了解决这个问题引入油猴有点太过复杂了点QAQ
说实话我对油猴脚本为什么能进行跨域访问挺好奇的,这个有没有可能解决部分问题
但是,不知道是因为 bug 还是什么原因,通过 Open API 添加 header 来绕过盗链的办法行不通,eagle 就是无法下载图片(应该不是代理的问题,说巧不巧,eagle 2.0.0 取消了自定义代理,因此连抓包都变得复杂…)。
目前有几个解决方案,可以在 VPS 上自搭一个获取图片 b64 的脚本,然后通过 CORS 简单请求来访问那个脚本以获取 b64。还有一个解决方案是通过油猴脚本来进行跨域请求,然后通过这个骚操作(通过注入脚本以与油猴脚本建立联系)(类似)
console.log(msg.src);
chrome.tabs.executeScript(
tab.id,
{ code: `window.inject_url = "${msg.src}";` },
() => {
chrome.tabs.executeScript(
tab.id,
{ file: "pixiv.js" },
(res) => {
console.log("Exec: " + res);
});
}
);
将该脚本放到拓展的源文件中,再添加 pixiv.js 用于注入,来进行信息的共享,不知道可不可行。
但是这两个方案都一个比一个扯,不想折腾(小声),我也暂时想不到更好的方案
。放开 CORS 也不太好。
我本身并不会前端,因为昨天下午忽然发现下不了色图了气得我血脉喷张,于是花了点时间尝试解决这个问题 但是好像依然没有完美的解决办法,我已经快累得放弃了qaq
各位有什么比较好的解决方案吗
---
Update: 2021/02/04
在 background.js 中 toDataURL() 函数里添加
if (url.toLowerCase().indexOf('pximg.net') > -1) {
// Using https://pixiv.cat/reverseproxy.html
url = url.replace('pximg.net', 'pixiv.cat');
}
可以使用现成的反代或者 Cloudflare Worker
我是真的没想到还有现成的反代这招啊啊啊啊
不过也算没白研究吧,感谢各位的支持
真的感谢各位
更没想到的是 eagle 的beta版修复了这个功能...(捂脸
UA 和 cookies 的话,在用 Python 脱离浏览器测试的时候并没添加,也拿到图了
脚本值得一试,感谢!
在这篇文档里说 content script 的跨域访问已经被禁止了。
eagle 还没有开放 extension()
平时用 eagle 是因为方便管理设计方面的素材,后来发现拿来收集色图很方便,就顺带拿来收集色图了
或者是用这个,不过因为在境内所以会过滤色情内容。
我没用过 eagle 所以不确定是否可行。
↑
我一开始点进你帖子看到一大段文字和代码却没提到反代时的表情
我是通过修改 toDataURL() 来实现的,但是目前通过 ajax/fetch/webRequestBlocking 来添加 header 似乎都没有做到… 虽然不会有报错(ajax 的 get 方法会报错),但是若抓包来查看的话,包里的 referer 字段会消失(添加的其他字段不会消失),应该也是出于安全因素考虑
https://stackoverflow.com/a/31003808/8824471
我现在宁愿写用户脚本都尽量不写浏览器插件。
另一个新功能:
eagle 开发团队也良心过头了(扶额
感谢你的回复,我觉得来 bgm 问一问实在再正确不过了
eagle抓取色图不需要任何技术力()拖拽一下就好了