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