Category: ‘twitter’

Railsで取得したデータとそのハッシュが表示される

2012年1月23日 Posted by PURGE

ハマった件。なぜかrailsの viewにて、データとその下にハッシュ形式で重複表示されてしまう。
結論から言うと、タグの記述が間違っていた。

#間違い
<%= @timelines.each do |timeline| %>

#正式
<% @timelines.each do |timeline| %>
    #コンシューマキーとトークンを設定
    Twitter.configure do |config|
        config.consumer_key = consumer_key
        config.consumer_secret = consumer_secret
        config.oauth_token = token
        config.oauth_token_secret = token_secret
    end

    #タイムライン取得
    @timelines = Twitter.user_timeline(twitter_id)
<h2>TimeLines</h2>
<% @timelines.each do |timeline| %>
<div>
	<%= timeline.user.screen_name %>
	<%= timeline.text %>
</div>
<% end%>

Twitter4R Twitter::ForbiddenError

2012年1月20日 Posted by PURGE

Twitter4Rを使用して開発を進めていたが、どうしても下記の現象で諦めざるを得ない状況となったようだ。

twitter = Twitter::Client.new(oauth_access: { key: token, secret: token_secret})

#これらのメソッドは動作する
twitter.status(:post, "POST TEST!!!")
twitter.friend(:add, "twitter_user")

#これらのメソッドは ForbiddenErrorとなる
friends = twitter.my(:friends)
friends = twitter.user.friends

結局、twitter4r(0.7.0) をアンインストールし、twitter-2.0.2 を代わりにインストールして再開発。これでうまくいくのかわからないが、取りたかった情報(friends/ids)は取れた。

後日、記述予定。

C:works>gem list twitter
*** LOCAL GEMS ***
twitter4r (0.7.0)

C:works>gem uninstall twitter4r
Remove executables:
        t4rsh, t4r-oauth-access

in addition to the gem? [Yn]  y
Removing t4rsh
Removing t4r-oauth-access
Successfully uninstalled twitter4r-0.7.0

C:works>gem install twitter
Fetching: addressable-2.2.6.gem (100%)
Fetching: multipart-post-1.1.4.gem (100%)
Fetching: faraday-0.7.5.gem (100%)
Fetching: simple_oauth-0.1.5.gem (100%)
Fetching: twitter-2.0.2.gem (100%)
********************************************************************************

  You should follow @gem on Twitter for announcements and updates about the gem.
  https://twitter.com/gem

  Please direct any questions about the library to the mailing list.
  https://groups.google.com/group/ruby-twitter-gem

  Does your project or organization use this gem? Add it to the apps wiki!
  https://github.com/jnunemaker/twitter/wiki/apps

********************************************************************************
Successfully installed addressable-2.2.6
Successfully installed multipart-post-1.1.4
Successfully installed faraday-0.7.5
Successfully installed simple_oauth-0.1.5
Successfully installed twitter-2.0.2
5 gems installed

stackoverflow.com

Twitter::ForbiddenError

2011年12月9日 Posted by PURGE

デバッグしながら開発してたら、突然のエラー。 Twitter::ForbiddenError

どうやら更新のレートリミットに引っかかったようだ。

Twitter::ForbiddenError

寝るとしよう。

Ruby on Rails & Twitter4R でのOAuth認証処理とツイートの基本

2011年12月8日 Posted by PURGE

四苦八苦して、ようやく認証処理とツイートまでたどり着いた。

#coding: utf-8

require 'twitter'
require 'oauth'

