bigonion 发表于 2023-1-8 17:47:13

B站专栏的iframe内容获取失败的求助

本帖最后由 bigonion 于 2023-1-9 01:59 编辑

# B站专栏的iframe内容获取失败的求助

## 问题开端

最近在弄B站markdown拓展,遇到了一个比较奇怪的问题
首先到这里[创作中心](https://member.bilibili.com/platform/upload/text/edit),需求就是获取到输入的正文innerHTML
这里的正文被嵌套在一个id为ueditor\_0的iframe里面,src是一段JavaScript(看不懂他在执行什么)
如果直接控制台输入

```js
> document.getElementById('ueditor_0')//返回null
< null
```

你会找不到iframe里面的这个元素,这个元素就是请输入正文的body

!(data/attachment/forum/202301/08/172213go313b353bo1r6uq.png)
ctrl+shift + C找到这个元素!(data/attachment/forum/202301/08/172316bezvnvcuvbyrl7v2.png)
你只要**点一下** 源代码里面的 iframe 后再返回控制台后输入同样的代码!(data/attachment/forum/202301/08/172504d4i883fjf3op3rfy.png)
这时候就**又能获取到元素了**
这到底是为什么呢,为什么点击源代码里面的 iframe 之前,没法从控制台获取元素,点击后就可以了?
这就导致我没法从油猴里面获取到元素了,有点头疼,希望大家帮看看是啥情况(っ °Д °;)っ

## 问题新增1-没法从外层获取 (已解决)

现在没办法从最外层的网址获取到最内层的iframe的body
我在最外层的html的控制台输入

```js
document.querySelector("#edit-article-box > div > iframe")
```

能找到嵌套的第一层
但是我在油猴console.log(document.querySelector("#edit-article-box > div > iframe"))就显示null这里油猴的document我用

```js
const document = unsafeWindow.document
console.log(document)
```

重新赋值了(也grant了)
输出的document也确实是最外层的document
!(data/attachment/forum/202301/09/015007z3tct16qxmk3617l.png)

### 问题1解决方案

```js
// @run-at document-end
```

尽管我加了window.onload
但是iframe比较特殊,没办法在最外层onload的时候确保内层iframe也onload了,所以才会找不到元素

## 问题新增2-iframe跨域报错

最外层输入找到iframe了,但是访问contentWindow报跨域错误了
!(data/attachment/forum/202301/09/015741r1xvw65g7jdyxge6.png)
这回没辙了,求助求助

bigonion 发表于 2023-1-8 18:18:59

还有一个问题,document居然指向Iframe了,是被重写了吗

王一之 发表于 2023-1-8 20:15:46

!(data/attachment/forum/202301/08/201448sndymfcybd78z99a.png)

我看了一下,好像这样就可以获取内容

```js
editor.body.innerHTML
```

李恒道 发表于 2023-1-8 20:15:48

点击了对应元素 window也会切换到相应的firame里
相当于切换了代码的全局作用域位置

cxxjackie 发表于 2023-1-8 20:42:31

iframe嵌套了,一般这种点一下才能获取到元素的都是iframe问题(因为控制台会自动切换环境),你的情况属于iframe被嵌套在另一个iframe中,所以需要先match到这个iframe下再获取元素。第二个iframe是代码生成的,地址是about:blank,油猴似乎无法直接match进这种类型的iframe,不过他跟上一个是同源,可以用iframe.contentDocument访问。

bigonion 发表于 2023-1-8 22:55:11

cxxjackie 发表于 2023-1-8 20:42
iframe嵌套了,一般这种点一下才能获取到元素的都是iframe问题(因为控制台会自动切换环境),你的情况属于 ...

感谢gg!

bigonion 发表于 2023-1-9 00:48:46

王一之 发表于 2023-1-8 20:15
!(data/attachment/forum/202301/08/201448sndymfcybd78z99a.png)

我看了一下,好像这样就可以获取内 ...

gg 你试试刷新进去后直接控制台输入
editor.body.innerHTML应该是不行的

bigonion 发表于 2023-1-9 02:00:47

李恒道 发表于 2023-1-8 20:15
点击了对应元素 window也会切换到相应的firame里
相当于切换了代码的全局作用域位置 ...

现在又报跨域错误了

李恒道 发表于 2023-1-9 09:22:45

bigonion 发表于 2023-1-9 02:00
现在又报跨域错误了

怎么出发的跨域错误

王一之 发表于 2023-1-9 10:09:28

> (forum.php?mod=redirect&goto=findpost&pid=49942&ptid=3984)
> > 现在又报跨域错误了

之前没注意iframe的问题

这个页面好像是有csp策略

!(data/attachment/forum/202301/09/100831cigmboio8g8iim3z.png)

可以试试@match这个iframe页面https://member.bilibili.com/article-text/home

用GM_setValue通信的方式去获取内容?

或者直接在这个页面上写脚本进行操作了,不要@match https://member.bilibili.com/platform/upload/text/edit

@match https://member.bilibili.com/article-text/home
页: [1] 2
查看完整版本: B站专栏的iframe内容获取失败的求助