Skip to content

Commit

Permalink
特定の通知を無効にできるように. READMEだいたい書いた. ◡( ╹◡╹ )◡
Browse files Browse the repository at this point in the history
  • Loading branch information
non117 committed Feb 22, 2012
1 parent 5eaa9ba commit 319935c
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 76 deletions.
50 changes: 29 additions & 21 deletions README
@@ -1,33 +1,41 @@
Boxnyaはマルチインプット, マルチアウトプットの汎用通知システムです.

Python 2.6以上が必要です. Python 3はサポートしていません.

#TODO : rstにする

使い方
Python 2.6以上が必要です. Python 3.xはサポートしていません.

Boxnyaとは
===========

 Boxnyaは, SNSなどのネット上の情報をあらゆる端末に通知することを目的としたシステムです.
具体的には, Twitter等のふぁぼられ, リプライそしてGmailの新着通知などです.

これらの機能は全てプラグインで実現されており, 指定されたフォルダにプラグインを入れて設定を書くだけで使うことができます.

設定方法
settings.pyに設定を書きます.
DAEMON = Trueなら,
$ python boxnya.py start|stop|restar
で起動終了などが制御できます. boxnyaはデーモンプロセスとなります.
windowsの場合は使えないので, DAEMON = Falseにして,
コマンドプロンプトで boxnya.pyを実行してください.
使い方
===========

 Boxnyaフォルダを任意のディレクトリに置いて, コマンドラインからBoxnya/src/boxnya.pyを起動します.

プラグインは, Boxnya/src/lib/input, output, filterフォルダに入れ, 必要に応じて設定を書きます.

設定
===========

 Boxnya/src/settings.pyに設定を書きます.

Boxnya/src/settings.py.example のを参照してください.

プラグインの役割
===========

* Inputプラグイン

ネット等から情報を取得してきます. twitterの場合userstreamを読み続けます.

続きはあとでかく.
* Filterプラグイン

プラグイン開発者向け
Inputから受け取った情報をフィルタリングします.
twitterで複数アカウントを運用する場合などはまとめてフィルタリングすることができます.

Boxnyaでは入力, フィルター, 出力の順に情報を処理してim.kayac.com, Google Talkなどに通知を行います.
 全ての入出力とフィルターはプラグイン方式で実現されており, 入出力関係も任意のつなぎ方をすることが可能です.
例えばTwitterの情報をim.kayac.comを通してGoogle Talkに通知する流れとしては以下のようになります.
入力のTwitterプラグインでuserstreamを受け取る -> 適切なフィルタを通す -> im.kayac.comの出力プラグイン
各プラグインは, 対応するinput, filter, outputのディレクトリに格納し, それぞれの設定をsettings.pyに書くだけで使えます.
* Outputプラグイン

TODO: 免責事項
InputあるいはFilterから受け取った情報を, Boxnya以外のシステムへの送り出します.
twitterの場合には, Growlやim.kayac.comにデータを通知します.
37 changes: 30 additions & 7 deletions src/lib/filters/egosearch.py
Expand Up @@ -14,6 +14,29 @@ def init(self):
if isinstance(self.screen_name, str):
self.screen_name = [self.screen_name]

self.retweet = True
self.fav = True
self.dm = True
self.list = True
self.follow = True
self.reply = True
self.egosearch = True

if "retweet" in self.disable:
self.retweet = False
if "fav" in self.disable:
self.fav = False
if "dm" in self.disable:
self.dm = False
if "list" in self.disable:
self.list = False
if "follow" in self.disable:
self.follow = False
if "reply" in self.disable:
self.reply = False
if "egosearch" in self.disable:
self.egosearch = False

# オプション設定の読み込み
self.favsync_sources = getattr(self, "favsync_sources", [])
if isinstance(self.favsync_sources, str):
Expand All @@ -34,7 +57,7 @@ def filter(self, packet):
if not isinstance(data, dict):
return None

if data.get("mentions") and [user for user in self.screen_name if user in data["mentions"]]:
if self.reply and data.get("mentions") and [user for user in self.screen_name if user in data["mentions"]]:
mention = {"user":data["user"]["screen_name"],
"post":data["text"]}
if not self.isUnofficialRT(mention["post"]):
Expand All @@ -44,34 +67,34 @@ def filter(self, packet):
self.send({"text":mention["post"], "mention":data["mentions"], "type":"favtero"}, target=["favbot"])

elif data.get("event") and data["target"]["screen_name"] in self.screen_name:
if "favorite" in data["event"]:
if self.fav and "favorite" in data["event"]:
event = {"star":u"☆" if "un" in data["event"] else u"★",
"user":data["source"]["screen_name"],
"event":data["event"].title(),
"post":data["object"]["text"]}
self.send(u"%(star)s %(user)s %(event)sd: %(post)s" % event, exclude = ["favbot"])

elif "retweet" == data["event"]:
elif self.retweet and "retweet" == data["event"]:
event = {"user":data["source"]["screen_name"],
"post":data["object"]["text"]}
self.send(u"♺ %(user)s Retweeted: %(post)s" % event, exclude = ["favbot"])

