Facebook APIでウォールに投稿/書き込む

Facebook Graph APIを使ってRailsでfacebookページウォールに投稿する時の手順と知っておきたい注意点のまとめ。
気づいた点や間違いなどは、加筆修正予定。

■Facebookアプリを作成
Graph APIを利用するには、まずfacebookアプリが必要なので作成する。
作成したらApp ID/API Key、App Secretをメモしておく。
ちなみに、Facebookeの商標やFacebook製のアプリと混同するアプリ名は不可。

■Facebookアプリのアクセストークン
App ID、App Secretを取得したら、アプリのアクセストークンを取得する。
access_token = open("https://graph.facebook.com/oauth/access_token?client_id=App ID&client_secret=App Secret&grant_type=client_credentials"){|f|
f.read
}
=>"access_token=000000000000000|AA_BBBBBBBBBBBBBB_CC"
ユーザーのIDやアプリID、secret、アクセストークンなどは、本番・開発・テスト用にenvironments以下やsettingslogicなどで定義しておくと便利。

■facebook関連のGemを利用する
Graph APIを利用するのに、fb_graphやfkoalaを使うと便利。
今回はkoalaを使用。

■テストユーザー
Graph APIのテストにはテストユーザーを必ず作成する必要がある。
facebookページでのテストは、テストユーザーを作成のうえfacebookページを作成する。
実在するユーザーのウォールへの投稿は上限があり、数十回投稿するとしばらく投稿できなくなる。

■Facebookアプリを許可済みのテストユーザーを作成する
テストユーザーを作成する場合は、テストするアプリのパーミッションを許可済みの状態で作成しておくと、テストユーザーのウォールや、テストユーザーの管理しているfacebookページにすぐ投稿できる。
test_user = open("https://graph.facebook.com/App ID/accounts/test-users?installed=true&name=ユーザーのフルネーム&permissions=publish_stream,email,offline_access,read_stream&method=post&アプリのアクセストークン"){|t|
ActiveSupport::JSON.decode(t.read)
}
#=>{"id"=>"id", "login_url"=>"url", "access_token" =>"access_token"}
permissionsで、ウォールへの投稿など許可してもらう項目を設定する。
installed=trueでアプリを許可した状態になる。
offline_accessを許可してもらわないと、一定時間しか許可されない。
premissionsの項目一覧はPermissionsを参照。

■テストユーザーのパーミッションを変更する
アプリの許可や、許可する項目を変更するにはテストユーザーとしてログインした状態で
App Settingsからパーミッションを変更するアプリを編集する。

