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