TwitterAPI ITかあさん

ITかあさん

目次:TwitterAPI

TwitterAPIを利用して何かおもしろいものを作ってみたり、その過程でのメモとか色々。

ついに完成!TwitterAPI利用してTweet内容を完全に表示する

前回短縮URL化した内容から、Twitpicを出力する方法を紹介しましたが、それを利用して、このブログの右カラムにもあるような最新Tweetを表示するようなガジェットを作ってみたいと思います。

ただし、ちょっと違うのが、短縮されたURLを全て展開したり、さらにTwitpicで投稿された画像もキレイに出力されるようにしたいと思います。
(一応最初にこのプログラムのデメリットを申し上げると、短縮されたURLを全て展開していくので、非常に重たいです。)

画像&URLを完全表示させるITかあさん手作りガジェット

このプログラムの作成した経緯は、TwitterとWordpressを利用して、TwitterからTweetされたらその内容でWordpressの更新をさせることでした。もっと手軽にWordpressを更新させたかったのです。
Tweet内容をそのまま出力させると問題がいくつかあり、

  • URLが短縮されてしまう(一度URLを展開して、URLの正規化)
  • ブログにTwitpicでの画像も出力したい

このことから、短縮化されたURLを一度展開する必要があったのです。
前回の投稿にあるように、Twitpicなど何かしらTwitpicの画像を出力させるには一度URLを展開してあげる必要があったのです。

前置きはそれくらいにして、解説。

手順

  1. Tweetされた内容をxmlで展開
  2. URLを短縮化されたものを一度展開する。
  3. ハッシュくタグ、RT、返信など余計なもの正規表現で排除
  4. 展開したURLから、画像のURLを取得する
  5. 出力

PHP