class OauthController < ApplicationController

  #---------------------------
  # Twitter認証画面遷移
  #---------------------------
  def connect
    #リクエストトークン取得
    consumer = OAuth::Consumer.new("コンシューマキー", "コンシューマシークレット", :site => "http://twitter.com")
    request_token = consumer.get_request_token(:oauth_callback => "http://コールバックURL/oauth/callback")
    
    #リクエストトークンをセッションに格納
    session[:request_token] = request_token

    #Twitter認証画面へリダイレクト
    authorized_url = request_token.authorize_url
    redirect_to authorized_url

  end

  #--------------------------
  # Twitter コールバック処理
  #--------------------------
  def callback
    #リクエストトークン取得
    request_token = session[:request_token]

    #HTTPパラメータ取得
    oauth_verifier = params[:oauth_verifier]
  
    #アクセストークン取得  
    access_token = request_token.get_access_token(:oauth_verifier => oauth_verifier)
    
    #トークンとトークンシークレット取得
    token = access_token.token
    token_secret = access_token.secret
    
    #アクセストークンをセッションに格納
    session[:access_token] = access_token
    
    #Twitter投稿処理
    twitter = Twitter::Client.new(:oauth_access => { :key => token, :secret => token_secret})
    twitter.status(:post, "Twitter4R からのTweet。成功するかな?")
  end

end

コツは、OAuth認証の仕組み。コンシューマキーとコンシューマシークレット。リクエストトークンやアクセストークンの概念と役割をしっかりと理解すること。

一番ハマッたのは、Twitter開発者のアプリ管理画面で、CallBack URL を設定しているのに、PINコードの画面に遷移してしまう現象。
consumer.get_request_token のところで、callback_url を設定しなければならない。なぜだかは不明。OAuth認証の仕様なのか、Ruby for OAuthの不備なのか?

リクエストトークンからアクセストークンを取得する部分や、Twitter::Client.new の方法。ドキュメントが少ない・・・。

Bootstrap Twitter

2011年8月28日 Posted by PURGE

Bootstrap Twitter

sfMelodyPluginを試す その3

2011年7月14日 Posted by PURGE

sfMelodyPluginについては、正直言って、使用をほとんど諦めているのだが、続けられるところまでと思って、前回の続き。下記認証画面が表示されるところまで辿り着いた。

アプリを認証ボタンを押してみる。

するとエラー。

500 | Internal Server Error | Doctrine_Record_UnknownPropertyException
Unknown record property / related component "field1" on "sfGuardUser"

だけど見事にコールバックされているようだ。うれしい。それでコールバックされてURL欄を見てみると、確かに oauth_token と oauth_verifier が発行されている事に気付く。

http://local.whoocus.com/frontend_dev.php/access/twitter?oauth_token=Zl9fNdYadhdbuc&oauth_verifier=5R65EtJ66NtAlDu5F4k

結局のところ、sfDoctrineGuardPlugin の使用方法に問題がありそうだ。今回はまた出直そうと思う。

ちなみに、この oauth_token とは、twitter がアプリ認証の際に、ユーザに対して発行されるリクエストトークンと呼ばれる文字列である。つまり、sfDoctrineGuardPlugin の仕組みの中で、ユーザ登録と同時に、このリクエストトークンを自サイトのユーザ情報として保持しなければならないのだろうと推測する。

とりあえず、Doctrine_Record_UnknownPropertyException を調べる事とする。

sfMelodyPluginを試す その2

2011年7月6日 Posted by PURGE

その後、symfony や OAuth認証それ自体の理解不足という事で勉強していた。sfMelodyPlugin の使用をあきらめかけ symfony と関係なくtwitteroauthという有名らしい phpライブラリを試してみた。

認証の仕組みを何となく理解し、早々と sfMelodyPlugin の使用に戻ってみると、どうやら自分のrouting.yml の設定が悪いらしい。もう一度 symfony の routing をおさらいして設定。

すると、以前は、twitterのエラー画面に飛んでいた画面が、下記のお馴染みの画面と連携できた。

原因不明だが、以前エラー画面に飛んでいた時は、下記パラメータのoauth_token=xxxxxxxxxxxxxxxx が送信できていなかったようだ。

https://api.twitter.com/oauth/authorize?param1=value&oauth_token=xxxxxxxxxxxxxxxx

今回はうまくリクエストを送信できたようだ。詳細は、また調査後に記述しようと思う。一歩一歩進んでいる。
続きはまた後日・・・。

※その後の調査の結果、筆者はWindows と Mac それぞれで開発しているのだが、Mac だとうまく上記 oauth_token=xxxxxxxxxxx パラメータ付きでリクエストされる。Windows で開発した場合はどうしてもパラメータが付加されずに下記画面になってしまう。

