我目前正在为gmail开发一个Chrome扩展。我想在用户从那里打开电子邮件和grub发件人的电子邮件地址时触发一些操作。所以我想出的想法是通过原型拦截XMLHttpRequest.send
,如果这个请求包含电子邮件数据,然后从那里触发我的事件。但Gmail不发送任何休息请求,并使用the dark force获取电子邮件的正文。我真的陷入了疑问,Google如何将电子邮件正文和其他数据转到页面。我的意思是新的数据可以出现在页面的唯一方法是通过rest
:gmail如何将数据提取到页面
- 表单提交
- 的XMLHttpRequest
- 的WebSockets
所有这些都可以通过dev-tools
进行检查。因此,我创建了一个片段,将DOMSubtreeModified
听众添加到document
的top
。在侦听器中,我使用xpath查询正在打开的电子邮件数据。
E.g.我想找到gmail如何获取电子邮件A
的数据。我知道这封电子邮件包含一些特定的文字,如random text r2d2
。所以我只需在我的监听器中检查文档是否包含现在具有innerText random text r2d2
的节点。后面我会检查Network
选项卡的请求,这些请求是在点击打开的电子邮件按钮和在页面上显示新文本之间发送的。 Here's the video to understand what I'm talking about.
function findEleWithText(text) {
let parent = document.body;
let results = [];
let query = document.evaluate("//*[contains(text()," + text + "')]",
parent || document,
null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for (let i=0, length=query.snapshotLength; i<length; ++i) {
results.push(query.snapshotItem(i));
}
return results;
}
document.addEventListener('DOMSubtreeModified', e => {
var e2 = findEleWithText("2:09 p.m.", document.body)
if (e2.length > 0) {
console.log('e');
}
})
但这里的问题,电子邮件数据显示在页面中,但Network
标签表明,没有要求被做了。数据如何进入页面?我的意思是即使从iframe发出请求,它也会在Networks
中显示。我还检查了谷歌是否打开websocket(ws数据未显示到Networks
) - 但它不是!
任何想法?有没有办法获取数据而不是REST?