「PHPによるwebアプリケーションスーパーサンプル活用編」という本を見ながらtwitter連携アプリを作ってます。


以下のコード、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 "ここまできてくれ";

(以下端折る)
}

}

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2012/05/23 13:15:18
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:rouge_2008 No.1

回答回数595ベストアンサー獲得回数351

ポイント100pt

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」を設定していない場合は、設定して試してみてください。)

id:rouge_2008

回答を追記しました。

2012/05/22 12:03:45
id:rouge_2008

誤字・脱字が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/23 03:02:15

その他の回答1件)

id:rouge_2008 No.1

回答回数595ベストアンサー獲得回数351ここでベストアンサー

ポイント100pt

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」を設定していない場合は、設定して試してみてください。)

id:rouge_2008

回答を追記しました。

2012/05/22 12:03:45
id:rouge_2008

誤字・脱字が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/23 03:02:15
id:pretaroe No.2

回答回数531ベストアンサー獲得回数75

ポイント10pt

>define('CALLBACK_URL','http://127.0.0.1/php/pear/tw.php’);

CALLBACK_URLがローカルアドレスというのが、ますいのでは?

  • id:rouge_2008
    何かエラーが表示されるのですか?
    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
  • id:tomoko2
    エラーも何も表示されません。
    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;
    }

    }

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません