Yiiでoauthを使ってtwitterにポストする

http://www.sdn-project.net/labo/oauth.html
を参考に、oauthでtwitterにポストするエクステンションを作成します。

まず、
https://github.com/abraham/twitteroauth
から、twitter用のoauthライブラリであるtwitteroathをダウンロードし、protected/extensions/twitter/以下に展開します。

次に、このライブラリを利用するETwitterクラスをprotected/extensions/twitter/ETwitter.phpに以下のように作成します。

require_once(dirname(__FILE__).DIRECTORY_SEPARATOR.'twitteroauth-master'.DIRECTORY_SEPARATOR.'twitteroauth'.DIRECTORY_SEPARATOR.'twitteroauth.php');

class ETwitter
{
  // Consumer keyの値
  public $consumerKey = "consumer_key";
  // Consumer secretの値
  public $consumerSecret = "consumer_secret";
  // Access Tokenの値
  public $accessToken = "access_token";
  // Access Token Secretの値
  public $accessTokenSecret = "access_token_secret";

  private $_myTwitter=null;
  private $_twitterUrl="https://api.twitter.com/1.1/statuses/update.json";

  /**
   * Call a TwitterOAuth function
   *
   * @param string $method the method to call
   * @param array $params the parameters
   * @return mixed
   */
  public function __call($method, $params)
  {
    if (is_object($this->_myTwitter) && get_class($this->_myTwitter)==='TwitterOAuth') 
      return call_user_func_array(array($this->_myTwitter, $method), $params);
    else 
      throw new CException(Yii::t('ETwitter', 'Can not call a method of a non existent object'));
  }

  /**
   * Setter
   *
   * @param string $name the property name
   * @param string $value the property value
   */
  public function __set($name, $value)
  {
    if (is_object($this->_myTwitter) && get_class($this->_myTwitter)==='TwitterOAuth') 
      $this->_myTwitter->$name = $value;
    else 
      throw new CException(Yii::t('ETwitter', 'Can not set a property of a non existent object'));
  }

  /**
   * Getter
   *
   * @param string $name
   * @return mixed
   */
  public function __get($name)
  {
    if (is_object($this->_myTwitter) && get_class($this->_myTwitter)==='TwitterOAuth') 
      return $this->_myTwitter->$name;
    else 
      throw new CException(Yii::t('ETwitter', 'Can not access a property of a non existent object'));
  }

  //twitterにメッセージをポストする
  public function postMessage($message)
  {
    $this->_myTwitter = new TwitterOAuth(
        $this->consumerKey,
        $this->consumerSecret,
        $this->accessToken,
        $this->accessTokenSecret);
    $req = $this->_myTwitter->OAuthRequest($this->_twitterUrl,"POST",array("status"=>$message));
//     $result = json_decode($req);
//     echo "<pre>";
//     var_dump($result);
//     echo "</pre>";
  }
}

本来なら、twitterに投稿したあとの処理も書くべきなんだろうけど、今回は投稿に失敗しても気にしないということでパス。

最後に、twitterのクライアント登録時に取得したconsumerKey、consumerSecret、accessToken、accessTokenSecretをprotected/config/main.phpに設定しておきます。

'params'=>array(
    'social'=>array(
      //twitter
      'twitter'=>array(
        //Consumer keyの値
        'customer_key'=>'yMpefat4eMtBhxEZh8Q',
        //Consumer secretの値
        'consumer_secret'=>'avqadasxfUXPFjZJyj0ODHr2dGY',
        //Access Tokenの値
        'access_token'=>'1097232303-K3TuNCTdrUWDSuyw8Dn54wfgeYJj4A',
        //Access Token Secretの値
        'access_token_secret'=>'sA4adW5ziIZutypasdgfKKHyPavFMdiYU',
      ),
    ),
);

使い方は、

$twitter = Yii::createComponent(array(
  'class'=>'application.extensions.twitter.ETwitter',
  'consumerKey'=>Yii::app()->params['social']['twitter']['customer_key'],
  'consumerSecret'=>Yii::app()->params['social']['twitter']['consumer_secret'],
  'accessToken'=>Yii::app()->params['social']['twitter']['access_token'],
  'accessTokenSecret'=>Yii::app()->params['social']['twitter']['access_token_secret']
));
$twitter->postMessage('twitterに投稿する文面');

のようにします。
メール周りの設定同様、Yiiのイベントを使ってtwitterへのポストを実装すると処理がスッキリしてよいと思います。

投稿日:
カテゴリー: php タグ: