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

au, SoftBank絵文字一覧をJSONにする

Mobile

あえて何も言いますまい。

auとSoftBankの絵文字一覧YAML
http://labs.unoh.net/2007/10/ausoftbankyaml.html


数ヶ月前にも同じ事をやって、最近また一覧表が必要になって前使ったスクリプトを探したのですが、見つからない。結局、また一から書き直したよ。
出力結果に自信がないし(えっー!?)、誰かが突っ込んでくれるかもしれないし、また見つからなくなると面倒なので、貼っておきます。この程度の仕事で「BeautifulSoupを使って・・・」とか、「Web::Scraper Python版 or lxmlを使って・・・」という気力はない。

あと、まだ公開できないけど、django-mobilejpの絵文字の扱いは、こんなYAMLやJSONを見てどうこうしなくてもいいように、相当考慮して作ってある。

ezweb.json

http://d.hatena.ne.jp/tokuhirom/20070706/1183707279にあるように、GoogleからPDFをHTML化したキャッシュを先にダウンロードしておき、"search.htm"として保存しておき解析。

# -*- coding: utf-8 -*-
import re
import simplejson

result = []
current_name = []
current_num = 0
for line in open('search.htm', 'rb').readlines():
    m = re.search(r'left:(\d+)"><nobr>([^<]+)', line)
    if m:
        left, text = m.groups()
        if left == "170" or left == "604":
            current_name.append(text)
        elif left == "241" or left == "676":
            m = re.match(r'^(. . . .) (. . . .) (. . . .) (. . . .)$', text)

            sjis, uni, jis, email = map(lambda x: x.replace(' ', ''),
                                        m.groups())
            name = ''.join(current_name).replace("\n", "").replace("\r", "")
            result.append([current_num, unicode(name, 'utf-8'), sjis, uni, jis, email])
            current_name = []
        else:
            m = re.match(r'^(\d+)', text)
            if m:
                current_num = int(m.group(1))

result.sort(lambda a, b: cmp(a[0], b[0]))

fp = file(r'ezweb.json', 'wb')
simplejson.dump(result, fp, ensure_ascii=False, indent=2)
fp.close()

softbank.json

SoftBankの絵文字一覧のページからHTMLをダウンロードしておく。例えば、

$ curl -O "http://developers.softbankmobile.co.jp/dp/tool_dl/web/picword_0[1-6].php"
# -*- coding: utf-8 -*-
import re
import simplejson

ROW_RE = re.compile(r'<TD[^>]+><FONT[^>]+>([^>]+)</FONT></TD>\s*<TD[^>]+><FONT[^>]+>([^>]+)</FONT></TD>', re.S)

def build_list(uni, code):
    code = code.replace('&#27;', ''
                  ).replace('&#15;', ''
                  ).replace('&quot;', '"'
                  ).replace('&amp;', '&'
                  ).replace('&lt;', '<'
                  ).replace('&gt;', '>')
    return uni.encode('utf-8'), code.encode('utf-8')

results = []
num = 0
for x in xrange(1, 6+1):
    filename = 'picword_0%s.php' % x
    content = file(filename, 'rb').read().decode('cp932')
    start_comment = u'!---絵文字一覧 start--->'
    start = content.index(start_comment)
    end = content.index(u'絵文字一覧', start + len(start_comment))
    for a, b in ROW_RE.findall(content[start:end]):
        num += 1
        result = build_list(a, b)
        results.append([num] + list(result))

fp = file(r'softbank.json', 'wb')
simplejson.dump(results, fp, indent=2)
fp.close()