facebookページにスクリプトのみで自動投稿する方法がわからなかった
facebookページにスクリプトのみで自動投稿できなかった。
正確にはfacebookページのユーザーとして自分自身のfacebookページへスクリプトのみで自動投稿できなかったと言った方がいい。
例えば、「アイドルNews毎日更新!」というfacebookページがあって、このページへ「アイドルNews毎日更新!ユーザー」として1日1回自動投稿を行ないたい場合などを指す。
当初の案としては、facebookページへ投稿するスクリプトを書いてcronで定期実行させればよいと考えたのだけど、色々こねこね調べた結果、面倒なのでやめた。
理由としてはスクリプトのみでfacebookページへ自分自身で書き込むアクセストークンを取得する方法がわからなかったから。
facebookページにfacebookページ自身で書き込みを行なう方法としては以下のページにあるような実装を行なえばいいはずだった。
この通りにやれば本当はできるはずなんだけど、そのためにはmanage_pages,publich_streamの権限を持ったユーザートークンが必要。
で、このユーザーアクセストークンを取得すればいいじゃないかという話になるんだけど、これがfacebook側のポリシーで1,2時間しか有効じゃないユーザーアクセストークンしか取得できない(60日有効のユーザーアクセストークンもあるけど60日経つと使えなくなるので2ヶ月に1回運用が発生する気がする)。
なので、スクリプト実行時に毎度ユーザーのアクセストークンを取得する必要がある。
Graph API Explorerというツールを使うと1,2時間しか持たないユーザーアクセストークンは取得できるし、ちょっと調べればできるっしょwwwwとか思ったけど、結局全然わからなくて丸半日つぶれた。
そのときのつぶやき。
今日なにやってもうまくいかないし全裸になりたい
— hayakawa@ミラーボールトイレ (@razokulover) May 23, 2014
で、方針を変えることにした。
その方法というのが、自動投稿したい内容をRSSフィードとして配信して、それをIFTTTにfacebookページへ投稿させるというもの。
これならRSSフィードを作って、IFTTTにレシピを作ればおわる。
難点としてはfacebookページへの投稿ユーザーがIFTTTからの投稿と表示されてしまうこと。
本来ならfacebookページからの投稿と表示させたかったのだけども。仕方ない。
ということで、RSSフィードを作ることになるのだけど、Rails3,4なら5分で作成できる。
config/routes.rb
get '/rss' => 'news_controller#rss'
app/controllers/news_controller.rb
class NewsController def rss @feeds = News.order(:id).reverse_order.limit(10) # newsテーブルはすでに作ってあるとする respond_to do |format| format.html format.rss { render :layout => false} end end end
# coding: utf-8 xml.instruct! :xml, :version => "1.0" xml.rss :version => "2.0" do xml.channel do xml.title "アイドルNews毎日更新!" xml.description "アイドルの情報を毎日お届け!" xml.link root_url for feed in @feeds xml.item do xml.title feed.title xml.description feed.description xml.pubDate feed.created_at.to_s(:rfc822) xml.link news_url(feed.id) xml.guid news_url(feed.id) xml.dc :creator, feed.author end end end end
色々はぶいたけどrssの作り方としてはこれで必要十分。
こういうときRailsは楽。
で、あとはIFTTTでさきほど作ったRSSフィードをレシピのTHISに設定して、THATをfacebookページにすればいい。
設定方法とかはここがわかりやすいかも→作りながら覚える「IFTTT」レシピの使い方活用講座!(全5回)
ここまで30分。
あっさりやりたいことができた。
それで作成したのがこのページ。
無駄なgemとかいらないし、最初からこうしとけば良かったよ...。