■テストユーザーのログインURLをkoalaで取得する
参考:Test Users
テストユーザーのログインURLはGraph APIから取得する。
ログインしていないと10分ほどで無効になるので、再度APIから取得する。
@test_users = Koala::Facebook::TestUsers.new(:app_id => App ID, :secret => App Secret)
@test_users.list
=>[{"id"=>"id2", "login_url"=>"url2", "access_token" =>"access_token2"}, {"login_url"=>"url3, "id"=>"id3", "access_token"=>"access_token3"}]
作成時のフルネームなどは取得できず、誰が誰か分からないので、テストユーザーのIDを定数で設定しておいて、取得するようなヘルパーがあると便利。

■ウォールへの投稿
koalaで、個人のウォールに投稿する。
参考:koala GraphAPI
※Graph APIを呼び出す部分が、バージョン毎に異なる。
@graph = Koala::Facebook::GraphAPI.new # 1.2ベータ以下
@graph = Koala::Facebook::API.new # 1.2ベータ以上

access_tokenはアプリをユーザーに許可してもらい、リダイレクトで受け取る。
参考:Authentication - Facebook Developers
deviseなどを使用すると便利。

今回はテストユーザーで試すので、さきほど作成したFacebookアプリを許可済みのテストユーザーのaccess_tokenを使用する。
@test_users = Koala::Facebook::TestUsers.new(:app_id => App ID, :secret => App Secret)
@test_users.list
=>{[{"id"=>"id", "login_url"=>"url", "access_token" =>"access_token"}]
@graph = Koala::Facebook::API.new(access_token)

□メッセージだけ投稿する
@graph.put_wall_post("Facebookウォールへの投稿")
=> {"id" => "1000000000000000001"}

□リンクなどを投稿する
@graph.put_wall_post("Facebookウォールへの投稿", {:name => "リンクのタイトル", :link => "http://www.yoursite_name_here.com/facebook_wall_post_page.html"})
=> {"id"=>"100000000000000000122"}


■facebookページのウォールに投稿する
facebookページ管理者にアプリを許可 → 管理しているfacebookページのアクセストークンを取得 → facebookページのアクセストークンで投稿
という流れ。

今回はさきほどのテストユーザーでfacebookページを作成しておき、そのfacebookページに投稿する。
@user_graph = Koala::Facebook::API.new(admin_access_token)

□管理者の管理しているfacebookページ等の一覧を取得
accounts = @user_graph.get_connections('me', 'accounts')
# => [{"name"=>"facebookページの名前", "id"=>"facebookページのID", "access_token"=>"facebookページのトークン"}, ......]

□投稿したいfacebookページをIDで取得する
page = accounts.find{|a| a['id'] == '投稿したいfacebookページのID'}
# => "access_token"=>"facebookページのトークン"
@page_graph = Koala::Facebook::API.new(page['access_token'])

□メッセージだけ投稿
@page_graph.put_object(page['id'], 'feed', :message => '投稿するメッセージ')

□リンクなどを投稿する
@page_graph.put_object(page['id'], 'feed',{:message => '投稿するメッセージ',:name => "リンクのタイトル", :link => "http://www.yoursite_name_here.com/facebook_wall_post_page.html"})

【ウォールに投稿する際の注意点】
いろいろと仕様というか、たぶんドキュメントには書かれていないような注意点がある。
特にfacebookページのウォールにリンクを投稿する場合に、いろいろと落とし穴にはまったのでその注意点をまとめてみた。

■重複した内容
messageパラメータのみで、同じ内容の投稿はAPIエラーが出て投稿できない。
定型文でテストなどしているときに問題になるので、Time.nowや乱数を投稿するようにする。
linkなどその他のパラメータがある場合は大丈夫なようだ。

■連投禁止
あまり短時間にいくつも投稿するとエラーになる。また、投稿してからウォールに表示されるまでタイムラグがある場合もあるようなので、表示されないからといって連投せずしばらく待つ。

【linkを投稿する場合】
■ogpタグとの関連
投稿の際のパラメータはhttp://developers.facebook.com/docs/reference/api/post/のFieldsを参照。

投稿の際にmessageはもちろん、name(リンクのタイトル)、caption(キャプション:リンク先の本文や説明など)も投稿できるが、リンク先ページにogpタグ、titleタグなどの有無で結果が変わる。
調べた限りでは、それぞれの優先順位は以下の通り。
左から優先的に採用され、無い場合は右へと参照していく。

簡潔にするのであればGraph APIではリンク先のURL(link)のみ投稿し、リンク先にogタグをもれなく記述すれば、リンクのタイトル、キャプションはogタグを元にする形がよいと思う。

name
APIで投稿されたnameの値 > リンクページのog:title > リンクページのtitleタグ > URL

caption
APIで投稿されたcaption(最大80文字) > リンクページのog:description(最大300文字) > リンクページのmeta descriptionタグ > ドメイン名

captionで特に注意したいのは何文字投稿しても80文字までしか表示されない点。さらに、og:descriptionあるいはmeta descriptionタグがある場合は、最大300文字までcaptionの内容に加えて'必ず'表示される点。
なので、たとえば記事の内容をcaptionで投稿してog:description、meta descriptionも同じ内容を設定していると、内容が重複してしまう。

{
:message => 'message:メッセージ',
:name => 'name:リンクのタイトル',
:caption => 'captionで投稿した内容(最大80文字まで)'
}
で投稿した場合
□リンク先にog:descriptionタグが無い場合
fbpage_wall_00.png
□リンク先にog:descriptionタグがある場合
fb_page_wall_01.png

picture
APIで投稿されたpicture > og:image > リンクページの最初のIMGタグ
※画像はfacebook APIが参照できるように、web上で公開されている画像を指定しないと反映されない。
特に開発・テスト環境でローカルの画像パスを指定すると無視されるので注意。

リンクページの内容はキャッシュされるため、ogやタグの内容を変更しても一度投稿したことのあるURLなら変更が反映されない(※)。
なので、ページ生成後に編集ページにfacebookに投稿するボタンを設置する等して、投稿前に誤りがないか確認の上で投稿できるようなフローが良いと思う。

※キャッシュをクリアするにはDebuggerのページに該当ページのURLを入力すると、クリアされる。
ページから入力せず、クエリでGETも可能。
http://developers.facebook.com/tools/debug/og/object?q=該当ページのURL


■ページ生成のタイミング
og、titleタグなどの関連は上記の通りだが、ページを生成するタイミングも関連する。
たとえばページを作成(createアクション等)するタイミングでウォールに投稿するようなコードの場合、facebookのAPIがページを参照できずに、og:description等の内容が反映されないといった事が起こる。
delayed_job等を使用して非同期に実行する方法もある、それでもog:descriptionを参照できず反映されないことはあるようなので、確実にリンクページのogタグなどを反映したい場合は、Debuggerで確認したり、一度コールしておいて投稿するのがいいかもしれない。

また、開発・テスト環境のページも同様にfacebook APIが参照できないためogタグ等を一切参照できないため、APIで投稿された内容のみになり、本番環境で結果が異なる事になる。

開発・テスト用にogタグを設置したページをどこかWeb上に置いておくといいと思う。




posted by digital-squad at 2011年10月09日 14時58分 | Comment(0) | TrackBack(0) | Ruby on Rails / Ruby
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。