そのアプリ/ページの管理者としてログインしている間にFacebookのデバッガーツールにURLを入力することで、ページのキャッシュを強制的に更新できることを知っています: https://developers.facebook.com/tools/debug =
しかし、私が必要とするのは、営業部門の誰かがページの1つのメイン画像を更新するたびにAPIエンドポイントまたは内部アプリから何かを自動的に呼び出す方法です。数千人の営業担当者に管理者としてログインし、アイテムの説明または画像のいずれかを更新するたびにページのキャッシュを手動で更新するように依頼することはできません。
Facebookがキャッシュを更新するまで24時間待つ余裕はありません。これは、クライアントが変更をすぐに表示しない場合、クライアントから毎日苦情が寄せられるためです。
ページメタデータは、頻繁に変更されるようなものではありませんが、 FacebookのDebug Tool に移動して、スクレイピングするURLを入力することにより、手動でキャッシュをクリアできます
これを行うためのAPIもあります。これは すべてのOGオブジェクトに対して機能します :
curl -X POST \
-F "id={object-url OR object-id}" \
-F "scrape=true" \
-F "access_token={your access token}" \
"https://graph.facebook.com"
Access_tokenが必要になりました。これはアプリまたはページaccess_tokenにすることができます。ユーザー認証は不要です。
これをPHPで応答を待つことなくで)したい場合、次の関数がこれを行います:
//Provide a URL in $url to empty the OG cache
function clear_open_graph_cache($url, $token) {
$vars = array('id' => $url, 'scrape' => 'true', 'access_token' => $token);
$body = http_build_query($vars);
$fp = fsockopen('ssl://graph.facebook.com', 443);
fwrite($fp, "POST / HTTP/1.1\r\n");
fwrite($fp, "Host: graph.facebook.com\r\n");
fwrite($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
fwrite($fp, "Content-Length: ".strlen($body)."\r\n");
fwrite($fp, "Connection: close\r\n");
fwrite($fp, "\r\n");
fwrite($fp, $body);
fclose($fp);
}
これは単純なajax実装です。 Facebookですぐにスクレイピングするページにこれを配置します。
var url= "your url here";
$.ajax({
type: 'POST',
url: 'https://graph.facebook.com?id='+url+'&scrape=true',
success: function(data){
console.log(data);
}
});
JavaScript SDKを使用している場合、使用するバージョンは
FB.api('https://graph.facebook.com/', 'post', {
id: [your-updated-or-new-link],
scrape: true
}, function(response) {
//console.log('rescrape!',response);
});
私はたまたま約束が好きなので、jQuery Deferredsを使用する代替バージョンは
function scrapeLink(url){
var masterdfd = $.Deferred();
FB.api('https://graph.facebook.com/', 'post', {
id: [your-updated-or-new-link],
scrape: true
}, function(response) {
if(!response || response.error){
masterdfd.reject(response);
}else{
masterdfd.resolve(response);
}
});
return masterdfd;
}
その後:
scrapeLink([SOME-URL]).done(function(){
//now the link should be scraped/rescraped and ready to use
});
スクレーパーの完了にはさまざまな時間がかかる可能性があるため、スクレーパーが迅速であるという保証はありません。 Facebookがこのメソッドの繰り返しまたは自動化された使用法についてどう考えているかはわかりません。
Curlを使用したDrupalノードの更新内からの代替ソリューションは、次のようになります。
<?php
function your_module_node_postsave($node) {
if($node->type == 'your_type') {
$url = url('node/'.$node->nid,array('absolute' => TRUE));
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://graph.facebook.com/v1.0/?id='. urlencode($url). '&scrape=true');
$auth_header = 'Oauth yOUR-ACCESS-TOKEn';
curl_setopt($ch, CURLOPT_HTTPHEADER, array($auth_header));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$r = curl_exec($ch);
curl_close ($ch);
}
}
標準のDrupalコアがサポートされていないhook_node_postsave()実装に注意してください。 hook_node_update()以来、このFacebookスクレイプピックアップが最後にノードに変更を加えるために、 www.drupal.org/project/hook_post_action を使用する必要がありました。データベースが更新された後はトリガーされません。
これを行うには、Facebookでアクセストークンが必要になりました。トークンを取得するためのガイドラインはここにあります: https://smashballoon.com/custom-facebook-feed/access-token/
Graph API v2.10には変更があります。
まだスクレイプしていないURLに対してGETリクエストを行う場合、og_objectフィールドも省略します。スクレイプをトリガーしてog_objectを設定するには、POST/{url}?scrape = true。を発行します。スクレイピングされると、og_objectはキャッシュされたままになり、今後のすべての読み取り要求で返されます。
2017年10月16日以降、Graph APIのすべてのバージョンでこれらのリクエストにアクセストークンが必要になります。
ソース: Introducing Graph API v2.1
したがって、スクレイピングにはPOSTメソッドを使用する必要があります。
POST /{url}?scrape=true
ない
私は Facebook Object Debugger CLI の著者であり、PHPで記述されたコマンドラインインターフェイスであり、テキストファイルを入力として使用して、単一のURLまたはURLの束のFacebookキャッシュを更新することを目指しています。 package は Packagist でも利用でき、 Composer を使用してインストールできます。
PHP Facebook SDK:
<?php
try {
$params = [
'id' => 'https://www.mysitetoscrape.com/page',
'scrape' => 'true',
];
$response = $fb->post('/', $params);
print_r($response);
} catch(\Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
echo 'Graph returned an error: ' . $e->getMessage();
} catch(\Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
}
?>
Koala gemとFacebook API v2.9を使用した私のRubyソリューション
api = Koala::Facebook::API.new(access_token)
response = api.put_object(nil, nil, {scrape: true, id: "url-of-page-to-scrape"})
response
は、スクレイプされたページのog:
メタタグから取得した属性のハッシュである必要があります。