elif "dm" == data["event"]:
elif self.dm and "dm" == data["event"]:
event = {"user":data["source"]["screen_name"],
"post":data["text"]}
self.send(u"DM from %(user)s: %(post)s" % event, exclude = ["favbot"])

elif "follow" == data["event"]:
elif self.follow and "follow" == data["event"]:
event = {"name":data["source"]["name"],
"screen_name":data["source"]["screen_name"]}
self.send(u"%(name)s (@%(screen_name)s) is now following you" % event, exclude = ["favbot"])

elif "list" in data["event"]:
elif self.list and "list" in data["event"]:
event = {"event":u"◆ Added into" if "add" in data["event"] else u"◇ Removed from",
"list":data["object"]["name"]}
self.send(u"%(event)s %(list)s" % event, exclude = ["favbot"])

elif self.regexp and self.pattern.search(data.get("text", "")):
elif self.egosearch and self.regexp and self.pattern.search(data.get("text", "")):
mention = {"user":data["user"]["screen_name"],
"post":data["text"]}
self.send(u"%(user)s: %(post)s" % mention, exclude = ["favbot"])
Expand Down
35 changes: 0 additions & 35 deletions src/lib/inputs/gmail.py

This file was deleted.

4 changes: 2 additions & 2 deletions src/lib/outputs/imkayac.py
Expand Up @@ -18,9 +18,9 @@ def throw(self, packet):
return None

params = {"message":message}
if self.password:
if hasattr(self, "password"):
params["password"] = self.password
if self.sig:
if hasattr(self, "sig"):
params["sig"] = hashlib.sha1("%s%s" % (message, self.sig)).hexdigest()

request = urllib2.Request(url, data=urllib.urlencode(params))
Expand Down
25 changes: 14 additions & 11 deletions src/settings.py.example
Expand Up @@ -13,7 +13,7 @@ DAEMON = False
# ログ出力を有効にするかどうか. True推奨.
LOGGING = True

# ログを保存するディレクトリ名
# ログを保存するディレクトリ名. この設定の場合, Boxnya/log/になります.
LOG_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),"log")

# エラーが発生した時にエラー内容を出力するOutputプラグイン名. []なら出力されません.
Expand All @@ -36,7 +36,6 @@ ENABLE_MODULES = []
INOUT = {
"twitter":["egosearch"],
"egosearch":["favbot", "imkayac"],
"gmail":["imkayac"],
}

## モジュール(プラグイン)の設定
Expand All @@ -51,14 +50,12 @@ INOUT = {
# つまり, 例のモジュール3では, 設定3に対してCが設定されたモジュールと, 設定3に対してDが設定された別々のモジュールが動きます.
# これはtwitterアカウントが複数ある場合などを想定しています.
# また, 複数設定する項目はリスト[]の中に文字列を書いてください.
# オプションとされている設定項目は書かなくても大丈夫です.

MODULE_SETTINGS = {
## Inputモジュールの設定
# gmailのアドレスとそのパスワード
"gmail":{"username":"", "password":""},

# twitterの設定は python boxnya.py init 2(2は任意の数字. アカウント数) を実行すると,
# このファイルの末尾に設定が書き込まれるのでそれをコピペしてください.
# python boxnya.py init 2(2は任意の数字. アカウント数) を実行してwebブラウザから認証を行うと,
# twitterの設定がこのファイルの末尾に設定が書き込まれるのでそれをコピペしてください.
"twitter":[
{'atokensecret': '', 'atoken': ''},
{'atokensecret': '', 'atoken': ''}
Expand All @@ -69,12 +66,18 @@ MODULE_SETTINGS = {
"egosearch":{
"screen_name":["",""], # "twitter"で設定したアカウントのスクリーンネーム
"regexp":"", # エゴサーチ用の正規表現
"disable":[] # オプション "retweet","fav","dm","list","follow","reply","egosearch"
# のキーワードをリスト内に書くことでその機能を無効にできます.
"favsync_sources":[""], # オプション favbotと組み合わせて, fav同期されるアカウントを指定します.
"favtero":True, # オプション favtero機能が使えるようになります
"filterRT":True, # オプション 非公式RTを通知しないようにします
# アカウント1でふぁぼると同じtweetをアカウント2でもふぁぼるといったことが可能です.
"favtero":False, # オプション favtero機能が使えるようになります
# @[自分のスクリーンネーム] fav [対象のスクリーンネーム] [ふぁぼる数]
"filterRT":False, # オプション 非公式RTを通知しないようにします
},

## Outputモジュールの設定
# im.kayac.comを使ってPUSH通知をするための設定. passwordとsigは設定してる場合だけ入力してください.
# im.kayac.comを使って通知をするための設定. passwordとsigは設定してる場合だけ入力してください.
# im.kayac.comを使うと, iPhoneへのPUSH通知やgoogle talkでの通知が可能です.
"imkayac":{
"username":"",
"password":"", # オプション
Expand All @@ -83,6 +86,6 @@ MODULE_SETTINGS = {
# fav同期やfavテロを行うための設定.
"favbot":{
"include":["twitter"], # "twitter"から設定をコピーしてきます.
"favsync_targets":[""], # オプションfav同期の対象を指定します.
"favsync_targets":[""], # オプション fav同期の対象を指定します.
},
}

0 comments on commit 319935c

Please sign in to comment.