#1 - 2021-2-4 15:31
⏳TraceBack⏳ (大胆想象,谨慎思考)
不知道有没有班友在用 eagle 收集色图(bgm59),然后遇到了和我一样的问题
这个问题(讨论?)可能有点冷门刁钻…
不过这真的不是广告(bgm58)
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 用于注入,来进行信息的共享,不知道可不可行(bgm101)

但是这两个方案都一个比一个扯,不想折腾(小声),我也暂时想不到更好的方案
。放开 CORS 也不太好。

我本身并不会前端,因为昨天下午忽然发现下不了色图了气得我血脉喷张,于是花了点时间尝试解决这个问题(bgm83) 但是好像依然没有完美的解决办法,我已经快累得放弃了qaq

各位有什么比较好的解决方案吗(bgm107)

---

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
我是真的没想到还有现成的反代这招啊啊啊啊(bgm80)
不过也算没白研究吧,感谢各位的支持
真的感谢各位(bgm26)

更没想到的是 eagle 的beta版修复了这个功能...(捂脸
#2 - 2021-2-4 15:40
(そして、谷から戻る。)
建议直接放开CORS(bgm38)
#3 - 2021-2-4 15:50
(家に帰るまでが遠足です)
pixiv有防盗链的吗?
safari直接拉一点压力都没有。
#3-1 - 2021-2-4 15:54
snylonue
用 requests 下的时候要校验 referer
#4 - 2021-2-4 15:57
(表达能力极差)
本地开个 nginx 反代
我瞎说的
https:/www.pixiv.net
看下有没有打错,试着加上 UA 和 cookie
或者专门写一个给 pixiv 用的脚本
edit: 看到个油猴脚本
#4-1 - 2021-2-4 16:11
⏳TraceBack⏳
打错应该只是刚才打的时候打错了,已修正
UA 和 cookies 的话,在用 Python 脱离浏览器测试的时候并没添加,也拿到图了
脚本值得一试,感谢!
#5 - 2021-2-4 16:06
(Yesterday Is Dead And Gone.)
插件是可以进行跨域请求的
https://developer.chrome.com/docs/extensions/mv2/xhr/
#5-1 - 2021-2-4 16:32
⏳TraceBack⏳
Content scripts initiate requests on behalf of the web origin that the content script has been injected into and therefore content scripts are also subject to the same origin policy.
我想要发起跨域请求的是 content script,如此才能保证 referer 是正确的
这篇文档里说 content script 的跨域访问已经被禁止了。
#5-2 - 2021-2-4 16:57
烈之斩
⏳TraceBack⏳ 说: 我想要发起跨域请求的是 content script,如此才能保证 referer 是正确的
在这篇文档里说 content script 的跨域访问已经被禁止了。
一般插件的实现都是转交请求到后台js吧,eagle的extension可以提交PR吗?
#5-3 - 2021-2-4 17:30
⏳TraceBack⏳
烈之斩 说: 一般插件的实现都是转交请求到后台js吧,eagle的extension可以提交PR吗?
一般来说都是这样,所以我才说这个需求比较刁钻(
eagle 还没有开放 extension()
#6 - 2021-2-4 16:31
(大胆想象,谨慎思考)
内容已被用户删除
#7 - 2021-2-4 16:41
没看懂是要做什么?(bgm38)
需求是下载图片吗?那么换其他工具可以吗?
使用 eagle 的原因是什么?因为我没用过所以想问一下
#7-1 - 2021-2-4 16:45
⏳TraceBack⏳
我是想要保留 eagle 的存储图片的体验的,目前还没找到比较好的替代方案,我宁愿折腾
平时用 eagle 是因为方便管理设计方面的素材,后来发现拿来收集色图很方便,就顺带拿来收集色图了
#7-2 - 2021-2-4 16:57
弥御水Scyiki
⏳TraceBack⏳ 说: 我是想要保留 eagle 的存储图片的体验的,目前还没找到比较好的替代方案,我宁愿折腾
平时用 eagle 是因为方便管理设计方面的素材,后来发现拿来收集色图很方便,就顺带拿来收集色图了
我觉得你这个思路很奇怪,貌似把事情搞复杂了。直接使用反代(比如这个)不就能解决问题了吗?装个网址重定向的扩展,把所有图片的域名指定到反代的域名。
或者是用这个,不过因为在境内所以会过滤色情内容。
我没用过 eagle 所以不确定是否可行。
#7-3 - 2021-2-4 17:11
⏳TraceBack⏳
弥御水Scyiki 说: 我觉得你这个思路很奇怪,貌似把事情搞复杂了。直接使用反代(比如这个)不就能解决问题了吗?装个网址重定向的扩展,把所有图片的域名指定到反代的域名。
或者是用这个,不过因为在境内所以会过滤色情内容。
我没...
草,之前完全不知道还有现成的反代,感谢推荐(bgm38)
#7-4 - 2021-2-4 17:18
弥御水Scyiki
⏳TraceBack⏳ 说: 草,之前完全不知道还有现成的反代,感谢推荐
老人手机我.webp

我一开始点进你帖子看到一大段文字和代码却没提到反代时的表情(bgm38)
#8 - 2021-2-4 16:43
1. 作为浏览器插件,其自身在background页面进行跨域xhr是完全没问题的。油猴脚本的 GM_xmlhttpRequest 实质上就是把请求转交给插件的background页面,由background页面进行跨域xhr。
2. 粗略浏览了下该插件的源代码,对于不能获取到base64的图片,该插件直接将url等信息转发到后台软件处,由软件进行处理。但其实现并没有符合OpenAPI规范。(lz上面也说了)
3. 插件的background.js中存在方法 toDataURL() ,实质是获取img的base64方法,可以考虑往里面加料来添加referrer信息。
4. 使用 #4 所说的脚本可能更为方便。
#8-1 - 2021-2-4 16:52
⏳TraceBack⏳
感谢帮助!
我是通过修改 toDataURL() 来实现的,但是目前通过 ajax/fetch/webRequestBlocking 来添加 header 似乎都没有做到… 虽然不会有报错(ajax 的 get 方法会报错),但是若抓包来查看的话,包里的 referer 字段会消失(添加的其他字段不会消失),应该也是出于安全因素考虑
#8-2 - 2021-2-4 16:59
Rhilip
⏳TraceBack⏳ 说: 感谢帮助!
我是通过修改 toDataURL() 来实现的,但是目前通过 ajax/fetch/webRequestBlocking 来添加 header 似乎都没有做到… 虽然不会有报错(ajax ...
对,referrer和cookies都是属于限制字段。如果修改toDataURL不能达到目的的话,只能这么考虑,在manifest.json 中添加 webRequest 权限,走类似该方法的形式,强行给xhr添加referrer头
https://stackoverflow.com/a/31003808/8824471
#8-3 - 2021-2-4 17:01
Rhilip
⏳TraceBack⏳ 说: 感谢帮助!
我是通过修改 toDataURL() 来实现的,但是目前通过 ajax/fetch/webRequestBlocking 来添加 header 似乎都没有做到… 虽然不会有报错(ajax ...
总感觉通过修改插件的方法过于麻烦,(开发者的形式浏览器总是提示停用),或许可以考虑请求 eagle 开发者支持,#4 提供的用户脚本可能更为方便些。
我现在宁愿写用户脚本都尽量不写浏览器插件。
#8-4 - 2021-2-4 17:09
⏳TraceBack⏳
Rhilip 说: 对,referrer和cookies都是属于限制字段。如果修改toDataURL不能达到目的的话,只能这么考虑,在manifest.json 中添加 webRequest 权限,走类似该方法的形式,强...
限制 referer 应该比 webRequest 还要底层一些,这个办法现在也不起用了qaq(没有 check 这份,但是昨天试过修改 webRequest)
#8-5 - 2021-2-4 17:10
⏳TraceBack⏳
Rhilip 说: 总感觉通过修改插件的方法过于麻烦,(开发者的形式浏览器总是提示停用),或许可以考虑请求 eagle 开发者支持,#4 提供的用户脚本可能更为方便些。
我现在宁愿写用户脚本都尽量不写浏览器插件。
嗯,感谢w
#9 - 2021-2-4 18:46
(绿奴竟在我身边.JPG)
看楼主自己折腾真的心疼,我发现了和楼主一样的问题,给 eagle 写了邮件,更新了版本问题就解决了
#9-1 - 2021-2-4 18:51
🦋喵小六❄️
我遇到问题的版本是 2.0.0.3,好用的版本是 2.0.0.15(更新日期 1 月 21 日),打开日志才能看见 build 版本号(最后一位),刚刚去看了一下现在又是新 build 了( 2 月 5 日)
#9-2 - 2021-2-4 18:53
🦋喵小六❄️
说起来 eagle 取消自定义代理也是我反馈的结果,我发现自定义代理某些情况不起作用,结果他们就直接用系统代理了(bgm38)
#9-3 - 2021-2-4 18:59
🦋喵小六❄️
下个版本有个新功能:
【【已完成、尚未发布】浏览器扩展支持将页面中已下载的图片直接发送给 Eagle 客户端收藏,无须进行二次下载,大幅提升收藏性能
我发了邮件建议他们 api 也这样做,eagle 说会考虑的

另一个新功能:
【已完成、尚未发布】重新开发 Eagle 内部下载功能的核心代码,让 Eagle 可以更完美的和其他「上网代理工具」搭配使用
#9-4 - 2021-2-4 20:55
⏳TraceBack⏳
看完你写的我忽然涌起一股子惆怅感(bgm38)
eagle 开发团队也良心过头了(扶额
感谢你的回复,我觉得来 bgm 问一问实在再正确不过了
#10 - 2021-2-4 19:28
(要像风一样自由~)
虽然我看不懂,不过我想借楼问一下,eagle会不会占用过多的额外空间、给硬盘带来压力啊?

从eagle抓取色图这样的事情我虽然很想做,但是没有这个技术力
#10-1 - 2021-2-4 21:04
⏳TraceBack⏳
会占用多一些(比如存缩略图,等等),不过不会过多,我3k张图/几十个字体文件/几十个3min左右的1080p,再加上一些音频素材也才 6g 左右(不过原本该占多少我有点懒得计算了w)

eagle抓取色图不需要任何技术力()拖拽一下就好了
#11 - 2021-2-4 19:47
(BGMのTrinitas<=>婊冈妈<=>补冈妈<=>拜冈妈 ... ... ...)
仓鼠症要治,不治将恐深(bgm38)
#12 - 2021-2-4 19:47
(BGMのTrinitas<=>婊冈妈<=>补冈妈<=>拜冈妈 ... ... ...)
换firefox呢?
#12-1 - 2021-2-4 22:21
⏳TraceBack⏳
不想就此更换浏览器,不过很多测试的部分类似的代码在 Firefox 上和 Edge 上结果的不同很神秘(如果是在 Firefox 下这个问题应该早都解决了x
#13 - 2021-2-4 20:59
(プリズムの煌きよ!)
过于高端(bgm38)
#14 - 2021-2-4 21:32
(Don't feel. Think.)
看完全文才发现文章里同时出现了edge和eagle两个词……