-- 追記2
ごめん,バグあった.文字列操作まわりのencodingがかなり怪しい.
空の時,Noneが入ってくるのは空文字列に置き換えるべきか.
-- 追記
きっと誰も AND/OR 検索を実装してくれないので,実装した.
ついでに, twit_oauth.py を更新して,フォロワだけでなくフォローしてる人の一覧も取れるようにした.
先の記事twitterのspammerのfollowが多いでも書いた,spammerのキーワード抽出について.
GMail からの PUSH 通知をトリガとした動作がうまく実装できなかったので (なぜか python2.5.xでは,imaplib2 がうまく動かない)
とりあえずトリガーは何も考えてません.cron でも,IMAP/IDLE でも,好きに実装してください.
twitter を変なライブラリなしで OAuth 認証で動かすクラスは,こんな感じで実装してます → twit_oauth.py
で,こいつを使って,下記のように使うとスパムフィルタのできあがり.
#!/usr/bin/env python # -*- coding: utf-8 -*- import simplejson,re from twit_oauth import twit_oauth __KEYWORDS = [(re.compile(u'キーワード1'),), (re.compile(u'キーワード2-1'),re.compile(u'キーワード2-2')) ] # プロファイルリスト取得関数 def getProfiles(followers,pobj): profiles = {} for f_id in followers: profs=simplejson.loads(pobj.callAPI('profile',`f_id`)) if profs['name']==None: name='' else: name=''.join(profs['name'].split('\n')) if profs['description']==None: desc='' else: desc=''.join(profs['description'].split('\n')) profiles[`f_id`]=(name,desc) return profiles # テキストマッチ関数 def filterByKeys(profiles): fil_list = [] for (id,prof) in profiles.items(): # __KEYWORDS のいずれかの要素1つでも合致すればブロック (OR) for keys in __KEYWORDS: fil_list.append(id) # __KEYWORDS の1要素の中の,全てのマッチが成功すればブロック (AND) for k in keys: if not k.search(prof): del fil_list[-1] break # 重複登録回避 if len(fil_list) != 0 and fil_list[-1] == id: break return fil_list pobj= twit_oauth('xxxxxxxxxxxxxxxxxx','xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx','xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') # 自分の username を入れて,フォロワーを取得 followers = simplejson.loads(pobj.callAPI('getfollowers','username')) # フォロワーのプロファイルを取得 profiles = getProfiles(followers,pobj) # キーワードマッチでフィルタ対象を取得 fil_list = filterByKeys(profiles) # ブロック for fid in fil_list: print pobj.callAPI('block',fid) # report_spam 自動処理で報告してしまうので,非推奨 # for fid in fil_list: # print pobj.callAPI('report_spam',fid)
report_spam を呼んでないのは,巻き添えレポートを防ぐため.
キーワードに絶対の自信があれば,使ってください.
and検索,or検索したい場合は,k.search(prof) の所を工夫してください.
実装済.