こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHPのPEARのServices_Twitterのエラーについて

PHPのPEARのServices_Twitterのエラーについて

PHPでtwitterAPIを扱いたいと思い、PEARのServices_Twitterを使っています。
しかし、どのようなスクリプトを書いても、「Unsupported endpoint statuses」という
エラーメッセージが出る一方で、動きません。

スクリプトミスの可能性も当然あるのですが、多くのWEBサイトにある多数の
スクリプトサンプルを試してみたのですが、全て上記エラーのみが表示される状況で、
スクリプトミスというのがすこし考えがたい状況です。

レンタルサーバを使っていまして、twitterAPIへは、OAuth認証の結果をもとに、
Services_Twitterのインスタンスを作成しています。
Services_Twitter自体はしっかり動いているので、
インクルードのミスなどはないと思いますが、レンタルサーバはPEARないので、
手動インストールしてインクルードしています。

以上の状況から、スクリプトミスではない場合、考えられるエラー原因について
想定できることがありましたら、教えていただけると嬉しいです。

ご報告内容が不足している場合は、申し訳ございません。
ご指摘いただければ幸いです。

それでは、恐れ入りますが、宜しくお願いいたします。

投稿日時 - 2010-05-08 23:38:50

QNo.5881566

すぐに回答ほしいです

質問者が選んだベストアンサー

(一部問題はありましたが)こちらでは提示されたコードも
問題なく動作しました。
ライブラリ等は正常に読み込まれているでしょうか?
『Unsupported』とありますので、サポートされていない
関数か何かを呼び出しているのだと思いますが・・・

Services_Twitterは「Services」以下のフォルダだけでなく、
「data」フォルダも必要ですが、すべてきちんとアップロード
してありますか?
※Servicesフォルダと同階層にアップしてある必要があります。


一部問題があった件についてですが、以下の部分になります。

// get recent posts on public timeline
$response = $twitter->statuses->public_timeline();
if (count($response->status) > 0) {
echo '<h2>Recent public timeline updates</h2>';
foreach ($response->status as $status) {


このままだと取得したタイムラインが表示されませんので、
以下のように修正します。

// get recent posts on public timeline
$response = $twitter->statuses->public_timeline();
if (count($response) > 0) {
echo '<h2>Recent public timeline updates</h2>';
foreach ($response as $status) {

※修正するのは2行だけです。
(「$response->status」を「$response」にしてあります。)


それから、気になった事なのですが、Services_Twitterと
HTTP_OAuthの組み合わせの他に、twitteroauthを使用して
いますが、どちらか一つに統一してはいかがでしょうか?

Services_TwitterとHTTP_OAuthの組み合わせで利用する場合
は、以下のコードを修正していけば良いと思います。
http://zuzara.com/blog/2010/01/20/complete-working-sample-for-services_twitter-oauth-in-php-pear/
※「http://zuzara.com/twitter_oauth.php」は、自分のアプリ
のURLに変更します。
※「http_redirect()」が使用できない場合は、「header()」が
代用できます。

投稿日時 - 2010-05-10 00:58:56

お礼

丁寧にご教示いただきましてありがとうございました。お礼が遅くなり申し訳ございません。
ご指摘いただいた内容を修正させていただいた試したところ、エラー内容が変わりまして、「Call to undefined function json_decode() 」となりました。これは、現在使っているServer QueenというレンタルサーバのPHPバージョンが古くServices_Twitterで使用しているjson_decode()という関数が使えずに、エラーになっているようです。PHPのバージョンアップが出来れば上記エラーもなくなり、ご指摘いただいた内容でうまくいきそうです。別の環境でも試してみます。ありがとうございました。

投稿日時 - 2010-05-16 20:20:43

ANo.2

このQ&Aは役に立ちましたか?

14人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

「Unsupported endpoint statuses」の後ろはどのようなエラーに
なっていますか?

「Unsupported endpoint statuses/getHomeTimeline」なら
「$xxxxx->statuses->home_timeline();」に、
「Unsupported endpoint statuses/getPublicTimeline」なら
「$xxxxx->statuses->public_timeline();」にという具合で
コードを修正してみてください。
※その他のエラーの場合も同じように修正する必要があると
思います。

http://www.yuigahama.org/?p=315
http://apiwiki.twitter.com/Twitter-API-Documentation

投稿日時 - 2010-05-09 01:39:56

補足

Unsupported endpoint statusesの後ろには何もついていない状況なのですが、これはエラーの出し方がおかしいのでしょうか?長くて恐縮ですが、私が作成したスクリプトを下記に掲載させていただきますので、可能な範囲で結構ですので、ご確認いただければ幸いです。

<?php
session_start();
require_once("inc/twitteroauth.php");

/* OAuth Data */
define("CONSUMER_KEY", "********");
define("CONSUMER_SECRET", "********");

//startボタンが押された場合
if (isset($_POST["start"])){
//リクエストトークン取得、ユーザ承認
$rdurl = TokenInit();
$rdurl = sprintf("Location: %s", $rdurl);
header($rdurl);

//アクセストークン取得
}elseif(($_SESSION['status'] == 'READY') && $_GET["oauth_token"]){
AccessToken();
require_once("inc/Services/Twitter.php");
require_once("inc/HTTP/OAuth/Consumer.php");

//twitter操作(Services_Twitter)
try{
$twitter = new Services_Twitter();
$oauth = new HTTP_OAuth_Consumer(CONSUMER_KEY, CONSUMER_SECRET, $_SESSION['AccessToken'], $_SESSION['AccessTokenSec']);
$twitter->setOAuth($oauth);

// get recent posts on public timeline
$response = $twitter->statuses->public_timeline();
if (count($response->status) > 0) {
echo '<h2>Recent public timeline updates</h2>';
foreach ($response->status as $status) {
echo '<div class="item"><img src="' . $status->user->profile_image_url . '" class="img" />';
echo $status->text . '<br/>';
echo 'By: <em>' . $status->user->screen_name . '</em> on ' . $status->created_at . '</div>';
}
}
} catch (Services_Twitter_Exception $e) {
echo $e->getMessage();
}

//初期画面
}else{
print<<<END
<form action="login.php" method="post">
<p>Services Twitter Test</p>
<input type="submit" name="start" value="START" />
</form>
END;
}

※functionは別途記載いたします。

投稿日時 - 2010-05-09 20:18:32

お礼

/* 認証初期化 */
function TokenInit() {
//OAuth接続初期化
$tOAuth = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
//認証トークン取得
$getToken = $tOAuth->getRequestToken();
//認証トークン格納
$_SESSION['RequestToken'] = $getToken['oauth_token'];
//認証トークン格納
$_SESSION['RequestTokenSec'] = $getToken['oauth_token_secret'];
//ステータス更新
$_SESSION['status'] = 'READY';
//リクエストリンク生成
return $tOAuth->getAuthorizeURL($getToken['oauth_token']);
}

/* アクセス認証 */
function AccessToken() {
//OAuth接続初期化
$tOAuth = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET,
$_SESSION['RequestToken'], $_SESSION['RequestTokenSec']);
//アクセストークン取得
$getToken = $tOAuth->getAccessToken();
//アクセストークン格納
$_SESSION['AccessToken'] = $getToken['oauth_token'];
//アクセストークン格納
$_SESSION['AccessTokenSec'] = $getToken['oauth_token_secret'];
}
?>

お礼画面への追記で大変恐縮です。上記がfunctionの全てです。色々とありがとうございます。可能な範囲で教えていただければ幸いです。

投稿日時 - 2010-05-09 20:21:35

あなたにオススメの質問