У меня есть приложение 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>';
}
?>
Итак, в зависимости от типа контента, которым поделились, я выбираю заголовок страницы и изображение для добавления в теги 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
Число после подчеркивания — это номер OCLC книги, поэтому вы можете вставить туда другие значения. Как я уже упоминал, после нескольких царапин он обычно начинает работать, затем снова не работает и т. д.
share.php
? Я не уверен, учитывает ли Facebook добавленные параметры при определении того, что кэшировать, так что это может быть причиной этой странности. - person Alex Bauer   schedule 09.09.2016/share/7ahAs7D
), а затем включите универсальные ссылки для всего в этом каталоге. - person Alex Bauer   schedule 09.09.2016