Translate

2016/04/13

Ruby On Rails でTwitter連携アプリのプラクティス

Webでも記事が多い情報になりますが、実際にきちんと運用できるレベルの実装をするとそれなりにポイントがあったので、ブログとしてまとめてみます。
また、最後にTwitter gemを使ったベストプラクティスとして、モジュール化したコードを載せておきます。これはWeb上にもなかなかないので、ぜひ参考になれば幸いです。

参考:
https://syncer.jp/twitter-api-matome
https://takuyokomizo.com/ruby-twitter-api/

Twitter認証

gem omniauth を使いました。https://github.com/intridea/omniauth
使い方は、wikiが詳しいです。特に難しいことはなし。
以降は、情報が少ないものに絞って列挙しておきます。

TokenをSessionに保存

    auth = request.env['omniauth.auth']
    session[:access_token]        = auth['credentials']['token']
    session[:access_token_secret] = auth['credentials']['secret']
    session[:username]            = auth['extra']['raw_info']['screen_name']
    session[:profile_image_url]   = auth['extra']['raw_info']['profile_image_url_https']
このときに、なるべく情報を保持しておくと、API回数制限を少しでも回避できる。
使える情報は、こちらから。https://github.com/arunagw/omniauth-twitter

テスト

wikiどおりで基本はOK.
 @auth_resp = {
      provider: 'twitter',
      uid: '123456',
      info: {
        nickname: 'johnqpublic',
        name: 'John Q Public',
        location: 'Anytown, USA',
  。。。
    OmniAuth.config.test_mode = true
    OmniAuth.config.mock_auth[:twitter] = OmniAuth::AuthHash.new(@auth_resp)

authのテストデータは、TwitterAPIのExampleレスポンスを基にするとよい。

認証失敗のテストは、バグがあってWikiどおりにはできない。
OmniAuth.config.mock_auth[:twitter] = :invalid_credentials
これをやっても、Failureのパスには飛んでくれない。
通常のパスに飛んで、CredentialsがInvalidになるだけ。

Twiter API

client

gem 'twitter' を使った。使い方は、参考URLが詳しい。
テストなどに使うデータは、Twitter APIのページを見ると例がのっているので、それを流用すると簡単。

update profile image

このAPIを使用したところ、レスポンスでくるprofile_image_urlは更新前の情報になることがあった。これは、Twitter側でデータを更新するタイミングで発生していると思われ、その時によって、発生頻度はまちまち。頻発するときもあれば、出ない時もある。
対策は、レスポンスを使わずに、自サーバーで保持しているデータを使うことにした。
本質的な解決とはいえない気もする。
APIで取得しなおすと、レートリミットに+1されてしまうので。

APIレートリミット(回数制限)

こちらも既にWebで情報があるので、簡単に。
https://dev.twitter.com/rest/public/rate-limiting
15分に15回のAPIのアクセス制限あるよということ。世のアプリも結構引っかかることが多いらしい。
今回とった施策は、
・認証時のレスポンスをなるべく使う。
・既に持っているデータはなるべく取得しない。

TwitterアイコンのdefaultイメージはCORS

defaultイメージ(卵アイコン)は、URLのドメインが通常とは異なり、CORSが許可されない。つまり、直接HTMLに画像をURLで埋め込むことはできない。
対策:
予めdefaultイメージを保存しておいて、ドメインが変わったらそちらを使う。
defaultイメージは、7種類あって0からの連番だった。(自分が確認した時点で)
使用した正規表現 regex = /http.*default_profile_images\//

その都度、wgetでローカルに保存してそれを使うこともできたが、実装のインパクトが大きかったので、上記方法を採用した。

CORS(Cross-Origin Resource Sharing)は、その名の通り、ブラウザがオリジン(HTMLを読み込んだサーバのこと)以外のサーバからデータを取得する仕組みです。http://dev.classmethod.jp/cloud/cors-cross-origin-resource-sharing-cross-domain/

Twitter client module

https://github.com/Samemura/twitter-client-practice


0 件のコメント:

コメントを投稿