読者です 読者をやめる 読者になる 読者になる

絶品ゆどうふのタレ

ふと気づいたことを綴るだけのメモ

DoCoMoとSoftBankのサイトから絵文字データ表をスクレイピングするPHPスクリプト

なにやら、手元にある絵文字対照表にマッチしてあるデータが古くて、SoftBankの絵文字が一部ずれていた。

会社で使ってるのだと、もっと新しいのがあってサービスは正しく稼働してるんだけど、そっちは使い方がややこしくて脳みその足りない俺には( ゚д゚)ポカーン

つーことで、「今ある対照表のずれを修正すればいんじゃね?」
と思って最新の公式データを取得するために各キャリアの絵文字情報ページをスクレイピングするスクリプト書いた。
やっつけだけど、まぁ日本中の俺以外のだれか一人の役に立てばいいやぐらいのつもりで掲載。

ベースは30分ぐらいで出来上がったけど、文字コード周りとDoCoMoのtypoやらSoftBankの隠し?絵文字に振り回されて2時間30分ぐらいかけてしまったorz
ちなみにauはPDFなので放置。
いやうそ。書いたけど公式サイトじゃないところから取ったから非公開で。

変数がところどころ何だそれってなってるのはスルーして><。
書き直すのがめんど(ry
ここはもっとこうした方がとか、何かいろいろあったら言ってください。
そういうのあるとうれしいです。

あと、実はこういうことやっちゃいけないとかいう話あったら言ってくれたらそれもそれで嬉しいです。

softbank_emoji_scraping.php

<?php
// 必要な定数を定義

// 保存先
$save_filename = "softbank_emoji.php";

// 判定開始・終了判別用の文字列
$status_line = '<!---絵文字一覧';

// フィルタリングしたい文字列の配列
$filter_strings = array(
'絵文字',
'Unicode',
'ウェブコード',
);

// URLの共通部分の配列
$url_prefix = 'http://developers.softbankmobile.co.jp/dp/tool_dl/web/picword_0';
$url_postfix = '.php';

// URLのかわるところの配列
$page_array = range(1,6);

// スクレイピング先ページの文字コード
$to_encoding = "sjis-win";
// ソースコードの文字コード
$from_encoding = "UTF-8";

/////////////////////////////////

// 文字コード調整
$status_line = mb_convert_encoding($status_line, $to_encoding, $from_encoding);
foreach ($filter_strings as $key => $value) {
	$filter_strings[$key] = mb_convert_encoding($value, $to_encoding, $from_encoding);
}


foreach ($page_array as $number) {
	// データを配列で取得
	$url = $url_prefix . $number . $url_postfix;
	$htmldata = file($url);

	// 不要な行とタグを排除
	$record_flag = false;
	foreach ($htmldata as $line) {
		if (mb_strpos($line, $status_line) !== false) $record_flag = !$record_flag;
		if (!$record_flag) continue;
		$tmp = trim(strip_tags($line));
		if (empty($tmp)) continue;
		if (in_array($tmp, $filter_strings)) continue;
		$scraping_data[] = $tmp;
	}
}

// 通し番号
$i = 1;

$modify_data[] = '<?php';
$modify_data[] = '// Softbank 絵文字データ配列';

foreach ($scraping_data as $key => $value) {
	if (ctype_xdigit($value)) {
		// Unicodeの場合
		$tmp = hexdec(substr($value, 2, 2));
		$tmp2 = substr($value, 1, 1);
		$modify_data[] = '$emoji[\'softbank\'][' . $i . '][\'number\']  = \'' . $tmp2 . sprintf('%02d', $tmp) . '\';';
		$modify_data[] = '$emoji[\'softbank\'][' . $i . '][\'Unicode\'] = \'' . $value . '\';';
	} else {
		// Webコードの場合
		$tmp = unpack('H*', html_entity_decode($value));
		$modify_data[] = '$emoji[\'softbank\'][' . $i . '][\'webcode\'] = \'' . substr($tmp[1], 4, 4) . '\';';
		$i++;
	}
}

$modify_data[] = '?>';
$save_data = implode("\n", $modify_data);

file_put_contents($save_filename, $save_data);

もいっちょ。つーか色づけがうまくいかないんだけどなんで?
はてな記法謎。

追記:なんだかシンタックスハイライトがうまくいかないので、docomo分は
http://d.hatena.ne.jp/Yudoufu/20071028/1193532320
こっちに移植。