尚も原因不明である。

sfDoctrineGuardPlugin と sfDoctrineOAuthPlugin と sfMelodyPlugin の継承関係

2011年7月4日 Posted by PURGE

※注意 この記事は現在調査を進めながら記述していますので、完全な情報ではありません。

sfMelodyPlugin のReadmeも理解できないし、情報サイトもほとんどないし、使用方法が全く分からないので、ソースコードを追ってみることにした。

とりあえず、わかったことは、下記の継承関係が存在する。ライブラリ的には依存関係。

■OAuth関係

  • sfDoctrineOAuthPlugin/lib/base/vendor/oauth/OAuth.php
  • sfDoctrineOAuthPlugin/lib/base/sfOAuth.class.php
  • sfDoctrineOAuthPlugin/lib/base/sfOAuth1.class.php
  • sfMelodyPlugin/lib/melody/base/sfMelody1.class.php
  • sfMelodyPlugin/lib/melody/sfTwitterMelody.class.php
class sfOAuth1 extends sfOAuth
{
}
class sfMelody1 extends sfOAuth1
{
}
class sfTwitterMelody extends sfMelody1
{
}

■ユーザ関係

  • symfony/lib/user/sfUser.class.php
  • symfony/lib/user/sfSecurityUser.class.php
  • symfony/lib/user/sfBasicSecurityUser.class.php
  • sfDoctrineGuardPlugin/lib/user/sfGuardSecurityUser.class.php
  • lib/model/doctrine/sfDoctrineGuardPlugin/sfGuardUser.class.php
  • sfMelodyPlugin/lib/user/sfMelodyUser.class.php
  • apps/frontend/lib/myUser.class.php
interface sfSecurityUser
{
}
class sfUser implements ArrayAccess
{
}

class sfBasicSecurityUser extends sfUser implements sfSecurityUser
{
}
class sfGuardSecurityUser extends sfBasicSecurityUser
{
}
class sfMelodyUser extends sfGuardSecurityUser
{
}
class myUser extends sfMelodyUser
//class myUser extends sfBasicSecurityUser
{
}

つまり、親クラスのメソッドや変数(属性)を利用可能ということ。

で、README にある下記のコードは、ユーザを通してメソッドを使用するということのようだ。

public function executeIndex(sfWebRequest $request)
{
  //ユーザを取得しサービスに接続する
  $this->getUser()->connect('twitter'); //app.yml に登録したサービス名
}

ということは、下記コードはインスタンスを得られるという事なのか?

  $melody = $this->getUser()->getMelody('twitter');

どうしても、Alias と Namespaces の使用方法が理解できない。
また行き詰った・・・。

Twitterへのアプリケーション登録

2011年7月2日 Posted by PURGE

Symfony1.4 で連携を語る前に、そもそものtwitter API を利用するために登録していなかったし、twitter API の仕組みも理解していない。ということで、早速 twitter API の開発者用サイトへ移動する。

とりあえず、お決まりで ①のGet Started をのぞいて見る。

1番目のExplore the API with the Web Console は開発で利用できそうなコンソール画面。
2番目のLearn all about API authentication はOAuth認証の解説ドキュメント。
3番目のRegister your own Twitter application はアプリの登録画面らしい。

移動すると登録画面。登録できそうな項目のみ登録してみた。自分はアプリのURLを仮で登録しておいた。
後で変更できるようなので、気軽に登録してみるとよい。
Callback URLとか決まってないしね。

