作者alan23273850 (God of Computer Science)
看板Soft_Job
标题[请益] javascript 如何跨源存取 iframe 内容
时间Sun Mar 12 14:41:34 2023
如题,学校网站课程影片的连结是存在某个 iframe 里面,
由於我想要自己写一个 Chrome extension 存取该连结并下载它,
脚本通常是用 javascript 写,如果是下列写法,
iframe = document.getElementById("tool_content");
iframe.contentDocument 会因为 CORS 机制而存取不到,
想问板上各路大神是否有一个针对此问题的超强力解法?... (Q1)
此外,下载影片的方式我也想询问,如果是右下角出现
Download
Playback speed
Picture in picture
这三者选单的画面的话,有没有也可以直接用 javascript 或其他等价方法的
下载方式呢?... (Q2)
上述两个解答有效的话,都有丰厚批币,但第一个问题较为重要,谢谢罗~
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 115.43.121.35 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1678603297.A.0A9.html
1F:→ alan23273850: 其中一个作法可能是把 console.log(iframe) 的输出 03/12 15:55
2F:→ alan23273850: 转成字串就能处理,但这个动作我也一直找不到解法:( 03/12 15:55
4F:推 MoonCode: 原理是仿造一个网页元素去下载? 03/12 16:10
5F:→ MoonCode: 好像不行耶 感觉要先把 cors 相关先念熟 我先躺了 03/12 16:12
6F:→ MoonCode: 可能要从浏览器缓存或是网路层下手了 这有专业的人在做 03/12 16:19
7F:推 s06yji3: 用postMessage和MessageEvent 03/12 16:24
8F:→ alan23273850: 回楼上,postMessage 是很多人提出的解法,但我不知 03/12 16:36
9F:→ alan23273850: 道具体要怎麽去修改校网传来的 iframe,能加在 tag 03/12 16:36
10F:→ alan23273850: 里面吗?iframe 本身有办法把自己的 content 丢出来 03/12 16:37
11F:→ alan23273850: 吗? 03/12 16:37
12F:推 stupid0319: proxy server 03/12 17:20
13F:→ alan23273850: 回楼上,自己架的话可能可以 (不清楚细节),但如果 03/12 17:26
14F:→ alan23273850: 要作成 extension 发布,总不可能叫人家自己架一个? 03/12 17:27
15F:推 wulouise: 只是要抓影片wget不就结束了? 03/12 17:30
16F:推 s06yji3: 预期是inject一个script到网页上去取得iFrame资料 03/12 17:30
17F:→ ssccg: 要跨网域存取,一定需要你要存取的网页配合,以你的情况来 03/12 17:33
18F:→ ssccg: 说就是script要执行在iframe里那个网页上,只改外面的网页 03/12 17:35
19F:→ ssccg: 无论如何都是不行的(否则就是浏览器需要修补的安全性漏洞) 03/12 17:36
20F:→ alan23273850: 回覆 @s06yji3,我不确定 Chrome extension 能否这 03/12 17:37
21F:→ ssccg: 但是你是extension,所以应该是直接inject script到iframe 03/12 17:37
22F:→ alan23273850: 样做?然後 @ssccg 大,我有尝试过 disable Chrome 03/12 17:37
23F:→ alan23273850: 的 CORS 限制,但是那个在网页重整之後就会失效了。 03/12 17:38
24F:→ ssccg: 里面那个网页去配合 03/12 17:38
25F:→ alan23273850: Chrome extension 可以 inject script 到本地网页去 03/12 17:38
26F:→ alan23273850: 捞那个 iframe 的内容,然後再回传到自己的script吗 03/12 17:39
28F:→ ssccg: content_scripts/#frames 03/12 17:43
29F:→ alan23273850: 谢谢楼上,看起来可以用上,但我这两天爆试已经很累 03/12 17:50
30F:推 s06yji3: 哦,好像inject到iframe 比较直接 03/12 17:54
31F:→ alan23273850: 所有的 nested iframe 也可以 inject 吗? 03/12 17:54
32F:→ MarcoReus: 如果iframe 网址已知 我会用background script 直接去 03/12 19:16
33F:→ MarcoReus: 捞 @@ 03/12 19:16
34F:推 MoonCode: 乾好猛 学习到了 03/12 19:23
35F:→ MoonCode: 阿 我还是看不懂 等原po 实验成功回来教教我QQ 03/12 19:23
36F:→ alan23273850: 有两个都是 <iframe src="about:blank" ...,但我只 03/12 21:43
37F:→ alan23273850: 要其中一个,这样有办法吗? 03/12 21:43
38F:→ superpandal: 这东西之前弄过 但安全起见还有更好的方式 03/12 22:23
39F:→ superpandal: 式 03/12 22:23
40F:→ alan23273850: 回楼上,如果是自己写的脚本应该没有安全顾虑?求解 03/13 00:15
41F:→ superpandal: 这方式本来就有安全疑虑 无关是不是自己写 03/13 00:34
42F:→ superpandal: 写 不硬要可以更安全 03/13 00:35
43F:→ superpandal: 至於自己写的可以写的更绝一点 03/13 00:38
44F:推 Arctica: 直觉要透过前端做就是会被browser挡 03/13 12:36
45F:→ alan23273850: @superpandal 想请问大大有实际范例可以参考吗? 03/13 12:52
46F:→ MarcoReus: 原po能提供你的iframe 格式吗? 03/13 13:34
47F:→ superpandal: 在公司弄的 现在也没空 在研究其它的 03/13 17:23
48F:→ superpandal: 你多看mdn 再实作一下不就懂了... 03/13 17:31
50F:→ Hsins: src="about:blank" 的话,找看看是不是有某段 JS 生出来的 03/13 21:54
51F:→ Hsins: 还是 server-side 本身就故意要这样塞,前者的话可以直接 03/13 21:55
52F:→ Hsins: 找到资源网址吧 03/13 21:55
53F:推 Saaski: 某s就是在嘴炮而已,他平常回文就那样,不用理他 03/13 22:03
54F:→ alan23273850: 回 @Hsins,这目前对我来说是 undecidable 问题哈哈 03/13 22:18
55F:→ alan23273850: 而且是有两个 iframe 的 src 都是 about:blank,但 03/14 01:44
56F:→ alan23273850: 我只要其中一个,这样也行吗? 03/14 01:44
57F:推 MarcoReus: 我猜你的iframe 内容是其他js塞的 看一下network 的req 03/14 19:21
58F:→ MarcoReus: uest 有没有你要的关键字 03/14 19:21
59F:→ alan23273850: 我好像找到解法了!!!大致上是去筛 server 送来的 03/14 23:59
60F:→ alan23273850: response body 里面出现的影片 url,详细解法等我 03/14 23:59
61F:→ alan23273850: 实作完之後再上来告诉大家!奖金的发放也是。 03/14 23:59
62F:推 qq1217: 期待解法 03/15 00:05
63F:推 q00153: 这个简单的需求,使用脚本外挂就拿做到 03/17 07:27