PHPでTwitterを表示する

written by overQ

「WebDesign」という見出しを作ってしまったので、何かそれらしい記事も書いておかねば。
ということで、表紙ページで使っている、Twitterのタイムラインの表示方法をメモってみます。デザインじゃないけれどw

このブログはWordPressを利用しているので、PHPで表示します。
結論からいうと、WordPressの場合は、下のコードを functions.php に加え、テンプレートに、「<?php my_tweet_load(Twitterで使ってる名前、表示したいツィート数); ?>」を記入するだけ。
うちの場合だと、<?php my_tweet_load(‘overQrevo’, 2); ?>

PHPの関数なので、WordPressじゃなくても、PHPが使えれば機能しますが、30行目のhuman_time_diff()だけはWordPress固有なので、ちがうものにする必要あり。ふつうにdate()とか。
(functions.phpというのは、WordPressの管理画面で、「外観→テーマ編集→テーマのための関数」。)
(そういえば、PHPの関数ってcamelにするんだっけ。まあいいや)

// My Twitter
function my_tweet_load($name,$count) {
  $url = "http://api.twitter.com/1/statuses/user_timeline.json?screen_name=$name&count=$count&include_rts=true";
  $json = file_get_contents($url,true);
  if ($json == false) {
      echo "★Twitterのサーバはクジラ状態です★";
      return;
  }
  $decode = json_decode($json, true);
  $img = $decode[0]['user']['profile_image_url'];
  $user_name = $decode[0]['user']['name'];

  foreach($decode as $val){
    $text = $val['text'];

    $pattern[0] = '/(https?:\/\/[a-zA-Z0-9\.\/~_]+)/'; // URL
    $replace[0] = "<br /><a href='\\1'>\\1</a>";
    $pattern[1] = '/(\s|^)@([a-zA-Z0-9\.\/~\-_]+)\b/'; // @reply
    $replace[1] = "@<a class='reply_name' href='http://twitter.com/\\2'>\\2</a> ";
    $pattern[2] = '/(\s|^)#([a-zA-Z0-9\.\/~\-_]+)\b/'; // #hashtags
    $replace[2] = "<a class='reply_name' href='http://search.twitter.com/search?q=%23\\2'>#\\2</a> ";
    ksort($pattern);
    ksort($replace);
    $text = preg_replace($pattern,$replace,$text);

    $tweet_id = $val['id_str'];
    $time = strtotime($val['created_at']);
    $diff = time() - $time;
    echo "<div class='prof_img'><img src='".$img."' /></div>
         <p>".
         "<a href='http://twitter.com/".$name."' class='twittname'>".$user_name."</a><br />";
    echo $text."<br /><span class='twittdate'>";
    $date = ($diff < 86400 )?
      sprintf( __('%s ago'), human_time_diff( $time ) )  :
      date( "g:i A M jS Y", $time);
     echo "<a href='http://twitter.com/".$name."/status/".$tweet_id."'>"
         .$date.
         "</a>";
    if($val['source']) {echo " via ". $val['source'];}
    echo "</span>
         </p>";
  }
}

タイムラインの情報をjsonで取得

せっかくなんで解説も。(未来の自分用に)
タイムラインを取得するだけなら、認証が要らないので、簡単。xmlやjson形式でタイムラインの内容が取得できます。今回はjsonにした。

http://api.twitter.com/1/statuses/user_timeline.json?screen_name=名前&count=ツィート数

名前は、プロフィール名じゃなくて、ユーザ名のほう。
また、screen_nameの代わりに、user_idを使うと、ユーザIDでも使えます。(ユーザIDは、ツィッターページのRSSを調べるとわかる。)
&countを付けて、表示するツィートの数を指定。
(このcount、2を指定すると0になり、4を指定すると2になるという、謎の現象が起きました。新しい投稿をしたら治ったけど。…どうやらリツイートと関係があるようだ。)
(追記。この現象の謎が解けました。リツイートが含まれていなかったため。リツイートもタイムラインに含める場合は、「&include_rts=true」を加えます。)

で、取得したjsonをPHPでdecodeして、配列にする。
あとはechoで、配列の中身を適当に表示してゆく。

URLや@リプライなどにリンクを付ける

ちょいと、ひと工夫。
URLを正規表現で抜き取って、リンクを張る。それが16、17と22〜24行目。

さらに、もうひと工夫。
返信の@マークの後に続くお名前にもリンク。それが18、19行目。
同様に#も。日本人はわりと使わないけれど。20、21行目。
(#。ハッシュタグ。話題のキーワードを示す。リンク先は「http://twitter.com/#!/search=q%23キーワード」だけど、ツイッターにログインしてないと機能しないみたい。要調査。)
(追記。ひとつの解決策として、Twitter Searchを使う。「http://search.twitter.com/search?q=%23キーワード」)
preg_replace()で配列を使うときは、ksort()しておくのがポイント。

投稿日時の表示を「〜時間前」ふうにする

ついでに投稿日時の表示方法も、ひと工夫。
24時間(86400秒)以内の投稿は、「~前」の表示にする。
WordPressには便利な関数human_time_diff()があるんで、これを利用。ここだけはWordPressじゃないと使えません。
そして、printfで日本語に。日本版Wordpressを使っているので、日本語になります。34行目。

ツイートごとのパーマリンク

さらにさらに。
ツイートのパーマリンクを日時にリンク。26行目と、36〜38行目。
本家Twitterのタイムラインでもそうなっているけれど、気づいている人は結構少ない。
ブログの記事に、誰かのツイートを引用する場合などは、このパーマリンクを使うとよいです。

Twitterのサーバがクジラの時の対処

5から8行目。クジラの絵を表示するのも、いいかも。
果たしてこれでうまくいくかどうかは、クジラがやって来るまでわからない。。


COMMENTS