PythonでTwitter
Pythonを使ってtwitterしてみるTweetをhtmlに変換する
サンプルプログラム#!/usr/bin/python #coding: utf-8 import re import urllib import datetime ################################################################ def tweet2html( title, link, date ): ##### get account (id) & tweet id (tid) #### data = link.split('/') id = data[3] tid = data[5] ##### replace date&time #### dd = re.split(' |-|:|T|Z',date) date = datetime.datetime( int(dd[0]), int(dd[1]), int(dd[2]), int(dd[3]), int(dd[4]), int(dd[5]) ) date += datetime.timedelta( 0,0,0,0,0,9) ##### regular expression #### tagLink = re.compile( '((?:https?|ftp):\/\/[!-~]+)' ) # regular expression for link tagAt = re.compile('@[0-9a-z]+?( |:|$)') # regular expression for @account tagSharp = re.compile('#.+?( |:|$)') # regular expression for #tag ##### add link for url ##### miter = tagLink.finditer(title) # (a) find tags which can use in for if( miter != None ): done = [] for m in miter: if( not (m.group() in done) ): # (b) to avoid double replace title = title.replace( m.group(), ( '%s' ) % ( m.group(), m.group() ) ) done.append(m.group()) ##### add link for account (@) ##### miter = tagAt.finditer(title) # (a) find tags which can use in for if( miter != None ): done = [] for m in miter: if( not (m.group() in done) ): # (b) to avoid double replace account1 = re.sub( '( |:)', '', m.group() ) account2 = account1.replace('@','') title = title.replace( account1, ( '%s' ) % ( account2, account1 ) ) done.append(m.group()) ##### add link for tag (#) ##### miter = tagSharp.finditer(title) # (a) find tags which can use in for if( miter != None ): done = [] for m in miter: if( not (m.group() in done) ): # (b) to avoid double replace tag1 = re.sub( '( |:)', '', m.group() ) tag2 = urllib.quote(tag1.encode('utf_8')) title = title.replace( tag1, ( '%s' ) % ( tag2, tag1 ) ) done.append(m.group()) return '''\ Re RT at %s from %sサンプルプログラム
''' % ( title, id, tid, date, id, id ) ########################################################################################## title = u'@howbona @howbonb 置換のサンプルだい! http://t.co/abc #画像 #びっくり' link = 'http://twitter.com/howbona/statuses/00000' date = '2011-11-11T11:11:11Z' print tweet2html( title, link, date ).encode('utf_8')
説明
##### get account (id) & tweet id (tid) #### data = link.split('/') id = data[3] tid = data[5]'/'をデリミタとして,URLを分割することで,アカウント(id)とTweet id(tid)を取得する.
##### replace date&time #### dd = re.split(' |-|:|T|Z',date) date = datetime.datetime( int(dd[0]), int(dd[1]), int(dd[2]), int(dd[3]), int(dd[4]), int(dd[5]) ) date += datetime.timedelta( 0,0,0,0,0,9)時間情報を分割し,datetimeを利用して,さらに日本時間に合わせるため,9時間プラス.本当は,タイムゾーンを使うべきなのだろうけど,タイムゾーンの使い方がよくわからない.
##### regular expression #### tagLink = re.compile( '((?:https?|ftp):\/\/[!-~]+)' ) # regular expression for link tagAt = re.compile('@[0-9a-z]+?( |:|$)') # regular expression for @account tagSharp = re.compile('#.+?( |:|$)') # regular expression for #tag各種タグを抽出するための正規表現.'$'は文末を表し,'?'は0or1回目の対応という意味.'.'は任意の文字,+は0回以上の繰り返し.
##### add link for url ##### miter = tagLink.finditer(title) # (a) find tags which can use in for if( miter != None ): done = [] for m in miter: if( not (m.group() in done) ): # (b) to avoid double replace title = title.replace( m.group(), ( '%s' ) % ( m.group(), m.group() ) ) done.append(m.group())finditerの結果はfor分で利用できるので便利.
同じ文字列が存在した場合,二重に置換されてしまうので,それを防ぐため,処理した文字列をdoneに保存し,既に処理がされているかどうかをチェックする.本当はこれでは完全に防ぐことはできないんだけど,とりあえず,この仕組みも無いよりまし.