先月、 このブログ上の記事 で、 サイトの常時https(SSL)化後も Facebookいいね!数 を引き継ぐ方法をご紹介しました。
今回は、その番外編です。
発端は、前回の方法でいいね!数を引き継いだつもりが、一部のページで いいね!数がゼロのままだったページが見つかったことです。
og:urlも問題ない、リダイレクト設定も問題ない、あれ〜おかしいなぁ...。
原因は、 (悪名高い!?) Facebook側のキャッシュ でした。
調査の過程で Facebookのシェアデバッガーを通したところ いいね!数が正常値に戻ったことで判明しました。
今回は対象ページが数百ページあったものですから、Facebookのキャッシュを一気にクリアする方法について調べてみました。
Facebookのキャッシュがクリアされるタイミングは、公式ドキュメントに書かれています。
【情報源】facebook for developers
ドキュメント/シェア機能/Open Graph story/オブジェクトの使用
https://developers.facebook.com/docs/sharing/opengraph/using-objects
オブジェクトの更新
Facebookクローラーは、次の場合にオブジェクトを再スクレイピング(すなわち更新)します。・ オブジェクトURLがオブジェクトデバッガーに入力されたとき
・ 最初のスクレイピングから30日ごと
・ アプリがAPIエンドポイントを使用してスクレイピングをトリガーしたとき
要は上で私がやったように手動で1ページずつデバッガーにURLを打ち込むか、じっと30日待つか、
あるいはAPIエンドポイントを叩くか、この3つです。
大量のURLを一気に処理するには3つめの方法を使います。
このGraph APIエンドポイントは、以下を呼び出します。
POST /?id={object-instance-id or object-url}&scrape=true
このエンドポイントからの応答は、スクレイピングされたオブジェクトについてのすべての情報を含んだJSONオブジェクトとなります
(Graph APIからオブジェクトIDが読み取られた時に返されるデータと同じ)。
idパラメータは、オブジェクトの正規URLか、グラフ内のオブジェクトインスタンスIDのいずれかになります。
読んでも「デ、何ヲスレバイインデスカ〜(?_?)」って感じだったので、 @ko31 さんの記事を参考にさせていただきました。
【参考】 http://blog.ko31.com/201411/facebook-ogp-cache/#i-3
具体的には、各URLについて次のようなリクエストを行います(curlコマンドを使う例)。
$ curl -d scrape=true -d id=【対象ページURL】 https://graph.facebook.com/
ここまでわかればやることは簡単で、
を行えば、一気にクリアできそうです。
今回 問題になったサイトはMovable Typeで生成していたので、 URLの一覧は、MTテンプレートを書いてお手軽に出力することにしました。
<!-- URLを1行ずつ列挙したファイルを出力 -->
<mt:Entries lastn="0">
<mt:EntryPermalink />
</mt:Entries>
このファイルを次のスクリプトに食わせればOKです。 Linuxのbashで動作します。
for url in `cat ファイル名`; do curl -s -d scrape=true -d "id=$url" https://graph.facebook.com/ >/dev/null 2>&1 sleep 1 done
同じようなケースでお困りの場合は、ぜひご活用ください。