以下のコード、getRequestTokenを呼んだ後返ってこないらしく(echoの "ここまできてくれ"が出力されない)twitter側で変なのか、私のコードや環境が変なのか、レビューしていただきたくどうかよろしくお願いいたします。
MAMPには以下のPEAR入り。
---
HTTP_OAuth 0.2.3 alpha
HTTP_Request2 2.1.1 stable
Net_URL2 2.0.0 stable
PEAR 1.9.4 stable
Services_Twitter 0.6.3 beta
---
以下、コード
<?php
define('CONSUMER_KEY','私のconsumer key');
define('CONSUMER_SECRET','私のconsumer secret');
define('GET_REQUEST_TOKEN','https://api.twitter.com/oauth/request_token');
define('CALLBACK_URL','http://127.0.0.1/php/pear/tw.php');
require_once('Services/Twitter.php');
require_once('HTTP/OAuth/Consumer.php');
try{
session_start();
if(
empty($_SESSION['request_token']) &&
empty($_SESSION['access_token'])
){
$oauth=new HTTP_OAuth_Consumer(CONSUMER_KEY,CONSUMER_SECRET);
$request_token_info = $oauth->getRequestToken(GET_REQUEST_TOKEN, CALLBACK_URL);
echo "ここまできてくれ";
(以下端折る)
}
}
SSL接続のためのコードになっていないのが原因のようですので、GET_REQUEST_TOKEN(Request token URL)をhttps://からhttp://に変更すると処理が続行されると思います。
GET_REQUEST_TOKEN(Request token URL)をそのままにして、SSL接続するためには次のようにします。
$oauth = new HTTP_OAuth_Consumer(CONSUMER_KEY, CONSUMER_SECRET); // SSL接続の準備 ※ここから追加 $http_request = new HTTP_Request2(); $http_request->setConfig('ssl_verify_peer', false); $consumer_request = new HTTP_OAuth_Consumer_Request; $consumer_request->accept($http_request); $oauth->accept($consumer_request); // ここまで追加 $oauth->getRequestToken(GET_REQUEST_TOKEN, CALLBACK_URL);
http://www.msng.info/archives/2010/01/twitter_api_oauth_with_php.php
※try~catchを正しく実行すると解決の糸口になります。
http://php.net/manual/ja/language.exceptions.php
とりあえず現在問題が発生している箇所についてだけですが、以降の処理で問題が発生する場合は、回答への返信で知らせてください。
【追記】※再修正してあります。現在のコードのままではgetAccessToken()で失敗するかもしれませんので、次のコードを追加してください。
※コメントの一つ目のページ(http://blog.mach3.jp/2010/10/pear-twitter-oauth.html)とこの回答で紹介しているページのコードでは記述されています。
「$oauth = new HTTP_OAuth_Consumer(CONSUMER_KEY, CONSUMER_SECRET, $_SESSION['request_token'], $_SESSION['request_token_secret']);」でセットされているはずですので、以下のコードは追記しなくても大丈夫です。
(参考:HTTP_OAuth_Consumer Construct
http://pear.php.net/package/HTTP_OAuth/docs/latest/__filesource/fsource_HTTP_OAuth__HTTP_OAuth-0.2.3HTTPOAuthConsumer.php.html#a137)
// リクエストトークンを$oauthにセット $oauth->setToken($_SESSION['request_token']); $oauth->setTokenSecret($_SESSION['request_token_secret']); //アクセストークンを取得 $oauth->getAccessToken('http://twitter.com/oauth/access_token', $_GET['oauth_verifier']);
※処理が進んだのを確認できたら、「header('Location:'.$url);」の前の echo および var_dump() はすべてコメントアウトしてください。(出力を停止しないと、『Cannot modify header information - headers already sent by ~』が表示されますので、コメントアウト等して出力停止後にセッションを破棄してからやり直してみてください。)
※なお、ローカル環境で動作確認できていますので、コールバックURLは問題ないはずです。(アプリケーションのSettingsで「Callback URL」を設定していない場合は、設定して試してみてください。)
>define('CALLBACK_URL','http://127.0.0.1/php/pear/tw.php’);
CALLBACK_URLがローカルアドレスというのが、ますいのでは?
getRequestToken()実行後にすぐechoしているのでしたら、表示されるはずだと思いますが・・・
セッションrequest_tokenおよびaccess_tokenがあるため、以降の処理が実行されていないだけではないですか?
if(empty($_SESSION['request_token']) && empty($_SESSION['access_token'])){
elseの場合(セッションがある時)の記述はどのようになっているのでしょうか?
ブラウザを再起動してセッションを破棄してから、動作確認してみてください。
次の記事が分かりやすいのではないかと思います。
http://blog.mach3.jp/2010/10/pear-twitter-oauth.html
http://linux.ohwada.jp/modules/smartsection/item.php?itemid=498
echo"あああ";
getRequestToken()...;
echo"いいい";
とすると「あああ」は出力されますが「いいい」は出力されません。
全体の構成は以下の通りです。
echo "各トークン未取得の場合"; も var_dump($oauth); も出力されますが、
echo "ここまできてくれ";が出力されません。。。
try{
session_start();
//各トークン未取得の場合
if(
empty($_SESSION['request_token']) &&
empty($_SESSION['access_token'])
){
echo "各トークン未取得の場合";
//HTTP_OAuth_Consumerインスタンスを作成
$oauth=new HTTP_OAuth_Consumer(CONSUMER_KEY,CONSUMER_SECRET);
var_dump($oauth);
//リクエストトークン取得
$request_token_info = $oauth->getRequestToken(GET_REQUEST_TOKEN,CALLBACK_URL);
echo "ここまできてくれ";
var_dump($request_token_info);
$_SESSION['request_token']=$oauth->getToken(); //リクエストトークン格納
$_SESSION['request_token_secret']=$oauth->getTokenSecret(); //リクエストトークンシークレット格納
//OAuth認証ページへリダイレクト
$url=$oauth->getAuthorizeUrl(
'http://twitter.com/oauth/authorize'
);
header('Location:'.$url);
exit;
}
//リクエストトークン取得済み、アクセストークン未取得の場合
if(
isset($_SESSION['request_token'],$_GET['oauth_verifier'])&&
empty($_SESSION['access_token'])
){
echo "リクエストトークン取得済み、アクセストークン未取得の場合です";
//各パッケージクラスのインスタンスを作成
$twitter=new Services_Twitter;
$oauth=new HTTP_OAuth_Consumer(
CONSUMER_KEY,
CONSUMER_SECRET,
$_SESSION['request_token'],
$_SESSION['request_token_secret']
);
//アクセストークンを取得
$oauth->getAccessToken(
'http://twitter.com/oauth/access_token',
$_GET['oauth_verifier']
);
$_SESSION['access_token']=$oauth->getToken(); //アクセストークン格納
$_SESSION['access_token_secret']=$oauth->getTokenSecret(); //アクセストークンシークレット格納
//リクエストトークンの割当を解除
unset($_SESSION['request_token']);
unset($_SESSION['request_token_secret']);
}
//アクセストークン取得済みの場合
if(
isset($_SESSION['access_token'])
){
echo "アクセストークン取得済みの場合です";
//各パッケージクラスのインスタンスを作成
$twitter=new Services_Twitter;
$oauth=new HTTP_OAuth_Consumer(
CONSUMER_KEY,
CONSUMER_SECRET,
$_SESSION['access_token'],
$_SESSION['access_token_secret']
);
//OAuth認証でツイッターにアクセス
$twitter->setOAuth($oauth);
echo "フォーム作成します";
twForm(); //フォーム作成
//メッセージが入力されて「tweet」が押されたらtweetする
if(isset($_POST['tweet'])&&0<@strln($_POST['tw_msg'])){
$twitter->statuses->update($_POST['tw_msg']);
echo "tweetしました";
}
else if(isset($_POST['timeline'])){
//「timeline」が押されたら、最新10件のタイムラインを取得
$resutl=$twitter->statuses->home_timeline(array('count'=>10));
echo '<pre>';
print_r($result);
echo '<pre>';
}
exit;
}
}