用户在 Facebook 上的持久标记?

Posted

技术标签:

【中文标题】用户在 Facebook 上的持久标记?【英文标题】:Persistent flag that user is on facebook? 【发布时间】:2012-02-02 14:34:52 【问题描述】:

我正在为我们的主要电子商务网站设计一个移动网站。因为该站点由不灵活的遗留代码组成,所以我选择查找用户用户代理字符串并将其识别为每个页面请求的移动用户。这样就不需要更改 url 结构。到目前为止,这似乎运行良好。

但是,我认为使用这个移动版本可能有点酷,这样用户就可以通过 iframe 在 facebook 上浏览我们的电子商务网站(尺寸完美)。但是,与移动浏览器不同,我很难找到一种持久的方法来将用户识别为 facebook 用户。我知道 facebook 第一次通过 iframe 查看页面时会发送一个 $_POST 变量,我可以简单地将其存储在会话变量中并完成它。但是出现的问题是,如果用户访问 facebook,在他们的会话中被标记为 facebook 用户,然后访问我们的常规电子商务网站怎么办?好吧,他们仍然会被识别为 facebook 用户并获得 facebook 版本,这并不理想。

【问题讨论】:

【参考方案1】:

也许你可以换个角度解决这个问题,测试一下网站是否是从框架加载的?

这可以通过 javascript 实现:

if (top === self)  
   //not a frame 
 else  
   //a frame 

【讨论】:

是的,这可能有效,初始页面加载可以接收 facebook $_POST var,这将告诉我通过移动网站设计加载它。之后,一个 ajax 脚本可以运行每个页面请求,发送一个仍然来自 facebook 的标志。但是,这仍然会导致识别滞后一页,因此最好在实际页面加载之前发送该标志,例如服务器端,但我认为这是不可能的。但这是迄今为止我见过的最好的想法,我将研究使用方法,尽管仍然对其他想法持开放态度。【参考方案2】:

不确定回答我自己的问题是否合适,但我找到了一个由 Hassou 的答案和 javascript php 检测脚本组合而成的答案。

我修改的脚本来自这里: http://snippets.bluejon.co.uk/check4-js-and-cookies/check4-js-enabled-v2-phpcode.php

本质上,这个想法是使用 javascript 提交一个引用当前 url 的表单,结果会告诉您是否启用了 javascript...但是,这个想法可以很容易地更改为仅当 javascript 返回 true 时才提交表单一个 iframe。然后,您可以将 $_POST 数据传递到表单中,以便继承 $_POST 数据(仅当在应用程序的显示层中引用了 $_POST 数据时才需要)。基本思路如下:

<?php
/* Include head of your application goes here, this should do whatever
session handling code you have and all processing done to the $_POST variables */

// ~~~~~~Full Url Function - Works With Mod_Rewrite~~~~~~~~~ //
// important thing is function will grab all $_GET vars
function fullurlnav()

$fullurlsortnav = 'http';
$script_name = '';
  if(isset($_SERVER['REQUEST_URI']))
  
  $script_name = $_SERVER['REQUEST_URI'];
  
  else
  
  $script_name = $_SERVER['PHP_SELF'];
    if($_SERVER['QUERY_STRING']>' ')
    
    $script_name .=  '?'.$_SERVER['QUERY_STRING'];
    
  

  if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on')
  
  $fullurlsortnav .=  's';
  

$fullurlsortnav .=  '://';

  if($_SERVER['SERVER_PORT']!='80')
  
  $fullurlsortnav .=
  $_SERVER['HTTP_HOST'].':'.$_SERVER['SERVER_PORT'].$script_name;
  
  else
  
  $fullurlsortnav .=  $_SERVER['HTTP_HOST'].$script_name;
  

return $fullurlsortnav;

// ~~~~~~~~~~~End Full URL Function~~~~~~~~~ //
?>
<html>
<body>
<?php
// Only run this check if user has been identified as a facebook user in their session
// or if they've been identified via the $_POST['signed_request'], which facebook sends
// upon first request via iframe.
// Doing this removes the check when it's unneeded.
if (!isset($_POST['inIframe']) && ( isset($_SESSION['inIframe']) || isset($_POST['signed_request']) ) )
   
?>
    <form name="postJs" action="<?php echo fullurlnav(); ?>" method="post">
    <input type="hidden" name="inIframe" value="1">
    <?php
    // Carry over $_POST
    foreach($_POST as $key => $value)
    
    echo '<input type="hidden" value="'.$value.'" name="'.$key.'" />';
    
    ?>
    </form>
    <script type="text/javascript">
            <!--
          // If in an iframe
          if (top !== self)
          
          document.postJs.submit();
          
        //-->
    </script>
  <?php

elseif(isset($_POST['inIframe']) && ( isset($_SESSION['inIframe']) || isset($_POST['signed_request']) ) )

$_SESSION['inIframe']=1;

else

$_SESSION['inIframe']=0;


if ($_SESSION['inIframe']== 1)
echo 'IS in an Iframe';
else
echo 'IS NOT in an Iframe';


// echo out rest of your template code
?>
</body>
</html>

在页面显示代码输出和它的工作原理上有点棘手,但这是我到目前为止的基本想法。从技术上讲,可以将表单生成块与下面的 elseif else 语句分开,并在任何显示输出之前使用代码上方的那些,这可能更容易处理。请注意,上面的代码未经测试,只是为有相同问题的其他人提供基本思路。

【讨论】:

回答你自己的问题没有错,表明你学到了一些东西并愿意分享给可能有同样问题的其他人。

以上是关于用户在 Facebook 上的持久标记?的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 应用程序标签页面照片

Facebook 登录“异常抛出”错误通过 iOS 上的 React Native

Facebook SDK 与文本共享图像

适用于 iOS 的 Facebook 开放图?

iOS:通过自动登录获取 Facebook 访问令牌

Facebook 个人资料访客图表 API