<?
// 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アドレス
defineINIT_USER    "username@gmail.com" );
// twitter にアクセスする際に利用するログイン用のパスワード
defineINIT_PASS    "twpasswd" );
// チェックフラグのカウント数
defineCHK_COUNT    );
// ログイン情報入力前に表示するメッセージ
defineINIT_ALERT    "twitterに書いてみよう" );
// はじめにTEXTAREAに入力されているメッセージ
defineINIT_TEXT    "ここにメッセージを書いてみて" );
// E-Mailとパスワードが異なる場合のメッセージ
defineCHK_ACCOUNT_MSG "E-Mailとパスワードを確認してみて");
// このページのタイトルを設定
definePAGE_TITLE    "phpでTwitterにメッセージを送るテスト" );
// ユーザのRSS feedを取得する際のベースURI
defineFEED_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 する
    
definePROXY_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($chCURLOPT_URL"$endpoint_uri"); 
    
curl_setopt($chCURLOPT_CONNECTTIMEOUT2); 
    
curl_setopt($chCURLOPT_RETURNTRANSFER1); 
    
curl_setopt($chCURLOPT_POST1); 
    
// 各パラメータについては、下記URLを参考に(つーか、ほぼパクリっす)
    // http://groups.google.com/group/twitter-development-talk/web/api-documentation
    
curl_setopt($chCURLOPT_POSTFIELDS"status=$message"); 
    
curl_setopt($chCURLOPT_USERPWD"$username:$password"); 
    if(
defined ('PROXY_HOST')){
        
// proxy を利用している場合は curl で渡す際に proxy 情報をセットする
        
curl_setopt($chCURLOPT_PROXYPROXY_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>