CakePHPとTwitterとOAuth [コンピュータ]
CakePHPのシェルからTwitterへOAuthで投稿のメモ
(アプリの登録とかは他のサイトを参照して)
CakePHPのバージョンは1.2.6
ここ http://code.42dh.com/oauth/ から
OAuth consumer classをダウンロードし、cakeコアの vendors\OAuth に解凍する。
そのままだとクライアントアプリでは使えなかったので少し改良。
(パラメータの取得あたり)
oauth_consumer.php
app\vendors\shells に oauthapp.inc.php を作成する。
oauthapp.inc.php
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 :アプリケーションディレクトリ
こんな風に出力され、入力待ちになるので
http://twitter.com/oauth/authorize?oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
をブラウザで表示してPINを取得し、数字を入力しEnter
最後の2行をメモっとく。
投稿してみる
post_tweet.php(ソースは後半)を実行。
引数に上で得られた二つを与える。
こんな感じで。
以上。
ソース
oauthapp.inc.php
getaccesstoken.php
post_tweet.php
(アプリの登録とかは他のサイトを参照して)
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); } } ?>
ビブラム 5本指 の裸足感覚は、一般的に身体に良いと言われています。多くの専門家によれば、靴は、足先や脚を保護してはいるが足腰の筋肉を弱くし、発達が遅れたり、怪我をしやすい状態にもしているとも言っています。いろいろな環境によって、足を保護する(靴を履く)ことは不可欠です。ですが、それと同時に足を刺激し鍛えることも重要なのです。 そこで、私達はVibram 2010 newを薦めています。http://www.vibram-fivefingers-outlet.com
by 五本指 シューズ (2011-01-28 16:55)
そのままだとクライアントアプリでは使えなかったので少し改良。
by 五本指 靴 (2011-08-18 00:31)
とても面白い文章。 どのように滑稽なたくさんの異なっている方式を使うことができそれの歴史を転換させられます。 しかしこれらの写真はきっと私達に私達はそれのあの手がかりから、私の推測による真実なストーリを分かるできます。
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)