Torabot是一个二次元(已经混入了一些三次元的异端 bgm38)事件的(邮件)通知工具(框架). 目前实现了8个模块(mod):
- Pixiv榜单订阅, 画师订阅. 邮件里附带缩略图.
- Bilibili新番订阅.
- 虎穴同人本上架/预售通知. 可以用来抢本子.
- 人人影视RSS订阅(作为撰写模块的tutorial).
- yande.re订阅(二次元高清图站).
- danbooru订阅(海量二次元图站).
- e-hentai订阅(绅士图站).
- RSS/Atom订阅(可以用来订阅ktxp的种子, Github的通知等等).
Torabot旨在提供一个可扩展的通知更新框架(虽然最初目的并不是这个...), 可以用于服务终端用户, 或为其它内容聚合服务提供一个独立的通知更新接口(计划中).
本项目目前仍处于原型设计阶段, 其接口在正式版1.0.0
发布之前可能会有较大改动.
首先你需要一台linux机器. OSX没试过, 理论上是可以的. Windows的话, 呵呵...
因为scrapy和fabric不支持Python3, 本站需要两个Python环境: Python 3.3.4+
(前端和后台任务), Python 2.7.6
(scrapy, fabric). 如果你不需要远程部署, 请忽略fabric. 建议使用pyenv和virtualenvwrapper管理多个Python环境. 本站默认的Python3 virtualenv为torabot, Python2 virtualenv为www27.
在源码根目录下(后文若不特别说明, 脚本执行路径均在源码根目录下):
pyenv shell 2.7.6
workon www27
pip install -r dependencies-27.txt
pyenv shell 3.3.4
workon torabot
pip install -r dependencies.txt
pip install -e .
最后一句用于注册模块的entry points.
pyenv shell 2.7.6
workon www27
scrapyd &
./deployspy
注意每次修改模块的spy
目录之后都需要重新deployspy
.
数据库采用PostgreSQL 9.3.4
(没测试过其它版本). 设置好PostgreSQL用户之后:
createdb torabot-dev
psql torabot-dev < torabot/db/schema.sql
torabot/db/schema.sql
已经是最新的, 不需要打torabot/db/migrate
目录下的补丁.
Redis 2.8.8
(其它版本没试过). 用于进程间通信, 缓存和运行时信息存储.
首先你需要在根目录下添加toraconf.py
, 用于保存私有配置, 例如:
from torabot.conf import *
TORABOT_REPORT_EMAIL = 'torabot+report@aip.io'
TORABOT_EMAIL_USERNAME = 'torabot@aip.io'
TORABOT_EMAIL_PASSWORD = 'guess it'
TORABOT_ADMIN_IDS = [1]
TORABOT_MOD_PIXIV_SPY_PHPSESSID = 'get it from pixiv cookies'
TORABOT_DOMAIN = 'torabot.aip.io' # use localhost:5000 or keep empty here
除了上述配置, 可以参考torabot/conf.py
覆盖其中的默认配置. 其中用于发送通知的邮箱必须是google的.
pyenv shell 2.7.6
workon www27
scrapyd &
pyenv shell 3.3.4
workon torabot
nosetests
pyenv shell 2.7.6
workon www27
scrapyd &
pyenv shell 3.3.4
workon torabot
celery worker -A torabot &
celery beat -A torabot &
python run.py
如果你需要多线程, 最后一句可以换成:
gunicorn -b 0.0.0.0:5000 -k gunicorn_worker.Worker gunicorn_app:app
参考根据自己的需要修改fabfile.py, 然后使用fab gunicorn
部署.
(本节内容有待完善)
Torabot的最主要目的是提供一个可扩展的通知更新框架. "可扩展"包括:
- 来源可扩展. 即支持订阅不同的站点.
- 渲染方式可扩展. 即可以将站点的搜索结果和通知内容在不同的媒体上表现出来(目前实现了web和email, 后续可能加入移动平台客户端).
- 通知方式可扩展. 这一点和2是相关的, 目前实现了邮件通知.
模块(mod)定义了1和2, 其接口参见torabot/mods/base.py
. 其中1对应的接口包括spy
和changes
. 前者定义了如何抓取一个查询(字符串)对应的界面结构(返回torabot.ut.bunch.Bunch
, 即一个经过包装的dict
), 默认采用scrapy抓取; 后者定义了如何比较两个spy
返回的页面结构, 并返回表示更新的结构(也是Bunch
的序列). 2对应一系列的format_xxx
接口, 这些接口均包含一个view
(字符串)参数, 用于表示渲染目标("web"或"email").
Torabot本身并不限制上述所有Bunch
的结构, 你可以往其中加入任何东西, 但是每个mod需要负责各自的Bunch
的构造和解析. Torabot也不限制页面的抓取方法, 虽然默认采用scrapy, 但是对于简单的抓取, 你也可以直接用requests等库. 但是请注意, 某些站点的页面并不规范, 解析时可能会有性能问题和内存泄漏(lxml), 建议将抓取逻辑放在独立进程里, 或者采用scrapy.
推荐的写法参见torabot/mods/yyets
.
创建mod的一般步骤为:
mkdir torabot/mods/foo
pushd torabot/mods/foo & scrapy startproject foo & mv foo spy & popd
- 参考
torabot/mods/yyets
做相应修改. - 编辑
setup.py
加入对应的entry point. deployspy
.
MIT