ついに完成!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を展開してあげる必要があったのです。
前置きはそれくらいにして、解説。
手順
- Tweetされた内容をxmlで展開
- URLを短縮化されたものを一度展開する。
- ハッシュくタグ、RT、返信など余計なもの正規表現で排除
- 展開したURLから、画像のURLを取得する
- 出力
PHP
- //URL置き換えフォーマット<br>
- function square($short_url){<br>
- $h = get_headers($short_url,true);<br>
- if(isset($h['Location'])){<br>
- $long_url = $h['Location'];<br>
- if(is_array($long_url)){<br>
- $long_url = end($long_url);<br>
- }<br>
- }<br>
- return $long_url;<br>
- }<br>
- $contents = file_get_contents('http://search.twitter.com/search.atom?q=from:自分のTwitterアカウント&rpp=15');<br>
- //XMLをオブジェクトに変換<br>
- $xml = simplexml_load_string($contents);<br>
- //XMLオブジェクトを扱いやすいよう、通常の配列に一度変換を行う<br>
- $arrayA = array();
- for ($i = 0; $i <= 15; $i++) {<br>
- $arrayA[$i]['title'] = (string)$xml->entry->$i->title;<br>
- $arrayA[$i]['updated'] = (string)$xml->entry->$i->updated;<br>
- }
- $twitter_array = array();<br>
- foreach($arrayA as $val => $twitter){<br>
- preg_match_all("/http:\/\/[a-z0-9\/\-_\.]+/i",$twitter['title'],$match);<br>
- foreach($match[0] as $match_url){
- $URL = square($short_url = $match_url);//短縮化されたURLに一度アクセスをし、正規のURLを取得する処理<br>
- $twitter_array[$val]['url'][] = $URL;<br>
- }
- $twitter['title'] = preg_replace("/http:\/\/[a-z0-9\/\-_\.]+/i","",$twitter['title']);
- //RTタグを削除<br>
- $twitter['title'] = preg_replace("/[QR]T ?@[a-z0-9_]+:?/i","",$twitter['title']);
- //返信を削除<br>
- $twitter['title'] = preg_replace("/@[a-z0-9_]+:?/i","",$twitter['title']);
- //ハッシュタグを削除 日本語対応<br>
- $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);
- //ハッシュタグを削除 数字のみのハッシュタグを削除<br>
- $twitter['title'] = preg_replace("/[##]([0-9_])+:?/i","",$twitter['title']);
- //ハッシュタグを削除 半角英字のみ<br>
- $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がセットされていたら<br>
- if(isset($twitter_array[$val]['url'])){<br>
- //画像出力用のURL<br>
- foreach($twitter_array[$val]['url'] as $url){<br>
- <br>
- //展開したURLにtwitpicという文言が無ければ
- if(strstr($url,"twitpic") == false){<br>
- //ツイート内容にhrefでリンクを付ける<br>
- $twitter_array[$val]['text'] .= '<a href="'.$url.'">'.$twitter['title']."</a>";<br>
- }else{<br>
- //展開した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{<br>
- //Tweet中にURLが特に含まれていなかったら<br>
- $twitter_array[$val]['text'] = $twitter['title']; <br>
- }<br>
- }
HTML(出力)
- <dl><br>
- <?php foreach($twitter_array as $view):?><br>
- <dt><?php echo $view['title'];?></dt><br>
- <dd><?php echo $view['text'];?></dd><br>
- <dd><?php echo $view['updated'];?></dd><br>
- <?php endforeach;?><br>
- </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に反映させることも可能かな~と。
注意
このプログラムは勉強がてら作ってみたり、後今後ブログの更新を簡単にするために作ったものなので動作の保障は致しません。
特に自分は正規表現が苦手なので そこらへんは特に怪しいです。
あ~、大変だった