Skip to content

Instantly share code, notes, and snippets.

@cherenkov
Created July 16, 2012 04:07
Show Gist options
  • Save cherenkov/3120453 to your computer and use it in GitHub Desktop.
Save cherenkov/3120453 to your computer and use it in GitHub Desktop.
「・・・Twitter APIを勉強しています」 http://q.hatena.ne.jp/134.. - 人力検索はてな http://q.hatena.ne.jp/1342403785
取り敢えず、前回の質問にあった http://1811way.com/work008/sample&source.txt を動かしてみました。
(回答時はちゃんと読んでいませんでした。スミマセン)
前回のエラーメッセージ、
「Warning: include(HTTP/OAuth/Consumer.php) [function.include]: failed to open stream: No such file or directory in C:\Tools\htdocs\twitterapi\twitter_oauth.php on line 25」
などは、
include 'HTTP/OAuth/Consumer.php';
したときにPEARのパスが通っていなかったのでHTTP_OAuthが読み込めていないというものです。
まずこれを直していきます。
今回、PEARライブラリの導入にpearコマンドは使わない方法で進めます。
(レンタルサーバなどで使えなかったり、コマンド一発でインストールできない場合もあるので)
まずファイルの位置関係を確認。
twitter_oauth.php
PEARフォルダ
HTMLフォルダ
OAuthフォルダ (HTML_OAuth)
Request2フォルダ (HTTP_Request2)
OAuth.php (HTML_OAuth)
Request2.php (HTTP_Request2)
Netフォルダ
URL2.php (Net_URL2)
include_path.php
include_path.phpは以下の内容。include_path.phpがある場所をパスに追加する働き。
-------
<?php
define('PEAR_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
set_include_path(PEAR_PATH . PATH_SEPARATOR . get_include_path());
-------
参考:
CakePHP で PEAR (Services_Twitter) を使う方法 | ウェブル
http://weble.org/2010/04/11/cakephp-pear
Manual :: 共有ホストでの PEAR のローカルコピーのインストール
http://pear.php.net/manual/ja/installation.shared.php
twitter_oauth.phpでは以下のようにする。
include 'PEAR/include_path.php'; //独自に設置したPEARフォルダのpathを通す
include 'HTTP/OAuth/Consumer.php'; //正しく読み込まれるはず
これで一応動作確認ができました。
PEARライブラリの読み込みなんてものは、パスが通っている場所からただファイルを呼び出しているだけと分かっていただけたら、
include_path.phpの仕組みを使わずに、
http://q.hatena.ne.jp/1341977178#a1155952
にある通りphp.iniで元々設定されている C:\php5\PEAR\ などにPEARライブラリをコピーするだけでもいいと思います。
Twitter OAuth sample
--以下エラーメッセージ
Warning: include(HTTP/OAuth/Consumer.php) [function.include]: failed to open stream: No such file or directory in C:\Tools\htdocs\twitterapi\twitter_oauth.php on line 25
Warning: include() [function.include]: Failed opening 'HTTP/OAuth/Consumer.php' for inclusion (include_path='.;C:\php5\includes;C:\php5\PEAR;C:\ZendFramework\library') in C:\Tools\htdocs\twitterapi\twitter_oauth.php on line 25
Fatal error: Class 'HTTP_OAuth_Consumer' not found in C:\Tools\htdocs\twitterapi\twitter_oauth.php on line 28
--エラーメッセージ以上
--以下ダウンロードした「twitter_oauth.php」のソースプログラム
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Twitter OAuth sample</title>
</head>
<body>
<h1>Twitter OAuth sample</h1>
<?php
//セッションスタート
session_start();
//コールバックURLを設定
$url = 'None';
//consumer_keyを設定
$consumer_key = '***************************';
//consumer_secretを設定
$consumer_secret = '*************************';
//HTTP_OAuthライブラリを読み込む
include 'HTTP/OAuth/Consumer.php';
//HTTP_OAuthを利用するための各種設定
$consumer = new HTTP_OAuth_Consumer($consumer_key, $consumer_secret);
$http_request = new HTTP_Request2();
$http_request->setConfig('ssl_verify_peer', false);
$consumer_request = new HTTP_OAuth_Consumer_Request;
$consumer_request->accept($http_request);
$consumer->accept($consumer_request);
//Twitter認証済みかチェック
if( isset($_SESSION['access_token']) ){
//認証済みの場合
//状態チェック
if( isset($_GET['logout']) ){
//ログアウトする場合
if($_GET['logout'] == 'on'){
//セッションを破棄する
session_destroy();
//ログアウト表示
echo '<a href="'.$url.'">ログアウトしました。ここをクリックしてください。</a>';
}
}else if( isset($_POST['q']) && ($_POST['q'] != "") ){
//フォームからつぶやきが投稿されていた場合
//保存しておいたアクセストークンを読み出して設定する
$consumer->setToken($_SESSION['access_token']);
$consumer->setTokenSecret($_SESSION['access_token_secret']);
//つぶやき内容を設定
$status = $_POST['q'];
//APIを利用してツイッターに投稿
$response = $consumer->sendRequest("http://api.twitter.com/1/statuses/update.xml", array('status' => $status), "POST");
//レスポンスXMLを解析する
$xml = simplexml_load_string($response->getBody());
if(isset($xml->id)){
//無事投稿できていたら、投稿内容を確認するリンクを表示
echo '<a href="http://twitter.com/'.$xml->user->screen_name.'/status/'.$xml->id.'">投稿内容を確認する</a>';
}else{
//投稿できなかった場合はエラー表示
echo 'うまく投稿できなかったようです。<br>';
echo $response->getBody();
}
}else{
//それ以外の場合
//つぶやきフォームを表示
echo <<<postform
<p>いまどうしてる?</p>
<form method="POST" action="twitter_oauth.php">
<input type="text" name="q" size="80">
<input type="submit" value="ツイート">
</form>
<p><a href="twitter_oauth.php?logout=on">ログアウトしたい場合はこちら</a></p>
postform;
//保存しておいたアクセストークンを読み出して設定する
$consumer->setToken($_SESSION['access_token']);
$consumer->setTokenSecret($_SESSION['access_token_secret']);
//APIを利用してホームタイムラインを取得
$response = $consumer->sendRequest("http://api.twitter.com/1/statuses/home_timeline.xml", array('count' => '20'), "GET");
//ユーザータイムラインを取得
// $response = $consumer->sendRequest("http://api.twitter.com/1/statuses/user_timeline.xml", array('count' => '20','screen_name' => 'zapa'), "GET");
//APIを利用してmentionsを取得
// $response = $consumer->sendRequest("http://api.twitter.com/1/statuses/mentions.xml", array('count' => '20'), "GET");
//APIを利用してあなたのリツイートを取得
// $response = $consumer->sendRequest("http://api.twitter.com/1/statuses/retweeted_by_me.xml", array('count' => '20'), "GET");
//APIを利用してみんなのリツイートを取得
// $response = $consumer->sendRequest("http://api.twitter.com/1/statuses/retweeted_to_me.xml", array('count' => '20'), "GET");
//APIを利用してリツイートされたあなたのツイートを取得
// $response = $consumer->sendRequest("http://api.twitter.com/1/statuses/retweets_of_me.xml", array('count' => '20'), "GET");
//APIを利用してお気に入りを取得
// $response = $consumer->sendRequest("http://api.twitter.com/1/favorites.xml", array('id' => 'zapa'), "GET");
//APIを利用してリストを取得
// $response = $consumer->sendRequest("http://api.twitter.com/1/amntwit/lists/amnpartnerlist/statuses.xml", array('per_page' => '20'), "GET");
//レスポンスXMLを解析する
$xml = simplexml_load_string($response->getBody());
if(isset($xml->status->id)){
//無事取得できていたら、内容を表示する
foreach($xml->status as $status){
echo '<img src="'.$status->user->profile_image_url.'" width=48 height=48> ';
echo '<a href="http://twitter.com/'.$status->user->screen_name.'">'.$status->user->screen_name.'</a>:';
echo $status->text;
echo ' <a href="http://twitter.com/'.$status->user->screen_name.'/status/'.$status->id.'">'.$status->created_at."</a><br>\n";
}
}else{
//投稿できなかった場合はエラー表示
echo 'うまく取得できなかったようです。<br>';
echo '<pre>'.htmlspecialchars($response->getBody(), ENT_QUOTES).'</pre>';
}
}
}else{
//認証済みでない場合
//Twitterからのコールバックかチェック
if( isset($_GET['oauth_verifier']) ){
//Twitterからのコールバックの場合
//oauth_verifierを取得する
$verifier = $_GET['oauth_verifier'];
//保存しておいたリクエストトークンを読み出して設定する
$consumer->setToken($_SESSION['request_token']);
$consumer->setTokenSecret($_SESSION['request_token_secret']);
//アクセストークンを取得する
$consumer->getAccessToken('https://twitter.com/oauth/access_token', $verifier);
//アクセストークンをセッションに保存
$_SESSION['access_token'] = $consumer->getToken();
$_SESSION['access_token_secret'] = $consumer->getTokenSecret();
//認証完了表示
echo '<a href="'.$url.'">認証完了。ここをクリックしてください。</a>';
}else{
//認証済みでなく、Twitterからのコールバックでもない場合
//リクエストトークンを取得
$callback = $url;
$consumer->getRequestToken('https://twitter.com/oauth/request_token', $callback);
//リクエストトークンをセッションに保存
$_SESSION['request_token'] = $consumer->getToken();
$_SESSION['request_token_secret'] = $consumer->getTokenSecret();
//認証用URLを取得
$auth_url = $consumer->getAuthorizeUrl('https://twitter.com/oauth/authorize');
//認証用URLのリンクを表示
echo '<a href="'.$auth_url.'">Twitterで認証する</a><br>';
}
}
?>
<hr>
</body>
</html>
--以上
Twitter OAuth sample
--以下エラーメッセージ
Warning: include(HTTP/OAuth/Consumer.php) [function.include]: failed to open stream: No such file or directory in C:\Tools\htdocs\twitterapi\twitter_oauth.php on line 25
Warning: include() [function.include]: Failed opening 'HTTP/OAuth/Consumer.php' for inclusion (include_path='.;C:\php5\includes;C:\php5\PEAR;C:\ZendFramework\library') in C:\Tools\htdocs\twitterapi\twitter_oauth.php on line 25
Fatal error: Class 'HTTP_OAuth_Consumer' not found in C:\Tools\htdocs\twitterapi\twitter_oauth.php on line 28
--エラーメッセージ以上
--以下ダウンロードした「twitter_oauth.php」のソースプログラム
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Twitter OAuth sample</title>
</head>
<body>
<h1>Twitter OAuth sample</h1>
<?php
//セッションスタート
session_start();
//コールバックURLを設定
$url = 'None';
//consumer_keyを設定
$consumer_key = '***************************';
//consumer_secretを設定
$consumer_secret = '*************************';
//HTTP_OAuthライブラリを読み込む
include 'HTTP/OAuth/Consumer.php';
//HTTP_OAuthを利用するための各種設定
$consumer = new HTTP_OAuth_Consumer($consumer_key, $consumer_secret);
$http_request = new HTTP_Request2();
$http_request->setConfig('ssl_verify_peer', false);
$consumer_request = new HTTP_OAuth_Consumer_Request;
$consumer_request->accept($http_request);
$consumer->accept($consumer_request);
//Twitter認証済みかチェック
if( isset($_SESSION['access_token']) ){
//認証済みの場合
//状態チェック
if( isset($_GET['logout']) ){
//ログアウトする場合
if($_GET['logout'] == 'on'){
//セッションを破棄する
session_destroy();
//ログアウト表示
echo '<a href="'.$url.'">ログアウトしました。ここをクリックしてください。</a>';
}
}else if( isset($_POST['q']) && ($_POST['q'] != "") ){
//フォームからつぶやきが投稿されていた場合
//保存しておいたアクセストークンを読み出して設定する
$consumer->setToken($_SESSION['access_token']);
$consumer->setTokenSecret($_SESSION['access_token_secret']);
//つぶやき内容を設定
$status = $_POST['q'];
//APIを利用してツイッターに投稿
$response = $consumer->sendRequest("http://api.twitter.com/1/statuses/update.xml", array('status' => $status), "POST");
//レスポンスXMLを解析する
$xml = simplexml_load_string($response->getBody());
if(isset($xml->id)){
//無事投稿できていたら、投稿内容を確認するリンクを表示
echo '<a href="http://twitter.com/'.$xml->user->screen_name.'/status/'.$xml->id.'">投稿内容を確認する</a>';
}else{
//投稿できなかった場合はエラー表示
echo 'うまく投稿できなかったようです。<br>';
echo $response->getBody();
}
}else{
//それ以外の場合
//つぶやきフォームを表示
echo <<<postform
<p>いまどうしてる?</p>
<form method="POST" action="twitter_oauth.php">
<input type="text" name="q" size="80">
<input type="submit" value="ツイート">
</form>
<p><a href="twitter_oauth.php?logout=on">ログアウトしたい場合はこちら</a></p>
postform;
//保存しておいたアクセストークンを読み出して設定する
$consumer->setToken($_SESSION['access_token']);
$consumer->setTokenSecret($_SESSION['access_token_secret']);
//APIを利用してホームタイムラインを取得
$response = $consumer->sendRequest("http://api.twitter.com/1/statuses/home_timeline.xml", array('count' => '20'), "GET");
//ユーザータイムラインを取得
// $response = $consumer->sendRequest("http://api.twitter.com/1/statuses/user_timeline.xml", array('count' => '20','screen_name' => 'zapa'), "GET");
//APIを利用してmentionsを取得
// $response = $consumer->sendRequest("http://api.twitter.com/1/statuses/mentions.xml", array('count' => '20'), "GET");
//APIを利用してあなたのリツイートを取得
// $response = $consumer->sendRequest("http://api.twitter.com/1/statuses/retweeted_by_me.xml", array('count' => '20'), "GET");
//APIを利用してみんなのリツイートを取得
// $response = $consumer->sendRequest("http://api.twitter.com/1/statuses/retweeted_to_me.xml", array('count' => '20'), "GET");
//APIを利用してリツイートされたあなたのツイートを取得
// $response = $consumer->sendRequest("http://api.twitter.com/1/statuses/retweets_of_me.xml", array('count' => '20'), "GET");
//APIを利用してお気に入りを取得
// $response = $consumer->sendRequest("http://api.twitter.com/1/favorites.xml", array('id' => 'zapa'), "GET");
//APIを利用してリストを取得
// $response = $consumer->sendRequest("http://api.twitter.com/1/amntwit/lists/amnpartnerlist/statuses.xml", array('per_page' => '20'), "GET");
//レスポンスXMLを解析する
$xml = simplexml_load_string($response->getBody());
if(isset($xml->status->id)){
//無事取得できていたら、内容を表示する
foreach($xml->status as $status){
echo '<img src="'.$status->user->profile_image_url.'" width=48 height=48> ';
echo '<a href="http://twitter.com/'.$status->user->screen_name.'">'.$status->user->screen_name.'</a>:';
echo $status->text;
echo ' <a href="http://twitter.com/'.$status->user->screen_name.'/status/'.$status->id.'">'.$status->created_at."</a><br>\n";
}
}else{
//投稿できなかった場合はエラー表示
echo 'うまく取得できなかったようです。<br>';
echo '<pre>'.htmlspecialchars($response->getBody(), ENT_QUOTES).'</pre>';
}
}
}else{
//認証済みでない場合
//Twitterからのコールバックかチェック
if( isset($_GET['oauth_verifier']) ){
//Twitterからのコールバックの場合
//oauth_verifierを取得する
$verifier = $_GET['oauth_verifier'];
//保存しておいたリクエストトークンを読み出して設定する
$consumer->setToken($_SESSION['request_token']);
$consumer->setTokenSecret($_SESSION['request_token_secret']);
//アクセストークンを取得する
$consumer->getAccessToken('https://twitter.com/oauth/access_token', $verifier);
//アクセストークンをセッションに保存
$_SESSION['access_token'] = $consumer->getToken();
$_SESSION['access_token_secret'] = $consumer->getTokenSecret();
//認証完了表示
echo '<a href="'.$url.'">認証完了。ここをクリックしてください。</a>';
}else{
//認証済みでなく、Twitterからのコールバックでもない場合
//リクエストトークンを取得
$callback = $url;
$consumer->getRequestToken('https://twitter.com/oauth/request_token', $callback);
//リクエストトークンをセッションに保存
$_SESSION['request_token'] = $consumer->getToken();
$_SESSION['request_token_secret'] = $consumer->getTokenSecret();
//認証用URLを取得
$auth_url = $consumer->getAuthorizeUrl('https://twitter.com/oauth/authorize');
//認証用URLのリンクを表示
echo '<a href="'.$auth_url.'">Twitterで認証する</a><br>';
}
}
?>
<hr>
</body>
</html>
--以上
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment