javascript - Google Apps 脚本在 Javascript 中获取 iFrame 的父 URL

标签 javascript google-apps-script iframe cross-domain-policy google-sites-2016

我搜索了很多论坛,并且非常有信心这将是一个不,但我想我会向社区开放以防万一;)

我的任务是在我们的 Google 协作平台页面上创建一个工具,用于记录员工访问页面后的访问时间。它有助于确认文档访问和事件日志的合规性。如果 iFrame 与其托管的页面位于同一个域中,则从框架内查询父页面的 URL 相当容易,但安全限制限制了跨域或子域。

我希望我将 Google 应用程序脚本嵌入到 Google 网站页面这一事实会给我提供更多选择。到目前为止,我已经尝试了命令 document.referrer , 父文件位置 , parent.window.document.location , 父窗口位置 , parent.document.location.href ,以及来自窗口和文档透视图的相同命令。他们的 react 都是一样的:

  https://n-labp6vtqrpsdn12345neycmicqw7krolscvdkda-0lu-script.googleusercontent.com/userCodeAppPanel

当我想要:
 https://sites.google.com/mysite.com/mysite/test/test3

有没有谷歌老手有额外的技巧?

编辑:我刚刚尝试通过 html 链接传递变量,即 Google 站点上应用程序脚本的 Google 图像占位符,并获得了一点点更远。你看,我可以运行这个网址:https://script.google.com/a/macros/coordinationcentric.com/s/AKfycbxDX2OLs4LV3EWmo7F9KuSFRljMcvYz6dF0Nm0A2Q/exec?test=hello&test2=howareyou如果我在单独的窗口中运行 url,则获取变量 test1 和 test2。如果我尝试将该 URL 嵌入到 Google 协作平台上的 HTML 页面中,则会引发以下混合内容错误:
  trog_edit__en.js:1544 Mixed Content: The page at 
 'https://sites.google.com/a/mysite.com/mysite/test/test3' was loaded over HTTPS, but requested an insecure image 'http://www.google.com/chart?chc=sites&cht=d&chdp=sites&chl=%5B%5BGoogle+Apps+Script%27%3D20%27f%5Cv%27a%5C%3D0%2710%27%3D499%270%27dim%27%5Cbox1%27b%5CF6F6F6%27fC%5CF6F6F6%27eC%5C0%27sk%27%5C%5B%22Apps+Script+Gadget%22%27%5D%27a%5CV%5C%3D12%27f%5C%5DV%5Cta%5C%3D10%27%3D0%27%3D500%27%3D197%27dim%27%5C%3D10%27%3D10%27%3D500%27%3D197%27vdim%27%5Cbox1%27b%5Cva%5CF6F6F6%27fC%5CC8C8C8%27eC%5C%27a%5C%5Do%5CLauto%27f%5C&sig=TbGPi2pnqyuhJ_BfSq_CO5U6FOI'. This content should also be served over HTTPS.

也许有人尝试过这种方法?

最佳答案

简而言之 - 我知道无法从 Google 协作平台中的 iFrame 调查父 URL。

iframes/嵌入式内容的内容托管在所有地方,与网站本身分开。同源规则会阻止您发现的检查。

您的第一个 URL“https://n-labp...googleusercontent.com ...”是脚本本身所在的位置。脚本的任何输出(如 HTML)似乎都来自这里。

您可以使用嵌入功能将 HTML 和 javascript 直接嵌入到站点中。如果您对此进行调查,您会发现它托管在“https://1457130292-atari-embeds.googleusercontent.com ...”之类的地方

调用 parent 将始终给出这个基于 *-atari 的 URL,而不是它所在的实际页面。

一个相当轻量级的解决方案是使用两者的组合。
使用简单的 doGet ping 并在您的 Apps 脚本中处理工作。

在您的站点上,使用嵌入功能插入:

<!DOCTYPE html>
<html>
<body onbeforeunload="return depart()">
<script>
var page = "testpage"; // manually set a name for each page you paste this code in to
var script = "https://script.google.com/macros/s/... your script, ending with exec ...";

fetch(script+"?page="+page+"&direction=arrive");

function depart(){
fetch(script+"?page="+page+"&direction=depart");
}
</script>
</body>
</html>

然后在您的 Apps 脚本中:
function doGet(e){
var httpParams = e.parameter ? e.parameter : "";
// params is an object like {"page": "testpage1", "n": "1"}
var getPage = httpParams.page ? httpParams.page : "";
var getDirection = httpParams.direction ? httpParams.direction : "";

/* Handle it as you please, perhaps like: */

var user = Session.getActiveUser().getEmail();
/* maybe use a temporary active key if open to non-Google users */
/* first-time Google users will have to authenticate, so embed one frame somewhere full-size maybe, or just tell users to go to the script's link */

/* hand off to a helper script */
var time = new Date();
var timeUTC = time.toUTCString(); // I like UTC
doSomethingWithThis(user, direction, timeUTC);
/* etc... */

/* Return some blank HTML so it doesn't look too funny */
return HtmlService.createHtmlOutput("<html><body></body></html>");
}

然后发布为 Web 应用程序。如果您将使用临时事件 key 而不是 Google 帐户,您将让脚本像您一样运行,并且任何人都可以使用,甚至是匿名的。

您可能已经解决了这个问题,但我希望它对偶然发现它的其他人有用!

关于javascript - Google Apps 脚本在 Javascript 中获取 iFrame 的父 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46818753/

相关文章:

javascript - jQuery(文档).on ('click.classname' ......)?

javascript - 如何从包含多个 URL 的字符串中正确隔离和存储 Google 文件 ID?

javascript - Google-Sheets - 根据单元格值打破循环

javascript - 简单的 JavaScript 问题

jquery - Fancybox:加载 iframe 内容时显示加载动画

javascript - html5 从 Canvas 中删除

javascript - mongodb打印没有空格的json,即不漂亮的json

google-apps-script - 如何查找工作表是否为空?

facebook - Facebook 上 iframe 中的 Youtube - Z-index 问题

javascript - 根据单选按钮值创建输入文本框