| @技術/プログラミング

usericons.relucks.orgをご存じですか? 様々なウェブサービスのユーザーアイコンを拾ってきて画像のURLを渡してくれるAPIです。これすごく便利。

このブログにコメントを書き込んでもらったときにURI欄にTwitterのユーザーページのURLが書いてあったら、twitty.jpのAPIを使わせてもらってユーザーアイコンを表示していたんですけど(参照:Twitterアイコンをブログのコメント欄に表示するというアイディア)、このAPIはtwitty.jpがTwitterから収集してきたアイコンを表示するのでタイムラグがあったし、透過pngとかはgifに変換されてて背景がきちゃなくなっていました。自分でTwitterから取ってこようかなーとも思ったのですが、ページが表示される度にアイコン取りに行ったらすぐにAPI制限喰らっちゃうし、MySQLにユーザー情報を格納するとかごちゃごちゃやってたんだけど結局わからんくて断念。そんな折、swdyhさんが作ったサービスに出会ったわけでした。

これまでTwitterの画像だけ取ってくるようにしてたけど、 usericons.relucks.org は

  • flickr
  • github
  • hatena
  • lastfm
  • logpi
  • najimi
  • nowa
  • turnyournameintoaface
  • twitter
  • wassr

に対応してるので、Twitterの他に自分がアカウントを持ってる flickr, hatena, last.fm, wassr のアイコンも取ってくるようにしました。

このAPIは本当にスバラシイ!

で、やり方なんですけど、 /include/fnc_logs.inc.php の382行目付近から396行目付近


// If user's website URI was posted, wrap the user name with anchor.
if (isset($trows['user_uri']) && preg_match('/([^=^"]|^)(http:[w.~-/?&+=:@\%;#\%]+)/', $trows['user_uri'])) {
    $user_name = '<a href="' . $trows['user_uri'] . '" rel="nofollow">' . $trows['user_name'] . '</a>';
} else {
    $user_name = $trows['user_name'];
}
// Smiley!
$trows = smiley($trows);
$comments .= '<h5 id="c'.$trows['id'].'">'. $trows['title'] . "</h5>
".
             '<div class="' . $color_class . '">'."
".
             $trows['comment'] .
             '<p class="author">From : ' . $user_name . ' @ ' . $trows['date'] . ' ' .
             '<span class="edit"><a href="./forum/comment_edit.php?id=' . $trows['id'] . '">' . $lang['edit'] . '</a></span>'.
             "</p>
".
             "</div>
";

を、以下のように改変。


// If user's website URI was posted, wrap the user name with anchor.
if (isset($trows['user_uri']) && preg_match('/([^=^"]|^)(http:[w.?-/?&+=:@\%;#\%]+)/', $trows['user_uri'])) {
	if (preg_match('/twitter.com/([^&]*)/', $trows['user_uri'], $user_icon_array)) { //user is twitter user
		$user_icon_name = $user_icon_array[1];
		$user_icon = '<p class="author"><a href="' 
					  . $trows['user_uri'] . '"><img src="http://usericons.relucks.org/twitter/' 
					  . $user_icon_name . '" height="48" width="48" alt="' . $trows['user_name'] . '" /></a></p>';
		$user_name = '<a href="' . $trows['user_uri'] . '" rel="nofollow">' . $trows['user_name'] . '</a>';
	} elseif (preg_match('/flickr.com/photos/([^&]*)//', $trows['user_uri'], $user_icon_array) || 
				preg_match('/flickr.com/people/([^&]*)//', $trows['user_uri'], $user_icon_array)) { //user is flickr user
		$user_icon_name = $user_icon_array[1];
		$user_icon = '<p class="author"><a href="' 
					 . $trows['user_uri'] . '"><img src="http://usericons.relucks.org/flickr/' 
					 . $user_icon_name . '" height="48" width="48" alt="' . $trows['user_name'] . '" /></a></p>';
		$user_name = '<a href="' . $trows['user_uri'] . '" rel="nofollow">' . $trows['user_name'] . '</a>';
	} elseif (preg_match('/hatena.ne.jp/([^&]*)//', $trows['user_uri'], $user_icon_array)) { //user is hatena user
		$user_icon_name = $user_icon_array[1];
		$user_icon = '<p class="author"><a href="' 
					 . $trows['user_uri'] . '"><img src="http://usericons.relucks.org/hatena/' 
					 . $user_icon_name . '" height="48" width="48" alt="' . $trows['user_name'] . '" /></a></p>';
		$user_name = '<a href="' . $trows['user_uri'] . '" rel="nofollow">' . $trows['user_name'] . '</a>';
	} elseif (preg_match('/last.fm/user/([^&]*)/', $trows['user_uri'], $user_icon_array)) { //user is lastfm user
		$user_icon_name = $user_icon_array[1];
		$user_icon = '<p class="author"><a href="' 
					 . $trows['user_uri'] . '"><img src="http://usericons.relucks.org/lastfm/' 
					 . $user_icon_name . '" height="48" width="48" alt="' . $trows['user_name'] . '" /></a></p>';
		$user_name = '<a href="' . $trows['user_uri'] . '" rel="nofollow">' . $trows['user_name'] . '</a>';
	} elseif (preg_match('/wassr.jp/user/([^&]*)/', $trows['user_uri'], $user_icon_array)) { //user is wassr user
		$user_icon_name = $user_icon_array[1];
		$user_icon = '<p class="author"><a href="' 
					 . $trows['user_uri'] . '"><img src="http://usericons.relucks.org/wassr/' 
					 . $user_icon_name . '" height="48" width="48" alt="' . $trows['user_name'] . '" /></a></p>';
		$user_name = '<a href="' . $trows['user_uri'] . '" rel="nofollow">' . $trows['user_name'] . '</a>';
	} else { //user doesn't have other web service's account
		$user_icon_name = '';
		$user_icon = '';
    	$user_name = '<a href="' . $trows['user_uri'] 
    				   . '" rel="nofollow">' . $trows['user_name'] . '</a>';
    }
} else {
    $user_icon_name = '';
	$user_icon = '';
    $user_name = $trows['user_name'];
}
// Smiley!
$trows = smiley($trows);
$comments .= '<h5 id="c'.$trows['id'].'">'. $trows['title'] . "</h5>
".
             '<div class="' . $color_class . '">'."
".
             $user_icon ."
".
             $trows['comment'] .
             '<p class="author">From : ' . $user_name . ' @ ' . $trows['date'] . ' ' .
             '<span class="edit"><a href="./forum/comment_edit.php?id=' . $trows['id'] 
             . '">' . $lang['edit'] . '</a></span>'.
             "</p>
".
             "</div>
";

ちょっと長いですが↑の通りです。興味がある人はやってみてください。