また、最後に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回数制限を少しでも回避できる。
テスト
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のページを見ると例がのっているので、それを流用すると簡単。
テストなどに使うデータは、Twitter APIのページを見ると例がのっているので、それを流用すると簡単。
update profile image
このAPIを使用したところ、レスポンスでくるprofile_image_urlは更新前の情報になることがあった。これは、Twitter側でデータを更新するタイミングで発生していると思われ、その時によって、発生頻度はまちまち。頻発するときもあれば、出ない時もある。
対策は、レスポンスを使わずに、自サーバーで保持しているデータを使うことにした。
本質的な解決とはいえない気もする。
APIで取得しなおすと、レートリミットに+1されてしまうので。
本質的な解決とはいえない気もする。
APIで取得しなおすと、レートリミットに+1されてしまうので。
APIレートリミット(回数制限)
こちらも既にWebで情報があるので、簡単に。
https://dev.twitter.com/rest/public/rate-limiting
15分に15回のAPIのアクセス制限あるよということ。世のアプリも結構引っかかることが多いらしい。
今回とった施策は、
・認証時のレスポンスをなるべく使う。
・既に持っているデータはなるべく取得しない。
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\//
対策:
予め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/
0 件のコメント:
コメントを投稿