2016-09-09 3 views
10

У меня есть приложение iOS для публичной библиотеки, которая разделяет ссылки на Facebook. Ссылки указывают на один домен, который содержит относительно простой PHP-скрипт, который перенаправляет на три разных домена назначения на основе связанного контента (элементы каталога, события календаря и созданные пользователем списки). Я настроил это так, потому что я использую универсальные ссылки iOS, и у меня нет контроля над всеми назначениями ссылок, поэтому мне нужно центральное место для файла ассоциации apple-app-site-association.Facebook иногда не извлекает теги Open Graph

В этом 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. Метки тянут в успешно:

enter image description here

Теги не тянули в:

enter image description here

Казалось бы, случайным образом, отображаются ли теги для данного элемента. В журналах доступа на моем сервере, когда успешно отображаются теги, я вижу такую ​​строку:

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)" 

Однако, когда не отображаются метки, нет ничего в журнале доступа или журнал ошибок. Это говорит о том, что Facebook (или компонент Facebook в iOS) даже не пытается прочитать теги в этих случаях. Означает ли это, что Facebook ошибочно полагает, что данные кэшируются?

Еще одна интересная мелочь - это то, что происходит, когда я пытаюсь отладить один из этих неудачных URL-адресов в отладчике обмена Facebook (https://developers.facebook.com/tools/debug/). Я получаю сообщение об ошибке вдоль линий:

The 'og:image' property should be explicitly provided, even if a value can be inferred from other tags. 

И когда я нажимаю «Посмотрите, что наш скребок видит для вашего URL.» Я получаю ответ «Документ не возвращает никаких данных».

Интересно, что когда я нажимаю «Скрести разворот», он обычно дает одну и ту же ошибку в первые несколько раз, затем после 3 или 4 попыток она неожиданно срабатывает и отображаются теги. Моя первая мысль заключается в том, что это связано с тем, как я динамически извлекаю содержимое для тегов, но, как я уже отмечал выше, в тех случаях, когда теги не отображаются, журнал доступа показывает, что Facebook даже не запрашивая что-либо с моего сервера.

Благодарим за помощь; это заставило меня вытащить мои волосы!

UPDATE: Вот пример URL, если вы хотите попробовать его в отладчике Facebook, если вы хотите: https://amshare.acpl.lib.in.us/0_930144011

Числа после подчеркивания является числом OCLC книги, так вы можете подключить к нему другие значения. Как я уже упоминал, после нескольких царапин он обычно начинает работать, потом позже не работает и т. Д.

+0

Является базовым URL (без запроса Params) всегда 'share.php'? Я не уверен, считает ли Facebook приложенные параметры при определении того, что нужно кэшировать, чтобы это могло вызвать эту странность. –

+0

Да, это всегда share.php. Я полагаю, что для каждого типа ресурса (shareItem.php, shareEvent.php) я мог бы использовать другой скрипт, но похоже, что это будет связано с одной и той же основной проблемой. –

+0

Думаю, вам, возможно, придется искать уникальные URL-адреса для каждой ссылки. Если вы посмотрите на сокращенные URL-адреса (Bit.ly, Goo.gl и т. Д.) И другие службы, которые полагаются на отслеживание URL-адресов или динамическую маршрутизацию (HubSpot, HootSuite), они универсально делают это таким образом. В [Branch.io] (https://branch.io) мы почти точно описываем выше, и каждая ссылка всегда имеет уникальный URL-адрес –

ответ

1

Возможно, что facebook кэширует файл share.php и игнорирует GET Vars.

вы можете попытаться переписать URL-адрес на «довольно постоянную ссылку». Поместите это в файл Htaccess (если у вас есть Apache):

Options +FollowSymLinks 
RewriteEngine On 

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

это делает из http://your-url.com/share/4/yeah этого: http://your-url.com/?t=4&id=yeah

в $ _GET вар выглядит следующим образом:

Array ([t] => 4 [id] => yeah) 

С этим вы можете решить эту проблему (если это ДЕЙСТВИТЕЛЬНО кэширование). У меня было много проблем с скребком facebook в прошлом. иногда он игнорирует получение vars, и он кэширует, как ад ...

+0

Я вижу такое же поведение после внесения такого изменения. Кроме того, я бы сказал, что это почти наверняка проблема кэширования. Как я упоминал выше, в тех случаях, когда теги не работают, в журналах доступа абсолютно ничего нет. Поэтому Facebook не запрашивает что-либо с моего сервера в этих случаях. –

+0

Вы пытались добавить метатег og: url с тем же адресом sharer.php? (или переписан, если вы добавили мой фрагмент)? Это говорит FB, чтобы очистить URL-адрес в нем - возможно, это может решить вашу проблему с кешированием? –

+0

Я пробовал это; это приводит к такому же поведению. Когда я рассказываю об этом, чтобы «отскочить снова» на отладчике, кажется, что он абсолютно случайен, работает ли он или нет. –

0

Попробуйте добавить некоторые заголовки в свой ответ, чтобы предотвратить кеширование.

Cache-Control: нет кэша, нет-магазина, нужно обязательно перепроверять Pragma: нет кэша не Expires: 0