У меня есть приложение 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. Метки тянут в успешно:
Теги не тянули в:
Казалось бы, случайным образом, отображаются ли теги для данного элемента. В журналах доступа на моем сервере, когда успешно отображаются теги, я вижу такую строку:
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 книги, так вы можете подключить к нему другие значения. Как я уже упоминал, после нескольких царапин он обычно начинает работать, потом позже не работает и т. Д.
Является базовым URL (без запроса Params) всегда 'share.php'? Я не уверен, считает ли Facebook приложенные параметры при определении того, что нужно кэшировать, чтобы это могло вызвать эту странность. –
Да, это всегда share.php. Я полагаю, что для каждого типа ресурса (shareItem.php, shareEvent.php) я мог бы использовать другой скрипт, но похоже, что это будет связано с одной и той же основной проблемой. –
Думаю, вам, возможно, придется искать уникальные URL-адреса для каждой ссылки. Если вы посмотрите на сокращенные URL-адреса (Bit.ly, Goo.gl и т. Д.) И другие службы, которые полагаются на отслеживание URL-адресов или динамическую маршрутизацию (HubSpot, HootSuite), они универсально делают это таким образом. В [Branch.io] (https://branch.io) мы почти точно описываем выше, и каждая ссылка всегда имеет уникальный URL-адрес –