Chrome 扩展程序和 gmail.js 阻止访问 google api

Posted

技术标签:

【中文标题】Chrome 扩展程序和 gmail.js 阻止访问 google api【英文标题】:Chrome Extension and gmail.js blocking access to google api 【发布时间】:2020-04-14 10:43:55 【问题描述】:

我只是在玩基于本教程 https://cloud.google.com/blog/products/gcp/deepbreath-preventing-angry-emails-with-machine-learning 的 chrome 扩展。

当我出于某种原因使用扩展程序时,我无法使用 gmail.js https://github.com/josteink/gmailjs-node-boilerplate 获取草稿电子邮件的正文。

使用 gmail.js 样板文件,

    "use strict";

console.log("Extension loading...");
const jQuery = require("jquery");
const $ = jQuery;
const GmailFactory = require("gmail-js");
const gmail = new GmailFactory.Gmail($);
window.gmail = gmail;




/*
This code uses the Gmail library to observe emails being sent, turn them into XML,
then return a json data, body, which is put into the request and parsed with ML.
*/

gmail.observe.on("load", () => 
  const userEmail = gmail.get.user_email();
  console.log("Hello, " + userEmail + ". This is your Rhea talking with a new version better loading!!");

  gmail.observe.on("view_email", (domEmail) => 
    console.log("Looking at email:", domEmail);
    const emailData = gmail.new.get.email_data(domEmail);
    console.log("Email data:", emailData);
  );


//var main = function () 

  gmail.observe.on('save_draft', function (id, url, body, xhr) 

    var draftId = url['permmsgid'];

    console.log("draft saved" + draftId)

  );

);
    //

前两个控制台日志工作正常,因此不确定处理此问题的最佳方法。

提前致谢:)

【问题讨论】:

你能发布一个工作存储库吗?您提供的 repo 甚至不起作用...您在使用之前更新了一些东西吗? 【参考方案1】:

不幸的是,save_draft 观察者似乎在"New Gmail" was introduced in 2018 之后不再触发。我自己加载了您的扩展程序并确认,虽然view_email 事件仍在按预期触发,但save_draft 不是。 Gmail.js 的开发人员confirmed in a recent issue report 表示另一个事件send_email 与当前版本的Gmail 存在相同的问题。所以看起来这个脚本不像以前那么好用了。

如果您仍想使其正常工作,有以下几种选择:

找到一个备用的 Gmail.js 事件来代替仍在工作的 save_draft 使用其他一些事件处理程序获取div.editable 的内容,例如javascript 的标准onkeypress 卷起袖子,使用 Gmail.js 插件调试问题,如果可以找到修复程序,请向其开发人员发送拉取请求

编辑:这是一个使用标准 JS 事件 keydownclick 以及等待该字段出现的突变观察者的工作解决方案:

"use strict";

console.log("Extension loading...");
const jQuery = require("jquery");
const $ = jQuery;
const GmailFactory = require("gmail-js");
const gmail = new GmailFactory.Gmail($);
window.gmail = gmail;

function logInnerText(e) 
  console.log("New Email Body Text is: " + e.currentTarget.innerText);


gmail.observe.on("load", () => 
  const userEmail = gmail.get.user_email();
  console.log("Hello, " + userEmail + ". This is your extension talking!");

  gmail.observe.on("view_email", domEmail => 
    console.log("Looking at email:", domEmail);
    const emailData = gmail.new.get.email_data(domEmail);
    console.log("Email data:", emailData);
  );

  var observer = new MutationObserver(function(mutations) 
    let messageBodyField = document.querySelector("div.editable");
    if (
      messageBodyField &&
      !messageBodyField.getAttribute("data-found-by-my-extension")
    ) 
      messageBodyField.setAttribute("data-found-by-my-extension", true);
      messageBodyField.addEventListener("keydown", logInnerText);
      messageBodyField.addEventListener("click", logInnerText);
    
  );

  observer.observe(document.body,  childList: true, subtree: true );
);

如果您遇到任何性能问题,您可以在检查该框是否存在时尝试在比document.body 更低级别的标签中搜索。如果您想进一步解释其中的任何内容,请告诉我。

【讨论】:

谢谢伙计。优秀作品!使用 javascripts onkeypress - 是否有任何关于使用该解决方案的文档? 很高兴这对你有用!仅供参考-如果您想向我发送赏金,则必须手动进行。否则 12 小时后我只能得到一半,另一半会被丢弃。 :) @MichaelHolborn from meta.stackexchange.com/a/16067 :可以在赏金开始后 24 小时授予赏金。您可以将赏金奖励给其他任何人发布的任何答案,甚至是已经获得一个或多个奖励(包括您)的答案。要手动奖励赏金,请点击您想要奖励的答案左侧的 +50(或分配的任何赏金金额)按钮。 看起来你想通了。谢谢! 很快会提出更多问题!可悲的是,当我现在将其发送到 API 时出现错误 :( 超级奇怪!

以上是关于Chrome 扩展程序和 gmail.js 阻止访问 google api的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用Google Chrome扩展程序阻止警报()

idm chrome扩展被阻止解决办法

SwiftUI:如何将内容阻止程序应用于 chrome?

这还是Chrome和Firefox吗?阻止卸载劫持浏览器

Ajax 调用在 HTTPS 上被阻止 - Chrome 扩展

Chrome 扩展:阻止来自外部域的内容被加载到特定域的页面中