-- 追記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) の所を工夫してください.
実装済.
