<?
// php を使って twitter をハンドリングするサンプル
// 日本語ドキュメントがあまりないっぽいので作ってみた
// twitter API については下記URL(Google Group)が詳しい
// http://groups.google.com/group/twitter-development-talk/web/api-documentation
// このサンプルプログラムも上記に記載されていたサンプルを99%パクって説明しているっす
// このプログラムについての質問がありましたら、下記まで
// 問合せ先:りょーち http://ryouchi.seesaa.net/
// 以下説明っす。(コメントが多いので長く感じるかもしれんが結構短いっす)
// httpプロトコルでデータを取得する際に利用
// 下記においてあります
// http://www.usamimi.info/~ryouchi/twitter/proxy.phps
// 利用する際は proxy.phps を proxy.php にリネームしてね
include('proxy.php');
// twitter にアクセスする際に利用するログイン用のE-Mailアドレス
define( INIT_USER , "username@gmail.com" );
// twitter にアクセスする際に利用するログイン用のパスワード
define( INIT_PASS , "twpasswd" );
// チェックフラグのカウント数
define( CHK_COUNT , 3 );
// ログイン情報入力前に表示するメッセージ
define( INIT_ALERT , "twitterに書いてみよう" );
// はじめにTEXTAREAに入力されているメッセージ
define( INIT_TEXT , "ここにメッセージを書いてみて" );
// E-Mailとパスワードが異なる場合のメッセージ
define( CHK_ACCOUNT_MSG , "E-Mailとパスワードを確認してみて");
// このページのタイトルを設定
define( PAGE_TITLE , "phpでTwitterにメッセージを送るテスト" );
// ユーザのRSS feedを取得する際のベースURI
define( FEED_BASE , "http://twitter.com/statuses/user_timeline/" );
// 接続時のproxy設定
// proxy経由でアクセスする場合 : $use_proxy = 1;
// proxy経由でアクセスしない場合 : $use_proxy = 0;
$use_proxy = 1;
// proxyのホスト名を記載
$proxy_host = 'proxy.example.com';
// proxyのポート名を記載
$proxy_port = 8080;
$no_proxy = array(
'localhost', // localhost
'127.0.0.0/8', // loopback
);
if ($use_proxy==1){
// proxy を利用するなら PROXY_HOST を define する
define( PROXY_HOST , "http://".$proxy_host.":".$proxy_port );
}
function put_twitter($username,$password,$msg){
// curlを利用してメッセージを送る
$message = urldecode($msg);
// Status Methods の update を使ってメッセージを更新
// http://groups.google.com/group/twitter-development-talk/web/api-documentation
$endpoint_uri = 'http://twitter.com/statuses/update.xml';
// JSON で取得する場合は下記URLがエンドポイントになる
// $url = 'http://twitter.com/statuses/update.json';
// curl 初期化
$ch = curl_init();
// URL に $endpoint_uri を指定
curl_setopt($ch, CURLOPT_URL, "$endpoint_uri");
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
// 各パラメータについては、下記URLを参考に(つーか、ほぼパクリっす)
// http://groups.google.com/group/twitter-development-talk/web/api-documentation
curl_setopt($ch, CURLOPT_POSTFIELDS, "status=$message");
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
if(defined ('PROXY_HOST')){
// proxy を利用している場合は curl で渡す際に proxy 情報をセットする
curl_setopt($ch, CURLOPT_PROXY, PROXY_HOST);
}
// curl_setopt で指定した内容で curl 実行
// 実行した結果は $buffer に格納される
$buffer = curl_exec($ch);
// curl 終了
curl_close($ch);
// 取得したデータ(XMLデータ)を戻す
return ($buffer);
}
function print_d($str){
// デバッグ時の連想配列表示用(使わなくてもよい)
echo '<pre>';
print_r($str);
echo '</pre>';
}
?>
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title><?php echo PAGE_TITLE; ?></title>
<link rel="stylesheet" type="text/css" href="index.css">
<link rel="stylesheet" type="text/css" href="index-sub.css">
</head>
<body class="account" id="profile">
<div id="container">
<a href="./"><?php echo PAGE_TITLE; ?></a>
<?php
echo '<form method="get" action="'.$_SERVER["PHP_SELF"].'">';
// 今回のサンプルではログイン用のE-Mailアドレスとパスワード
// 記入メッセージの3つが記入されていないと、twitterの内容を表示しない
// ような作り方にしてみた。(このあたりはいくらでも変更できるであろう)
$chk = 0;
// ログイン用E-Mail入力フォームの表示
if($_GET["user"] <>"") {
// ログイン用のE-Mailアドレスに何か入力されていれば
// chkフラグをインクリメント
$chk++;
// ログイン用E-Mail入力フォームの表示
echo 'E-Mail:<input type="text" name="user" size="20" value="'.$_GET["user"].'" onFocus="this.select()" /><br />';
}else{
// ログイン用E-Mail入力フォームの表示
echo 'E-Mail:<input type="text" name="user" size="20" value="'.INIT_USER.'" /><br />';
}
// ログイン用パスワード入力フォームの表示
if($_GET["password"] <>"") {
// passwordに何か入力されていれば
// chkフラグをインクリメント
$chk++;
// ログイン用パスワード入力フォームの表示
echo 'password:<input type="password" name="password" size="20" value="'.$_GET["password"].'" /><br />';
}else{
// ログイン用パスワード入力フォームの表示
echo 'password:<input type="password" name="password" size="20" value="'.INIT_PASS.'" /><br />';
}
// 入力メッセージフォームの表示
if($_GET["message"] <>"") {
// messageに何か入力されていれば
// chkフラグをインクリメント
$chk++;
// 入力メッセージフォームの表示
echo '<br /><textarea name="message" rows="5" cols="20" onFocus="this.select()">'.$_GET["message"].'</textarea><br />';
}else{
// 入力メッセージフォームの表示
echo '<br /><textarea name="message" rows="5" cols="20" onFocus="this.select()">'.INIT_TEXT.'</textarea><br />';
}
echo '<input type="submit" value="書き込み"></form>';
// 全てのフィールドが入力されているかチェック
if($chk != CHK_COUNT ) {
// 上記チェックフラグを全て足すと3(CHK_COUNT)になるので
// 3(CHK_COUNT)でなければ下記メッセージを表示
echo INIT_ALERT;
}else{
// ログインE-Mail,ログインパスワード,メッセージが全て入力されていれば
// put_twitter()関数に引数を渡し、curlを用いてXMLデータを取得する
// (put_twitter()の戻り値はXMLデータそのものであることに注意)
$data = put_twitter($_GET["user"],$_GET["password"],$_GET["message"]);
// $dataに格納された XML String を simpleXMLで連想配列に変換
$xml = @simplexml_load_string($data);
// $xmlの中身を確認(確認するには下記の行のコメントを外す)
// print_d($xml);
if ($xml->user->screen_name <>""){
// screen_name が取得できていたら xml を取得できたと見做して下記を実行
// screen_name 取得
$screen_name = $xml->user->screen_name;
// id 取得
$id = $xml->user->id;
// profile_image_url 取得
$icon_uri = $xml->user->profile_image_url;
// icon と twitter のユーザ用のURIを元にリンク作成
echo '<br /><a href="http://twitter.com/'.$screen_name.'" target="_blank"><img src="'.$icon_uri.'" alt="Twitter で '.$screen_name.' を確認"></a>';
// rssfeedのURI作成
// RSS Feedは下記形式
// http://twitter.com/statuses/user_timeline/[id].rss
$rss_uri = FEED_BASE.$id.".rss";
// $rssfeed の内容を取得
// $rssfeed に格納されるのは XMLデータそのものであることに注意
$rssfeed = http_request($rss_uri);
// $rssにrssの内容をsimpleXMLを使い配列として格納
$rss = simplexml_load_string($rssfeed['data']);
// $rss確認(確認するには下記の行のコメントを外す)
// print_d($rss);
if ($rss->channel->title<>""){
//$rss->channel->title が取得できていたら、RSSのitemを表示
echo '<ul>';
foreach ($rss->channel->item as $item){
// RSS の channel 内のitemを取得し、表示
// 記入したものがRSS Feedに反映されるまで時間が掛かるっぽい
// なので、今入力したものがRSSに反映されていない場合が多い
echo '<li><a href="'.$item->link.'"target="_blank">'.$item->title.'</a></li>';
}
echo '</ul>';
}
}else{
// screen_name が取得できなければ E-Mailとパスワードが違う可能性がある
echo CHK_ACCOUNT_MSG;
}
}
?>
</div>
</body>
</html>