<?
// 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>