使用Facebook Instant Articles操作跟踪器和CSP违规的自定义跟踪代码

时间:2017-02-21 14:44:51

标签: javascript facebook content-security-policy facebook-instant-articles

我创建了一个类似于Google Analytics的脚本(在加载时创建脚本,将数据推送到数组,在托管脚本中使用以将跟踪数据存储在数据库中),以便在Facebook的即时文章中使用,以便我可以跟踪我的软件内部统计数据。但问题是Facebook给出了关于我的脚本的CSP错误:

Refused to load the script 'https://My-Domain.com/js/w_analytics.js' 
because it violates the following Content Security Policy directive: 
"script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com
 *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 
'unsafe-inline' 'unsafe-eval' fbstatic-a.akamaihd.net 
fbcdn-static-b-a.akamaihd.net *.atlassolutions.com blob: data: 'self'".

即时文章标记在预期的代码块中都是正确的:

<figure class="op-tracker">
   <iframe> [code] </iframe>
</figure>

我目前正在通过Facebook的调试页面进行调试: http://ww.ia-tracker.fbsbx.com/instant_article_test?url= <share_url>

奇怪的是,偶尔我会从Instant Article获取一些统计信息到我的数据库,但不是一致或在每个页面视图上。

Facebook文档说您可以直接访问跟踪器,例如:

<figure class="op-tracker">
      <iframe src="http://my-url-tracker.com/">
          <!--
          The request to http://my-url-tracker.com/ will be rewritten to
          include the following query parameters:

          ia_share_url: The URL the user shared
          ia_title: The article title
          -->
      </iframe>
</figure>

但问题是它说它只发送这两个参数,当我自己的跟踪器获取我的软件所需的更多信息(例如UA字符串)时,理想情况下我想避免这种方法。 / p>

是否有其他人有使用自定义跟踪脚本的经验?

1 个答案:

答案 0 :(得分:1)

在对此进行了几天的讨论之后,我使用op-trackeriframe src到我的自定义跟踪脚本来实现它,如下所示:

<figure class="op-tracker">
      <iframe src="http://my-url.com/tracker.php"></iframe>
</figure>

Facebook文档对此方法没有太大帮助,它们省略了一小部分信息:发送了第三个参数,即引用者ia_referrer(返回为ia.facebook.com

然后,您可以在“tracker.php”脚本中使用$_GET$_SERVER的组合来获取脚本所需的任何其他详细信息,例如:

    $instantArticleURL = urldecode($_GET['ia_share_url']);
    $HTTPreferrer = $_GET['ia_referrer'];
    $userAgent = $_SERVER['HTTP_USER_AGENT'];
    $visitorIP = $_SERVER['REMOTE_ADDR'];

您可能还需要在 tracker.php 中加入此header(),以确保Facebook可以访问该脚本(明显地修改它以满足您的网站需求):

header("Access-Control-Allow-Origin: https://www.facebook.com");

希望这可以为其他人节省几天的麻烦:)