Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Facebook有时不获取打开的图形标记_Php_Ios_Facebook_Facebook Opengraph_Ios Universal Links - Fatal编程技术网

Php Facebook有时不获取打开的图形标记

Php Facebook有时不获取打开的图形标记,php,ios,facebook,facebook-opengraph,ios-universal-links,Php,Ios,Facebook,Facebook Opengraph,Ios Universal Links,我有一个用于公共图书馆的iOS应用程序,可以共享到Facebook的链接。这些链接指向一个域,其中包含一个相对简单的PHP脚本,该脚本根据链接的内容(目录项、日历事件和用户生成的列表)重定向到三个不同的目标域。我这样设置是因为我使用的是iOS通用链接,我无法控制所有链接目的地,所以我需要一个苹果应用程序站点关联文件的中心位置 在这个PHP脚本中,我试图根据共享内容的类型动态设置OG标记。以下是脚本: <?php $shareType = $_GET['t']; $contentId =

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

在这个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>';

}

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

另一个有趣的消息是,当我尝试在Facebook共享调试器()上调试其中一个失败的URL时会发生什么。我将收到一条错误消息,内容如下:

The 'og:image' property should be explicitly provided, even if a value can be inferred from other tags.
当我点击“查看我们的刮板看到的你的URL”时,我得到的回答是“文档没有返回任何数据”

有趣的是,当我点击“再次刮取”时,它通常会在最初的几次中给出相同的错误,然后在尝试3到4次后,它会突然工作并显示标签。我的第一个想法是,这与我如何动态获取标签的内容有关,但正如我在上文所述,在标签未显示的情况下,访问日志显示Facebook甚至没有向我的服务器请求任何内容

谢谢你的帮助;这让我毛骨悚然

更新:如果您想在Facebook调试器中试用,这里有一个示例URL,如果您想:


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

我可能会认为facebook缓存share.php文件而忽略GET Vars

您可以尝试将URL重写为“pretty permalink”。将其放入htaccess文件(如果您有apache):

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

$\u GET变量如下所示:

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)"
Array ( [t] => 4 [id] => yeah )

有了它,您就可以解决这个问题(如果它真的是缓存的话)。过去,我对facebook刮板有很多问题。有时它会忽略get VAR,并且会像地狱一样缓存…

尝试在响应中添加一些头以防止缓存

缓存控制:没有缓存,没有存储,必须重新验证 Pragma:没有缓存
Expires:0

是否始终是基本URL(不带查询参数)
share.php
?我不确定Facebook在决定缓存什么时是否考虑了附加的参数,所以这可能会导致这种奇怪的现象。我想我可以为每种共享类型(shareItem.php、shareEvent.php)使用不同的脚本,但这似乎会遇到相同的基本问题。我认为您可能需要为每个链接使用唯一的URL。如果你看看URL缩短器(Bit.ly、Goo.gl等)和其他依赖于每个URL跟踪或动态路由的服务(HubSpot、HootSuite),它们通常都是这样做的。目前,我们几乎完全按照您上面描述的那样做,并且每个链接总是带有一个唯一的URL。如果我这样做,那么我就不能使用通用链接。应该仍然能够。只需将所有唯一的URL放在一个目录下(例如,
/share/7ahAs7D
),然后为该目录中的所有内容启用通用链接。进行此更改后,我看到了相同的行为。另外,我想说这几乎肯定是某种缓存问题。正如我前面提到的,在标签不起作用的情况下,访问日志中绝对没有任何内容。因此,在这些情况下,Facebook不会向我的服务器请求任何内容。您是否尝试使用extacly相同的sharr.php url添加og:url元标记?(或者重写,如果你插入了我的代码片段)?它告诉FB抓取其中的url-可能它可以解决你的缓存问题?我试过这个;它会导致相同的行为。当我告诉它在调试器上“再刮一次”时,它是否工作似乎完全是随机的。你能发布共享的url吗?这样我就可以测试自己发生了什么?下划线后面的数字是书的OCLC号,因此你可以尝试在那里插入其他值。正如我提到的,经过几次刮伤后,它通常开始工作,然后又无法工作,等等。
Array ( [t] => 4 [id] => yeah )