Facebook喜欢按钮返回不正确的查询参数

时间:2013-05-15 23:19:11

标签: ruby-on-rails facebook

大家好,我已经搜索了这些问题,但未能找到答案。我已经走到了尽头,我的公司分析团队开始担心他们收集的跟踪数据。

我们目前使用sitecatalysts广告系列代码来跟踪和收集网站上的数据。有一个非常小的足迹查询参数,随机放置在整个站点的链接上。

例如:?cmp=23-42

查询已正确附加到共享按钮,并且我可以告知正在传递表单提交。从检查页面上的iframe,我在隐藏的表单字段中看到以下值。

<input type="hidden" autocomplete="off" name="href" value="http://my-site.com/some-post-or-article-name?cmp=23-42">

发布后发送的标题。使用chrome dev工具。

fb_dtsg:AQCabg9S
href:http://my-site.com/some-post-or-article-name?cmp=23-42
ref:
nobootload:
action:like
comment_text:test posts
comment:test posts
__user:181...
__a:1
__dyn:7w
__req:7
phstamp:165816797981035783273

在我发布了类似内容以及我想要的任何评论后,我打开Facebook并点击我刚刚发布的链接。我将我的唯一跟踪查询替换为facebook查询参数。

http://my-site.com/some-post-or-article-name?fb_action_ids=4184...&fb_action_types=og.likes&fb_source=aggregation&fb_aggregation_id=2883...

对于我们列出的目前位于60k范围内的每篇文章和事件都会发生这种情况,这就是我的问题所在。所以我的问题是......

Facebook文档中是否提到了我缺少的内容,例如在我的fbml标记中添加一个看起来像query="cmp=23-42&more_stuff=more-custom-stuff"的属性?因此,添加时我的唯一查询参数可以自动附加到facebook查询参数的末尾。

有没有人遇到过这个问题,你是怎么解决的?

如果我无法使用自定义跟踪,是否有任何有创意但非hacky方式将返回的fb_action_ids或fb_aggregation_id与自定义广告系列代码相关联?

有解决方法吗?

有关我可以分享的网络应用的更多信息。 平台:RoR(我愿意使用可以解决这个问题的宝石,如果有的话)

1 个答案:

答案 0 :(得分:0)

ref选项允许用户将自定义数据附加到位于fb_ref参数中的返回查询字符串。

在这里找到 https://developers.facebook.com/docs/reference/plugins/like/

不幸的是,对于视觉催化剂标签,这不是很有用,因为处理数据报告的脚本会自动通过onload方法在网址中查找广告系列代码。这是我用来从fb_ref param中提取值的一些有用的js。根据需要随意修改。

facebookCustomQueryString: function(){
 if( window.location.href.indexOf( 'fb_ref=' ) == -1 ) return;
 var location = window.location.href,
     params = location.split('?').pop().split('&'),
     refCode, iframe, container;

 for(var i=0, m=params.length; i<m; i++){
  if( params[i].indexOf('fb_ref') > -1 ){
    var ref = params[i];
    refCode = ref.replace('fb_ref=','');
    break;
  }
 }
}

解释::

  1. 如果fb_ref=不在网址中,则第一个条件会退出该功能

  2. 接下来设置一些局部变量(我不想继续写window.location,所以我也抓了它)

  3. 遍历params数组,找到我的匹配并删除[key]。将值存储到refCode变量中。

  4. 这就是获得价值所需的一切。我确信有更优雅的解决方案,但这个脚本在jQuery加载之前就已经运行了。

    如果您处于我的位置并且仍然需要触发站点催化剂代码或您使用的任何内容的跟踪,请将以下内容添加到上述方法中。这将在页面上创建一个iframe,并将其源设置为基本URL以及您最初需要返回的任何自定义查询。

    iframe = document.createElement('iframe');
    iframe.setAttribute('class',''); // I added absolute positioning -9999px left/top .01em height/width
    iframe.setAttribute('id',''+Math.random()); // any random id name here optional for some browsers
    iframe.setAttribute('src',location.split('?').shift()+'?'+refCode);
    iframe.setAttribute('onload', 'foo.remove(this)' ); // added the onload function to remove the iframe, reporting should be done by this time. Make sure your method foo.remove() is accessible in the DOM 
    
    container = document.createElement('div'); // create a container to hold the iframe, optional, depends on your site markup
    container.setAttribute('id',''+Math.random()); // another random id
    document.getElementsByTagName('body')[0].appendChild(container); // add the container to the body
    container.appendChild(iframe); // add the iframe to the container
    

    最后,我的删除方法..再次根据需要随意填写修改。

    remove: function(ui){
     ui.parentNode.innerHTML = '';
     ui.remove(ui.selectedIndex);
    }
    

    对于IE浏览器,您可能需要稍微修改remove方法。我还没有测试过这些,但你可以试试

    remove: function(ui){
     ui.parentElement.removeChild(ui);
      // or
     var parent = ui.parentElement;
     parent.removeNode(true);
    }
    

    我希望这对我所处的任何人都有帮助......