Archive for 9月, 2011

Twitterを使ったサイトのニュース更新

2011年 9月 28日 Published by under 管理

Twitter の API にある JSONP を使ってニュースを表示していたのだけど、全てのリンクを t.co にするという仕様変更によってインラインによる画像表示に問題が出てしまった。解決法の一つ目は、ExpandURLのような外部サービスを使うことだったのだけど、一日に使えるデータの上限が危うい感じだったのと、複数回叩くとブラウザのCPU利用率が上昇して固まってしまうという致命的な欠点があり頓挫したので自作することにした。

var url = 'http://twitter.com/statuses/user_timeline/'
	+ twitter_id
	+ '.json?callback=twitterCallback&count='
	+ twitter_count;

2つの変数をセットし JSONP を取得後にtwitterCallbackで、

html += (obj[i].text).replace(/http:\/\/twitpic\.com\/(\w+)/ig, '<span style="display:block;"><img src="http://twitpic.com/show/thumb/$1" /></span>');

とIDを置換していたのだけど、getUnShortという関数で t.co リンクが含まれていた場合に展開して送り直すという処理を行った。

var urls = (obj[i].text).match(/http:\/\/t\.co\/(\w+)/ig);
if(urls) {
  html += (obj[i].text).replace(/http:\/\/t\.co\/(\w+)/ig, '<span style="display:block;" id="$1"></span>');
  getUnShort(urls);
} else {
 html += (obj[i].text).replace(/http:\/\/twitpic\.com\/(\w+)/ig, '<span style="display:block;"><img src="http://twitpic.com/show/thumb/$1" /></span>');
}

Ajax 部分は prototype.js を使ってこのように書いた。

function getUnShort(urls) {
 var pars = 'url=' + encodeURIComponent(urls.join(','));
 new Ajax.Request( 'unshort.php', { method: 'post', parameters: pars, onComplete: sendUnShortResult });
}
 
function sendUnShortResult(originalRequest) {
//console.log(originalRequest.responseText);
 if(originalRequest.responseText && originalRequest.responseText != 1) {
  var scheme = (originalRequest.responseText).split(',');
  var img = scheme[0].replace(/http:\/\/twitpic\.com\/(\w+)/ig, '<img src="http://twitpic.com/show/thumb/$1" />');
  var node_id = scheme[1];
  var target_node = document.getElementById(scheme[1]);
  target_node.innerHTML = img;
 }
 return;
}

最後にサーバー側はPHPで短縮URLを展開するコードを参考に、展開後のURLと画像の受け皿となるノードIDをカンマ区切りで渡すことにした。

$urls = (isset($_POST['url']) && !empty($_POST['url'])) ? explode(',', trim($_POST['url'])) : exit('1');
for($i=0;$i<count($urls);$i++) {
 $node_id = substr(strrchr($urls[$i], '/'), 1);
 $h = get_headers($urls[$i],true);
 if(isset($h['Location'])){
  $long_url = $h['Location'];
  if(is_array($long_url)){
   $long_url = end($long_url);
  }
  echo substr_count($long_url, 'twitpic') ? ($long_url.','.$node_id) : null;
 }
}

条件式ではオブジェクトの型を調べておくことをオススメしますが、このブログでは割愛! ;-)

近年この更新部分は、実際には社内ソーシャルメディア部の Twitter や Facebook といった広報やサポートの担当者が行うべき仕事じゃないかなと思う次第。

ニュース更新のためだけに制作会社に仕事が投げられる場合が多々あるのも事実だし、しかも作業量の割に美味しいこともあれば、サービス作業になっている場合もあるこの作業、経営者的には「出来る事は自分たちでやれ」なんだろうと思います。

コメントは受け付けていません。