SSブログ

広告

CakePHPとTwitterとOAuth [コンピュータ]

CakePHPのシェルからTwitterへOAuthで投稿のメモ
(アプリの登録とかは他のサイトを参照して)

CakePHPのバージョンは1.2.6

ここ http://code.42dh.com/oauth/ から
OAuth consumer classをダウンロードし、cakeコアの vendors\OAuth に解凍する。

そのままだとクライアントアプリでは使えなかったので少し改良。
(パラメータの取得あたり)
oauth_consumer.php
    public function getAccessToken($accessTokenURL, $requestToken, $httpMethod = 'POST', $parameters = array()) {
        $this->url = $accessTokenURL;
        // mod: start
        if ( isset($_SERVER['QUERY_STRING']) ) {
            $queryStringParams = OAuthUtil::parse_parameters($_SERVER['QUERY_STRING']);
            $parameters['oauth_verifier'] = $queryStringParams['oauth_verifier'];
        } else {
            $parameters['oauth_verifier'] = $requestToken->oauth_verifier;
        }
        // mod: end
        $request = $this->createRequest($httpMethod, $accessTokenURL, $requestToken, $parameters);

        return $this->doRequest($request);
    }


app\vendors\shells に oauthapp.inc.php を作成する。
oauthapp.inc.php
<?php
define( "YOUR_CONSUMER_KEY", "HERE_IS_YOUR_CONSUMER_KEY" );
define( "YOUR_CONSUMER_SECRET", "HERE_IS_YOUR_CONSUMER_SECRET" );
?>

HERE_IS~のところを書き換える。


アクセストークンを取得
getaccesstoken.php (ソースは後半に)を実行する。

$ ./cakephp_1.2.6/vendors/cakeshell -cli /usr/bin -console ./cakephp_1.2.6/cake/console/ -app ./app getaccesstoken
./cakephp_1.2.6/cake :CakePHPコアディレクトリ
./app :アプリケーションディレクトリ

こんな風に出力され、入力待ちになるので
Welcome to CakePHP v1.2.6 Console
~中略~
Get PIN in this page:
http://twitter.com/oauth/authorize?oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
PIN?
>

http://twitter.com/oauth/authorize?oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
をブラウザで表示してPINを取得し、数字を入力しEnter
PIN?
> 9521063
Pin: 9521063
~中略~
access_token        = 99999999-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
access_token_secret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

最後の2行をメモっとく。


投稿してみる
post_tweet.php(ソースは後半)を実行。
引数に上で得られた二つを与える。
./cakephp_1.2.6/cake/console/cake -app ./app post_tweet \
	ACCESS_TOKEN \
	ACCESS_TOKEN_SECRET \


こんな感じで。
./cakephp_1.2.6/cake/console/cake -app ./app post_tweet \
	99999999-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

以上。

ソース
oauthapp.inc.php
<?php
define( "YOUR_CONSUMER_KEY", "HERE_IS_YOUR_CONSUMER_KEY" );
define( "YOUR_CONSUMER_SECRET", "HERE_IS_YOUR_CONSUMER_SECRET" );
?>


getaccesstoken.php
<?php
/*
./cakephp_1.2.6/vendors/cakeshell -cli /usr/bin -console ./cakephp_1.2.6/cake/console/ -app ./app getaccesstoken
*/
App::import('Vendor', 'oauth', array('file' => 'OAuth'.DS.'oauth_consumer.php'));

include_once "oauthapp.inc.php";

class GetaccesstokenShell extends Shell {
	function main() {
		$this->out("TEST: " . date('Y-m-d H:i:s'));

		$token = "";
		$token_secret = "";
		$pin = "";

		$requestToken = $this->showAuthURL();

		$token = $requestToken->key;
		$token_secret = $requestToken->secret;
		$url = "http://twitter.com/oauth/authorize?oauth_token={$requestToken->key}";

		$this->out("Get PIN in this page:");
		$this->out("{$url}");
		$this->out( "" );

		$pin = $this->in("PIN?");
		$this->out("Pin: {$pin}");

		$accessToken = $this->getAccessToken($token,$token_secret,$pin);
		if ( $accessToken ) {
			$this->out( "access_token        = {$accessToken->key}" );
			$this->out( "access_token_secret = {$accessToken->secret}" );
		} else {
		}

	}

	public $uses = array();

	function showAuthURL() {
		$consumer = $this->createConsumer();
		$requestToken = $consumer->getRequestToken('http://twitter.com/oauth/request_token', 'oob');

		$url = "http://twitter.com/oauth/authorize?oauth_token={$requestToken->key}";
		$this->out( "DEBUG:token        = {$requestToken->key}" );
		$this->out( "DEBUG:token_secret = {$requestToken->secret}" );
		$this->out( "DEBUG:{$url}" );

		return $requestToken;
	}

	function getAccessToken($token,$token_secret,$pin) {
		if ( empty($token) || empty($token_secret) ) {
			$this->out("");
			$this->out("-----------------------------------------------------");
			$this->out("--- Error: no TOKEN or TOKEN_SECRET               ---");
			$this->out("--- Usage: cake getaccesstoken TOKEN TOKEN_SECRET ---");
			$this->out("-----------------------------------------------------");
			$this->out("");
			return;
		}

		$consumer = $this->createConsumer();
		$requestToken = $consumer->getRequestToken('http://twitter.com/oauth/request_token', 'oob');

		$requestToken->key=$token;
		$requestToken->secret=$token_secret;
		$requestToken->oauth_token=$requestToken->key;
		$requestToken->oauth_token_secret=$requestToken->secret;
		$requestToken->oauth_verifier=$pin;

		$accessToken = $consumer->getAccessToken('http://twitter.com/oauth/access_token', $requestToken, "POST");
		if ( $accessToken ) {
			echo var_export($accessToken, false) . "\n";

			return $accessToken;
		} else {
			$this->out("could not get the access token.\n");
		}
	}