無事に登録できると、開発に必要な情報が設定画面に表示される。
設定画面はお見せできないが、前画面にて設定した下記情報が閲覧できる。

  • API Key
  • コールバックURL
  • コンシューマー・キー
  • コンシューマー・シークレット
  • リクエスト・トークンURL
  • アクセス・トークンURL
  • URLの許可
  • OAuth コールバックURL
  • アクセスレベル
  • どこで何を使用するかは未だ不明だが、とりあえず、これで開発に取り掛かれそうだ。

    sfMelodyPluginを試す その1

    2011年7月2日 Posted by PURGE

    ※注意 この記事は現在調査を進めながら記述していますので、完全な情報ではありません。

    Symfony1.4 で連携しようと思ってたどり着いた sfMelodyPlugin
    Symfony1.4 の使用方法も間々ならないままにplugins/sfMelodyPlugin ディレクトリにインストール。中にある英語のREADME.txt を読んでみる。
    一般的には下記のコマンドでインストールできるようだが、PEARが効かない環境なので一式配置。

    $ php symfony plugin:install sfMelodyPlugin
    

    キャッシュをクリアして、

    $ php symfony cc
    

    sfMelody を settings.yml に設定する。
    ちなみに、Doctrine使用の場合、sfDoctrineOAuthPlugin sfDoctrineGuardPlugin が必要らしい。
    sfMelody と同様に pluginsディレクトリに配置した。

    all:
      .settings:
        enabled_modules: [default, sfGuardAuth, sfMelody]
    

    適用するアプリケーションにあるmyUser.class.php の継承元を変更する。
    apps/my-app/lib/myUser.class.php:

      class myUser extends sfMelodyUser
      //class myUser extends sfBasicSecurityUser
      {
      }
    

    app.yml を設定する。

    all:
      melody:
        create_user: false            # 対象サービス(twitter等)に接続した時にログオンできない場合新規作成するかどうか
        redirect_register: false      # 登録画面にリダイレクトするかどうか
        twitter:                      #name
          key:  my_service_key        # twitter で発行されたコンシューマー・キー(API key)を記述
          secret: my_secret_key       # twitter で発行されたコンシューマー・シークレットを記述
          callback: @mymodule_index   # コールバックURLを記述
    
          #オプション (↓↓↓↓↓調査中↓↓↓↓↓↓)
          user:                       # to create an user
            field_1:
              call: xx
              call_parameters: [x, x, x]
              path: xx.xy.zz
              prefix: xx_
              suffix: _xx
              key: false
            ...
    
          provider: twitter          #対象サービス名 (他google / facebook等)
          request_token_url: https://api.twitter.com/oauth/request_token  # リクエスト・トークンURL
          request_auth_url: https://api.twitter.com/oauth/authorize #URLを許可する
          access_token_url: https://api.twitter.com/oauth/access_token  #アクセス・トークンURL
    
          # (↓↓↓↓↓調査中↓↓↓↓↓↓)
          namespaces:                 # namespaces are used to make some api calls - see namespace Section
            ns1: http://my.name.space
            ...
          aliases:                    # Alias is an easy way to simplify api calls
            me: my/alias
            ...
          auth_parameters:
            param1: value
          call_parameters:
            param1: value
          access_parameters:
            param1: value
          output_format: json
          create_user: true
          redirect_register: false
    
          #optional only for OAuth 1
          request_parameters:
            param1: value
          request_token_url: https://api.twitter.com/oauth/request_token  # リクエスト・トークンURL
    

    まだ何もわからないまま、アプリケーションを実行してみる。呼び出すべき actions.class に接続のアクションメソッド(executeIndex)とCallbackを受けるアクションメソッド(executeShow)を記述。

      public function executeIndex(sfWebRequest $request)
      {
      	$this->getUser()->connect('twitter');  //nameで指定した名前
      }
      public function executeShow(sfWebRequest $request)
      {
      	$this->me = $this->getUser()->getMelody('twitter')->getMe();
      }
    

    それに伴いrouting.yml も設定する。

    twitter_callback:
      url:   /:module
      param: { action: show }
    

    すると、何やら sfOAuth1 が見つからないとのエラー。実際のファイルが sfDoctrineOAuthPlugin に無いのかなと予測したらやはり無い。どうやら OAuthBase のモジュールが別途必要なようだ。急いでダウンロードしたらこのエラーは無くなった。

    しかし次のエラー

    Fatal error: Call to undefined function curl_init()
    

    どうやらphpにて、cURLが有効になっていない模様。
    php.ini で同モジュールを有効にしてApacheの再起動したらtwitterページにリダイレクトできました。

    エラー画面なので連携とまではいけませんでした。
    まだまだ、完全な連携には程遠いのですがちょっと感動です。

    続きは後日・・・。

    ■参考サイト
    Symfohub