bit.lyをつかってpukiwikiのURLを短くするプラグイン

前回に引き続き、PukiWikiのURLを短くするシリーズ。
twitterbit.lyを採用したらしいので、勢いで作ってみました。
json_decodeを使用しているので、jsonエクステンション必須です。

使い方は、まず、bit.lyのサイトに行ってアカウントを作ってください。
同時にAPI Keyが発行されます。

取得したアカウントとAPI Keyをそれぞれ BITLY_API_LOGIN と BITLY_API_KEY に設定します。

あとは、tinyurl と同様にテンプレートを書き換えれば完了です。

高専カンファレンスWikiですでに動作中。

ライセンスは PHP Licence です。

<?php
/**
 * bitlyプラグイン
 */

// --- アカウントの設定 ---
define('BITLY_API_LOGIN', '');
define('BITLY_API_KEY', '');

// --- API の設定 ---
define('BITLY_API_URL', 'http://api.bit.ly/shorten');
define('BITLY_API_VER', '2.0.1');

function bitly_get_tinyurl()
{
	global $script, $vars;
	$_page  = isset($vars['page']) ? $vars['page'] : $defaultpage;
	$tiny_name = CACHE_DIR . encode($_page) . '.bitly';
	$data_name = DATA_DIR . encode($_page) . '.txt';
	if (! file_exists($data_name)) {
		return false;
	}
	if (! file_exists($tiny_name)) {
		$pageurl = $script.'?'.rawurlencode($_page);
		$tinyurl = bitly_call_webapi($pageurl);
		if($tinyurl) {
			$fp = fopen($tiny_name, 'w')
				 or die_message('cannot write ' . htmlspecialchars($tiny_name));
			fputs($fp, $tinyurl);
			fclose($fp);
		}
		else {
			return false;
		}
	}
	else {
		$tinyurl = file_get_contents($tiny_name);
		if(!preg_match(',^http://bit.ly/,', $tinyurl)) {
			return false;
		}
	}

	return $tinyurl;
}

function bitly_call_webapi($url)
{
	$params = array(
		'version'	=> BITLY_API_VER,
		'longUrl'	=> $url,
		'login'		=> BITLY_API_LOGIN,
		'apiKey'	=> BITLY_API_KEY,
	);
	$request_url = BITLY_API_URL.'?'.http_build_query($params);
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $request_url);
	curl_setopt($ch, CURLOPT_TIMEOUT, 5);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

	$res = curl_exec($ch);
	curl_close($ch);

	$json = json_decode($res, true);
	if($json && isset($json['results'][$url]['shortUrl'])) {
		return trim($json['results'][$url]['shortUrl']);
	}
	else return false;
}
?>

tinyurlを使ってpukiwikiのURLを短くするプラグイン

tinyurlのサービスを利用して、pukiwikiのURLを短くするプラグイン
高専カンファレンスWiki用に作ってみた
動作確認はPukiWiki Plus! 1.4.7plus-u2-i18nのみ。たぶん本家でも動くはず。

<?php
/**
 * TinyURLプラグイン
 */

define('TINYURL_API', 'http://tinyurl.com/api-create.php');

function tinyurl_get_tinyurl()
{
	global $script, $vars;
	$_page  = isset($vars['page']) ? $vars['page'] : $defaultpage;
	$tiny_name = CACHE_DIR . encode($_page) . '.tiny';
	if (! file_exists($tiny_name)) {
		$pageurl = $script.'?'.rawurlencode($_page);
		$tinyurl = tinyurl_call_webapi($pageurl);
		if($tinyurl) {
			$fp = fopen($tiny_name, 'w')
				 or die_message('cannot write ' . htmlspecialchars($tiny_name));
			fputs($fp, $tinyurl);
			fclose($fp);
		}
		else {
			return false;
		}
	}
	else {
		$tinyurl = file_get_contents($tiny_name);
		if(!preg_match(',^http://tinyurl.com/,', $tinyurl)) {
			return false;
		}
	}

	return $tinyurl;
}

function tinyurl_call_webapi($url)
{
	$request_url = TINYURL_API.'?url='.urlencode($url);
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $request_url);
	curl_setopt($ch, CURLOPT_TIMEOUT, 5);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

	$res = curl_exec($ch);

	curl_close($ch);

	if(preg_match(',^http://tinyurl.com/,', $res)) {
		return trim($res);
	}
	else return false;
}

?>

上のソースをtinyurl.inc.phpとして保存して、plugin あたりに放り込むと吉。
Pukiwiki Plus!だとextend/pluginがいいかも)

<?php if ($is_page) { ?>
 <a href="<?php echo $_LINK['reload'] ?>"><span class="small"><?php echo $_LINK['reload'] ?></span></a>
<?php   require_once(EXT_PLUGIN_DIR.'tinyurl.inc.php'); $tinyurl = tinyurl_get_tinyurl(); ?>
<?php   if($tinyurl) { ?>
 [<a href="<?php echo htmlspecialchars($tinyurl); ?>"><span class="small">tinyurl</span></a>]
<?php   } ?>
<?php } ?>

あとは、skinのphpを書き換えれば完成。

ライセンスは PHP Licence とします。

twitterCallbackをhackする

jQueryの練習がてら、twitterのブログツールで使われてるtwitterCallbackをhackしてみた。

function twitterCallback3(obj) {
        var twitters = obj;
        var username = "";
        for (var i=0; i<twitters.length; i++) {
                username = twitters[i].user.screen_name;
                $('#twitter_update_list').append(
                $('<li></li>').html($('<span></span>').html(twitters[i].text))
                              .append(' ')
                              .append(
                $('<a></a>').html(relative_time(twitters[i].created_at))
                            .css('font-size','85%')
                            .attr('href','http://twitter.com/'+username+'/statuses/'+twitters[i].id))
                ).fadeIn('fast');
        }
}

やってることはtwitterCallback2と変わらないけど、なるだけ$()オブジェクトで処理するようにしてみた。
新しくDOM要素を追加するときは

$('<li></li>');
$('<a></a>');

とか書くのがミソ。常識なのかな?

SWXについてちょっと書いてみる

SWXって?

  • Flashで使えるデータフォーマット
  • 実は中身はSWFフォーマットそのもの
  • MovieClip.loadMovie()で取得するだけなのでパースがいらない
  • なのでとっても扱いやすいよね

SWX RPC

  • SWXを使ってRPCをやるとすごくない?
  • サーバ(SWXではgatewayって呼んでる)にパラメータを渡してloadMovie()するだけでレスポンスを取得できる!!
  • レスポンスはObjectで取得できるのでデータ構造とかそのままとれる
  • 特にリソースが制限されるFlash Liteでパフォーマンスアップに貢献

SWX PHP

  • SWX公式で開発されているSWX RPCのPHPでの実装
  • SWFフォーマットをアセンブルするところをPHPで実装
  • PHPFlashファイルが作れるってことは結構いろいろHackするところあるんじゃない!?

つーことで、これからSWXについていろいろ書いていこうと思う。

高専カンファレンス 参加者募集中!

高専カンファレンス参加者絶賛募集中!
チャットの方でちらほら手伝いますよーって人が出てきてるので、逃がさないためにもWikiの方に参加者ページを作ってみた。
ちょっと早すぎたかな?そうでもないよね、あと1ヶ月ぐらいだもんね。