	function createConsumer() {
		return new OAuth_Consumer(YOUR_CONSUMER_KEY, YOUR_CONSUMER_SECRET);
	}

}
?>


post_tweet.php
<?php
/*
./cakephp_1.2.6/cake/console/cake -app 0/app post_tweet
*/
App::import('Vendor', 'oauth', array('file' => 'OAuth'.DS.'oauth_consumer.php'));

include_once "oauthapp.inc.php";

class PostTweetShell extends Shell {

	var $isDebug = false;
	var $isTweet = true;

	public $uses = array();

	var $curtime;
	var $dateTimeZoneJapan;
	var $dateTimeJapan;

	var $toolroot = "";
	var $logfilename = "";

	var $consumer;
	var $access_token = "";
	var $access_token_secret = "";

	function __construct($dispatch) {

		parent::__construct($dispatch);

		$this->out( "---------------------------------------------------------------");
		$this->out( "START: " . __CLASS__ . " at " . date('Y-m-d H:i:s') );

		$this->curtime = time();
		$this->curtime = intval($this->curtime / 60 ) * 60;

		$this->dateTimeZoneJapan = new DateTimeZone("Asia/Tokyo");
		$this->dateTimeJapan = new DateTime("now", $this->dateTimeZoneJapan);


		$this->consumer = $this->createConsumer();


		$this->access_token = "";
		$this->access_token_secret = "";
		if ( count($this->args) == 2 ) {
			$this->access_token = $this->args[0];
			$this->access_token_secret = $this->args[1];
		}
		if ( isset($this->params["debug"]) ) {
			$this->isDebug = true;
		}
		if ( isset($this->params["notweet"]) ) {
			$this->isTweet = false;
			$this->isDebug = true;
		}

		if ( $this->isDebug ) {
			$this->out( "---------------------------------------------------------------");
			$this->out( "-- params --");
			$this->out( var_export($this->params,true) );
			$this->out( "-- args --");
			$this->out( var_export($this->args,true) );
			$this->out( "---------------------------------------------------------------");
		}
	}

	function main() {

		$this->out("TEST: " . date('Y-m-d H:i:s') );
		$this->out( "-- params --");
		$this->out( var_export($this->params,true) );
		$this->out( "-- args --");
		$this->out( var_export($this->args,true) );

		$access_token = "";
		$access_token_secret = "";
		if ( count($this->args) == 2 ) {
			$access_token = $this->args[0];
			$access_token_secret = $this->args[1];
		}

		$this->twitter_post($access_token,$access_token_secret,'hello worldddd!'." TEST:" . date('Y-m-d H:i:s'));

	}

	function twitter_post($access_token=null,$access_token_secret=null,$message="") {
		$access_token = empty($access_token) ? $this->access_token : $access_token;
		$access_token_secret = empty($access_token_secret) ? $this->access_token_secret : $access_token_secret;

		$this->out("message =");
		$this->out("{$message}");
		if ( $this->isTweet ) {
			$ret = $this->consumer->post($access_token, $access_token_secret, 'http://twitter.com/statuses/update.json', array('status' => $message ));
			$ret = json_decode($ret);
		} else {
			$ret = "-- do not tweet by params --";
		}
		if ( isset($ret->error) ) {
			// ERROR
			$this->out( var_export("!!! error !!!",true) );
			$this->out( var_export($ret->error,true) );
		}
		if ( $this->isDebug ) {
			$this->out("result =");
			$this->out( var_export($ret,true) );
		}
		return $ret;
	}

	function createConsumer() {
		return new OAuth_Consumer(YOUR_CONSUMER_KEY, YOUR_CONSUMER_SECRET);
	}

}
?>

タグ:cakephp Twitter
nice!(0)  コメント(4)  トラックバック(1) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 4

五本指 シューズ

ビブラム 5本指 の裸足感覚は、一般的に身体に良いと言われています。多くの専門家によれば、靴は、足先や脚を保護してはいるが足腰の筋肉を弱くし、発達が遅れたり、怪我をしやすい状態にもしているとも言っています。いろいろな環境によって、足を保護する(靴を履く)ことは不可欠です。ですが、それと同時に足を刺激し鍛えることも重要なのです。 そこで、私達はVibram 2010 newを薦めています。http://www.vibram-fivefingers-outlet.com
by 五本指 シューズ (2011-01-28 16:55) 

五本指 靴

そのままだとクライアントアプリでは使えなかったので少し改良。
by 五本指 靴 (2011-08-18 00:31) 

UGGブーツ

とても面白い文章。 どのように滑稽なたくさんの異なっている方式を使うことができそれの歴史を転換させられます。 しかしこれらの写真はきっと私達に私達はそれのあの手がかりから、私の推測による真実なストーリを分かるできます。
by UGGブーツ (2011-10-08 17:44) 

グッチ バッグ

There is no doubt that the market for designer handbags is enormous. High quality, durability and perfect style Gucci Bags lead a fashion trend in the world. Wholesale Gucci Purses attract more and more people.
http://www.guccijapan.com
by グッチ バッグ (2012-01-09 12:42) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 1

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。