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に保存し,既に処理がされているかどうかをチェックする.本当はこれでは完全に防ぐことはできないんだけど,とりあえず,この仕組みも無いよりまし.