//URL置き換えフォーマット
function square($short_url){
$h = get_headers($short_url,true);
if(isset($h['Location'])){
$long_url = $h['Location'];
if(is_array($long_url)){
$long_url = end($long_url);
}
}
return $long_url;
}
$contents = file_get_contents('http://search.twitter.com/search.atom?q=from:自分のTwitterアカウント&rpp=15');
//XMLをオブジェクトに変換
$xml = simplexml_load_string($contents);
//XMLオブジェクトを扱いやすいよう、通常の配列に一度変換を行う
$arrayA = array(); for ($i = 0; $i <= 15; $i++) {
$arrayA[$i]['title'] = (string)$xml->entry->$i->title;
$arrayA[$i]['updated'] = (string)$xml->entry->$i->updated;
} $twitter_array = array();
foreach($arrayA as $val => $twitter){
preg_match_all("/http:\/\/[a-z0-9\/\-_\.]+/i",$twitter['title'],$match);
foreach($match[0] as $match_url){ $URL = square($short_url = $match_url);//短縮化されたURLに一度アクセスをし、正規のURLを取得する処理
$twitter_array[$val]['url'][] = $URL;
} $twitter['title'] = preg_replace("/http:\/\/[a-z0-9\/\-_\.]+/i","",$twitter['title']); //RTタグを削除
$twitter['title'] = preg_replace("/[QR]T ?@[a-z0-9_]+:?/i","",$twitter['title']); //返信を削除
$twitter['title'] = preg_replace("/@[a-z0-9_]+:?/i","",$twitter['title']); //ハッシュタグを削除 日本語対応
$twitter['title'] = preg_replace("/(?:^|[^ー゛゜々ヾヽぁ-ヶ一-龠a-zA-Z0-9a-zA-Z0-9&_\/]+)[##]([ー゛゜々ヾヽぁ-ヶ一-龠a-zA-Z0-9a-zA-Z0-9_]*[ー゛゜々ヾヽぁ-ヶ一-龠a-zA-Z0-9a-zA-Z]+[ー゛゜々ヾヽぁ-ヶ一-龠a-zA-Z0-9a-zA-Z0-9_]*)/","",$twitter['title'], -1); //ハッシュタグを削除 数字のみのハッシュタグを削除
$twitter['title'] = preg_replace("/[##]([0-9_])+:?/i","",$twitter['title']); //ハッシュタグを削除 半角英字のみ
$twitter['title'] = preg_replace("/[##]([a-zA-Z0-9])+:?/i","",$twitter['title']); $twitter_array[$val]['title'] = $twitter['title'];//Twitterのテキスト $twitter_array[$val]['updated'] = $twitter['updated']; //もしURLがセットされていたら
if(isset($twitter_array[$val]['url'])){
//画像出力用のURL
foreach($twitter_array[$val]['url'] as $url){

//展開したURLにtwitpicという文言が無ければ if(strstr($url,"twitpic") == false){
//ツイート内容にhrefでリンクを付ける
$twitter_array[$val]['text'] .= '<a href="'.$url.'">'.$twitter['title']."</a>";
}else{
//展開したURLがTwitpicに投稿されたURLなので、画像を表示するHTMLに。 $str = substr($url, -6); $twitter_array[$val]['text'] .= '<a href="'.$url.'"><img src="http://twitpic.com/show/mini/'.$str.'.jpg"/></a>'; } } }else{
//Tweet中にURLが特に含まれていなかったら
$twitter_array[$val]['text'] = $twitter['title'];
}
}

HTML(出力)

<dl>
<?php foreach($twitter_array as $view):?>
<dt><?php echo $view['title'];?></dt>
<dd><?php echo $view['text'];?></dd>
<dd><?php echo $view['updated'];?></dd>
<?php endforeach;?>
</dl>

試しにテストで出力したものは以下のようになっています。

URLが何も存在しない場合はただのTweetされたテキストを、URL内容でtwitpicというテキストが含まれていれば画像用に出力を行います。

メリット

このプログラムのメリットは、URLを一度展開しているので、展開したURLよりTwitpicに投稿されたIDを取得できるので、好きなところに投稿した画像を出力させることが出来ます。
またURLは短縮化されたURLではなくなるので、元のURLに置き換わり、URLの正規化によって 投稿されたURLによってSEO効果を図ることができるかな~と思っています。

デメリット

どうしてもTwitpicにて投稿された画像を出力したかったので 一度URLを展開する必要がありました。
展開とは、短縮化されたURLにアクセスをして 元のURLを拾ってきているのです。例えば15件URLの投稿があれば、15回もURLを読み込みに行くので この間非常に重たくなってしまうのです。

活用方法

私はこのプログラムを利用して、一言ブログなるものを作ってみようかと思います。
正直 そのままどこかに表示するのは非常に重たいのですが、Cronを利用し、定期実行によって生成された配列をWordpressのDBにINSERTをしていけば Twitterから出力される簡易一言ブログの完了です。
iphoneからでも、写真付のTweetを行えば、そのままWordpressに反映させることも可能かな~と。

注意

このプログラムは勉強がてら作ってみたり、後今後ブログの更新を簡単にするために作ったものなので動作の保障は致しません。
特に自分は正規表現が苦手なので そこらへんは特に怪しいです。

あ~、大変だった

Twitterなどで短縮URL化したものを展開する

TwitterでURL付きでツイートするとき、よく短縮URL化します。短縮URLのままだと、URLの正規化が出来ないため、ブログにログを張ってもSEO効果を出せません。Twitter以外でツイートしたものを表示する際は、短縮したものを展開したいものです。

結論:header locationを使う

短縮されたURLにアクセスすると、リダイレクトのような動きをして、元のURLを表示してくれますから、これを利用してlocationでURLを取得できないかと思っていましたが、同じことを考える人は普通にいるものですね。

参考:PHPで短縮URLを展開するコード

実際のコードは以下のようになります。

function square($short_url){
$h = get_headers($short_url,true);
if(isset($h['Location'])){
$long_url = $h['Location'];
if(is_array($long_url)){
$long_url = end($long_url);
}
}
return $long_url;
} echo square($short_url = '短縮URL');

応用:ついっぷるふぉとから投稿した画像を取得する

画像を投稿した際、URLが短縮されます。しかし、短縮されない、元のURLの最後の何文字かは画像のIDが書かれています。
つまり、これを取得きれば、短縮されたURLからTwitpicやついっぷるふぉとなどのURLから画像を引っ張ることが出来るのです。
(私はこれがやりたくてけっこうチマチマ作業してました。)

function square($short_url){
$h = get_headers($short_url,true);
if(isset($h['Location'])){
$long_url = $h['Location'];
if(is_array($long_url)){
$long_url = end($long_url);
}
}
return $long_url;
}

//テスト投稿したついっぷるふぉとの短縮URL
$URL = square($short_url = 'http://bit.ly/xxeAs8');
//ついっぷるフォトは最後の5文字が画像のID
$str = substr($URL, -5);

画像IDが取得できたら後はsrcの中に入れてあげるだけで完了。

<img src="http://p.twpl.jp/show/large/<?php echo $str;?>"/>