Facebook иногда не получает теги Open Graph

У меня есть приложение для 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>';

}

?>

Итак, в зависимости от типа контента, который был предоставлен, я выбираю заголовок страницы и изображение для предоставления в тегах 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)"

Однако, когда теги не отображаются, в журнале доступа или журнале ошибок ничего нет. Это говорит о том, что 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 даже не запрашивая что-нибудь с моего сервера.

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

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

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

10

Решение

Вполне возможно, что 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 var выглядит так:

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

С этим вы можете решить эту проблему (если это действительно кэширование). У меня было много проблем с шабером Facebook в прошлом. иногда он игнорирует get vars и кеширует как ад …

1

Другие решения

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

Cache-Control: без кеша, без хранилища, обязательно повторная проверка
Прагма: без кеша
Истекает: 0

0

По вопросам рекламы [email protected]