У меня есть приложение iOS для публичной библиотеки, которая разделяет ссылки на Facebook. Ссылки указывают на один домен, который содержит относительно простой PHP script, который перенаправляет на три разных целевых домена на основе связанного контента (элементы каталога, события календаря и созданные пользователем списки). Я настроил это так, потому что я использую универсальные ссылки iOS, и у меня нет контроля над всеми назначениями ссылок, поэтому мне нужно центральное место для файла ассоциации apple-app-site-association.
В этом PHP script я пытаюсь установить теги OG динамически в зависимости от типа контента, который был общим. Здесь script:
<?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". Я получаю ответ "Документ не возвращает никаких данных".
Интересно, что когда я нажимаю "Scrape again", он обычно дает ту же ошибку в первые несколько раз, затем после 3 или 4 попыток он неожиданно срабатывает и отображаются теги. Моя первая мысль заключается в том, что это связано с тем, как я динамически извлекаю содержимое для тегов, но, как я уже отмечал выше, в тех случаях, когда теги не отображаются, журнал доступа показывает, что Facebook даже не запрашивая что-либо с моего сервера.
Спасибо за вашу помощь; это заставило меня вытащить мои волосы!
ОБНОВЛЕНИЕ: Вот пример URL-адреса, если вы хотите попробовать его в отладчике Facebook, если хотите: <а3 >
Число после подчеркивания - это номер OCLC в книге, поэтому вы можете подключить к нему другие значения. Как я уже упоминал, после нескольких царапин он обычно начинает работать, потом позже не работает и т.д.