以下のコード、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」を設定していない場合は、設定して試してみてください。)
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」を設定していない場合は、設定して試してみてください。)
回答を追記しました。
誤字・脱字が3箇所ありました。
フォームから送信された文字列の長さを数える関数の間違いと、タイムラインの取得時の代入先の変数名の間違い(※表示時の変数名と異なる)と、動作には関係ありませんが、表示確認後のpreの閉じタグがない事の3つです。
正しくは次のようになります。
if(isset($_POST['tweet']) && 0 < @strlen($_POST['tw_msg'])){
$result = $twitter->statuses->home_timeline(array('count'=>10));
print_r($result); echo '</pre>';
他には特に問題なさそうですので、提示されたコードで正常に動作するはずです。
(「twForm()」の内容が不明ですが、作成されるフォームが問題なければ大丈夫だと思います。)
回答を追記しました。
2012/05/22 12:03:45誤字・脱字が3箇所ありました。
フォームから送信された文字列の長さを数える関数の間違いと、タイムラインの取得時の代入先の変数名の間違い(※表示時の変数名と異なる)と、動作には関係ありませんが、表示確認後のpreの閉じタグがない事の3つです。
正しくは次のようになります。
2012/05/23 03:02:15他には特に問題なさそうですので、提示されたコードで正常に動作するはずです。
(「twForm()」の内容が不明ですが、作成されるフォームが問題なければ大丈夫だと思います。)