Facebook有时无法获取Open Graph标签

Jam*_*rpe 10 php facebook opengraph ios ios-universal-links

我有一个iOS应用程序,用于共享Facebook链接的公共图书馆.链接指向单个域,其中包含一个相对简单的PHP脚本,该脚本根据链接的内容(目录项,日历事件和用户生成的列表)重定向到三个不同的目标域.我有这样的设置,因为我使用的是iOS通用链接,而且我无法控制所有的链接目的地,所以我需要一个apple-app-site-association文件的中心位置.

在这个PHP脚本中,我试图根据共享的内容类型动态设置OG标记.这是脚本:

<?php

$shareType = $_GET['t'];
$contentId = $_GET['id'];

$base_catalog_url='XXXXXXXXXXXX';
$base_list_url='XXXXXXXXXXXXX';
$base_event_url='XXXXXXXXXXXXXX';

if($shareType=='0'){
    $oclc;
    if(strlen($contentId)==8){
        $oclc = 'ocm'.$contentId;
    }

    if(strlen($contentId)==9){
        $oclc = 'ocn'.$contentId;
    }

    $url = $base_catalog_url.'searchCatalog?'.http_build_query(array('clientID' =>'sdIPhoneApp','term1'=>$oclc));
    $resp = simplexml_load_file($url);

    $pageTitle = $resp->HitlistTitleInfo->title;
    $isbn = $resp->HitlistTitleInfo->ISBN;
    $imageURL = 'http://www.syndetics.com/index.aspx?isbn='.$isbn.'/lc.gif&client=XXXXXXX';
    $redirectURL =  'XXXXXXXXXXXX'.$contentId;
    error_log($redirectURL);
    echo '<html>
        <head>
            <meta property="og:image" content="'.$imageURL.'" />
            <meta property="og:title" content="'.$pageTitle.'" />
            <meta name="twitter:card" content="summary" />
            <meta name="twitter:site" content="@acpl" />
            <meta name="twitter:title" content="'.$pageTitle.'" />
            <meta name="twitter:description" content="Allen County Public Library" />
            <meta name="twitter:image" content="'.$imageURL.'" />
            <meta http-equiv="refresh" content="0;URL='.$redirectURL.'">
        </head>
     </html>';
}

if($shareType=='1'){
    $url = $base_event_url.http_build_query(array('eventid' =>$contentId));
        $response = file_get_contents($url);
    $json = json_decode($response);
    $event = $json[0];
    $imageURL = $event->Image;
    $pageTitle = $event->Title;
    $description = $event->Description;

    if(strlen($imageURL)<5){
        $imageURL = 'https://XXXXXXXXX/appIcon200.png';
    }

    $redirectURL = 'XXXXXXXXXXX'.$contentId;

    echo '<html>
        <head>
            <meta property="og:image" content="'.$imageURL.'" />
            <meta property="og:title" content="'.$pageTitle.'" />
            <meta property="og:description" content="'.$description.'" />
            <meta name="twitter:card" content="summary" />
            <meta name="twitter:site" content="@acpl" />
            <meta name="twitter:title" content="'.$pageTitle.'" />
            <meta name="twitter:description" content="'.$description.'" />
            <meta name="twitter:text:description" content="'.$description.'" />
            <meta name="twitter:image" content="'.$imageURL.'" />
            <meta http-equiv="refresh" content="0;URL='.$redirectURL.'">
        </head>
     </html>';

}

if($shareType=='2'){

    $url = $base_list_url.http_build_query(array('listId' =>$contentId,'userKey'=>0));
    $response = file_get_contents($url);
    $json = json_decode($response);
    $imageURL = $json->coverImageURL;
    $pageTitle = $json->listName;
    $pageTitle = ucwords(strtolower($pageTitle));

    $redirectURL = "XXXXXXXXXXXX";

    echo '<html>
        <head>
            <meta property="og:image" content="'.$imageURL.'" />
            <meta property="og:title" content="'.$pageTitle.'" />
            <meta name="twitter:card" content="summary" />
            <meta name="twitter:site" content="@acpl" />
            <meta name="twitter:title" content="'.$pageTitle.'" />
            <meta name="twitter:description" content="Allen County Public Library" />
            <meta name="twitter:image" content="'.$imageURL.'" />
            <meta http-equiv="refresh" content="0;URL='.$redirectURL.'">
        </head>
     </html>';

}

?>
Run Code Online (Sandbox Code Playgroud)

因此,根据共享的内容类型,我获取页面标题和图像以在OG标记中提供.无论Facebook是否拉入标签,重定向始终有效,但标签的使用时间只有一半左右.您可以在iOS应用中看到这一点.标签成功拉入:

在此输入图像描述

标签未插入:

在此输入图像描述

对于给定项目是否显示标签似乎是随机的.在我的服务器上的访问日志中,当标签成功显示时,我看到如下所示的行:

66.220.158.119 - - [09/Sep/2016:09:54:50 -0400] "GET /share.php?t=1&id=76137 HTTP/1.1" 206 3771 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"
Run Code Online (Sandbox Code Playgroud)

但是,如果未显示标记,则访问日志或错误日志中没有任何内容.这表明Facebook(或iOS中的Facebook组件)甚至没有尝试在这些情况下读取标签.这是否意味着Facebook错误地认为它已缓存此数据?

另一个有趣的小问题是当我尝试在Facebook共享调试器(https://developers.facebook.com/tools/debug/)上调试其中一个失败的URL时会发生什么.我会得到一条错误信息:

The 'og:image' property should be explicitly provided, even if a value can be inferred from other tags.
Run Code Online (Sandbox Code Playgroud)

当我点击"查看我们的刮刀看到您的网址时".我收到回复"文件没有返回任何数据".

有趣的是,当我点击"Scrape again"时,它通常会在前几次出现相同的错误,然后经过3或4次尝试后它会突然发挥作用并显示标签.我首先想到的存在,这与我在如何动态撷取的标签内容做的,但正如我上面提到的,在标签不显示的情况下,访问日志显示,Facebook是不是连从我的服务器请求任何东西

谢谢你的帮助; 这让我把头发拉出来!

更新:这里的,如果你想尝试一下在Facebook的调试器,如果你想一个例子网址:https://amshare.acpl.lib.in.us/0_930144011

下划线后面的数字是书的OCLC编号,因此您可以在那里插入其他值.正如我所提到的,经过一些刮擦后,它通常会开始工作,然后再次无法再工作,等等.

小智 1

我可能是 facebook 缓存了 share.php 文件并忽略了 GET Vars。

您可以尝试将 URL 重写为“漂亮的永久链接”。将其放入您的 htaccess 文件中(如果您有 apache):

Options +FollowSymLinks
RewriteEngine On

RewriteRule ^share/(.*)/(.*)$ share.php?t=$1&id=$2 [L,NC]
Run Code Online (Sandbox Code Playgroud)

这使得http://your-url.com/share/4/yeahhttp://your-url.com/?t=4&id=yeah

$_GET 变量看起来像这样:

Array ( [t] => 4 [id] => yeah )
Run Code Online (Sandbox Code Playgroud)

这样你就可以解决这个问题(如果它真的是缓存的话)。我过去在使用 Facebook 抓取工具时遇到了很多问题。有时它会忽略 get vars 并且它会像地狱一样缓存......