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へのポストを実装すると処理がスッキリしてよいと思います。