よしまさのウェブサイト

ブログとFacebookを連携してみた

ブログカテゴリー
システムやプログラムのメモ・雑感
投稿日時

久々のブログ投稿。
先月末でプロジェクトが一段落したので、前々から試してみたかったFacebookとブログの連携について色々試してみた。
エンジニアには割と有名な話と思うけど、2018年8月からFacebook APIはニュースフィードの自動投稿を禁止した。
それ以前にはTwitterからの自動投稿がFacebookに溢れていたけど、最近全く見なくなったのはそれが理由。
その良し悪しはともかくとして、これを機に世界中のブログサービスなどがサービスを大きく変更するに至った。
この機能を前提にしていた顧客などは依頼主に対して、「自動連係が動かなくなったんだが!?」というクレームをするというケースは世界各地で発生しただろう。
エンジニア的には「そうは言われましても、Facebookの仕様で無理になったわけで・・・・・」と答えたいところだけど、依頼主が「システム開発にコストかけたんだぞ!」とブチ切れる気持ちも分かる。
下手したらクレーム問題にもなりかねない話だ。
しかし、そうは言われてもFacebookの仕様が変わったからにはどうしようもないわけで、お役所様のように「決まりですので」「もう決まってしまったことですので」と返すしかない。
「何てことしてくれたんだ、Facebookは!」というのは数多くのエンジニアの怨嗟の叫びだろう。

僕もその一人である。
しかし、力なき僕にもわずかばかりの良心だけは残されている。
何も代替策や提案を示さず、「無理です」と突っぱねて顧客が与えてくれた開発コストを当然のごとくに亡き者にするのは、さすがに心が痛む。
まぁ、そういうわけでずっと心の中で「何か代替策はないかなぁ、実験したいなぁ」と思っていたけど、なかなかその機会がなかった。
そう思いつつ、もう一年以上。
ついに実験する時間があったので、簡単に試してみた結果をまとめてみる。

大きく分けると、Facebookとウェブを連携する方法は私が考える限りで以下の2つがある。

  1. Facebook Graph APIを使う方法
  2. ウェブサイトをシェアする形で投稿する

昨年の仕様変更で使えなくなったのは1の方。
それぞれ個別に検討していく。

Facebook Graph APIを使う方法

結論から言うと、以下の機能に限定される。

  • Facebookページ:自動投稿可能
  • Facebookグループ:自動投稿可能
  • 個人のニュースフィード:自動投稿不可能

以下のページのマニュアルを見ると、「publish_pages」と「manage_pages」という権限を取得すれば何だか投稿できる気がする。
https://developers.facebook.com/docs/pages/publishing/
ただ、「publish_pages」と「manage_pages」はFacebookページに限定されるらしくて、個人のニュースフィードに投稿できるわけではない。
グループへの投稿の場合は「publish_to_groups」という権限があればいいが、別にこれがあったからといって個人のニュースフィードに投稿できるわけではない。

また「user_posts」という権限があるからこっちで何とかできないかと思ったけど、それも無理らしい。
一応「user_posts」を使えばFacebookで投稿されたニュースフィードの一覧は取得できる。
ただしできることは取得のみであり、投稿は無理らしい。
以下のURLのマニュアルにも「アプリユーザーがFacebookにコンテンツをシェアできるようにするため、製品のシェアを代わりに使用することをおすすめします」とご丁寧に書いてくれている。
https://developers.facebook.com/docs/graph-api/reference/v5.0/user/feed

現時点の仕様ではどうやっても個人のニュースフィードにAPIを通じて投稿を行うのは不可能、ということで確定らしい。
一方で、投稿する対象がFacebookフィードやグループであれば現在のAPIの仕様でも投稿可能なので、こちらの場合は検討の余地があるだろう。

なお、API所有者が所属するページ・グループに投稿するのみであれば、権限取得の際にFacebookから認可を得る必要はない。
しかし、自分以外の他者がそれぞれの所属するページ・グループに投稿する広範なサービスを検討する場合、Facebookに英文で用途を説明したり、使用方法の動画を作ったりと無茶苦茶面倒なので、その辺は覚悟しないといけない。

ウェブサイトをシェアする形で投稿する

APIはダメということで、諦めるしかない。
というわけで、次に検討するのは人力シェアだが、ただブログ記事を投稿してそのURLコピペしてFacebookに投稿、というのはあまりにも芸がない。
その過程をいかにして簡易にするかが問題だろう。

これについて単刀直入に言えば、半自動化までは可能という結論に至った。
ただし、ブログ投稿の時点でFacebookに自動で投稿されている、というのは不可能。
ブログ投稿完了⇒Facebookのシェアページにリダイレクト⇒シェア後にブログ管理ページにリダイレクト、という形なら成立する。
Facebookのシェアページで投稿ボタンを押さないといけないので、自動とはいいかねるが、わざわざコピペしたりする必要はなくなるので、作業は体感的には自動に近い。
かくいうこのブログ記事もこの方法で投稿されている。

やり方は、それほど難しくない。
まずは以下のFacebook for Developerでマイアプリを作成して、 アプリIDを取得する。
他にもアプリドメインなど、必要な項目は埋めておく。
準備は以上。

次にブログの送信を行うプログラムを実行後、以下のURLにリダイレクトさせる。
https://www.facebook.com/dialog/share?app_id=[アプリID]&href=[シェアするページのURL]&redirect_uri=[シェア後に表示したいURL]
こうすれば、シェア用のページを挟むだけでFacebookにリンクを張ることが可能になる。
Facebookに未ログインの場合はログイン画面が挟まれるが、それはログインさえすればクリアできる。
僕の環境はLaravelを使っているので、以下のようなソースにして実行後に完了メッセージも表示されるようにしてる。

$url = 'https://www.facebook.com/dialog/share?app_id=[アプリID]&href=[シェアするページのURL]&redirect_uri=[シェア後に表示したいURL];
return redirect($url)->with('success', 'ブログを登録しました。');

結論

Facebookページやグループにのみ投稿したいという場合、昨年までと同様にAPIからの自動投稿が可能なため、こちらで対応すればいいだろう。
一方で個人のニュースフィードに投稿したい場合、シェア機能を使うのが割と簡単かつ違和感ない妥当な解決策と思う。
こちらは従来のように完全自動にはならないが、顧客の損害をすべてFacebookのせいにしているような、そういう心の痛みは感じずに済むだろう。
ただし、そうはいってもこちらはこちらでFacebookの仕様変更に応じてシステムを改修するコストがかかるわけだから、代替策とは言ってもその対応をするならその開発費はいただきたいところである。