Python 3.x
确保运行的主机上提供了可用的邮件服务(eg. Linux需要安装sendmail)
requests
和beautiful soup
,请保证你安装的是Python3版本
如果是首次在你的个人电脑或者服务器上部署Tongji-Notifier,我建议你按照以下步骤完成部署:
- 使用
python database_manage.py
命令建立数据库,并向其中添加你的邮箱地址,用于接下来检查邮箱服务是否正常工作。关于手动管理数据库的操作我将在之后详细说明。 - 使用
python run.py deploy
命令部署项目。在第一次部署项目时,程序会要求你依次输入学生ID
,学生ID 对应的密码
,用于发送邮件的邮箱
(目前只支持QQ邮箱)和邮箱对应的密码
。请注意,务必确保用于发送邮件的邮箱开通了SMTP
服务,并且确认是否需要使用授权码
作为密码登陆。 - 继续向数据库中添加需要发送邮件通知的邮箱地址。
数据库的名字是TJ_notice.db
,你完全可以通过自己编程来管理它。这个数据库只包括两张表单,分别是notice (id varchar(10) primary key, title varchar(100)
和user (mail varchar(100) primary key)
。其中,我为管理user这张表单设计了一个更简洁的管理脚本,它现在包含四个命令:
add命令将新的邮箱地址加入数据库,请保证add之前没有空格或其它字符,并且add与邮箱地址之间用空格分隔。命令形式如add example@qq.com
delete命令用于删除数据库中的邮箱地址,它的使用方法与add相同。命令形式如delete example@qq.com
直接输入show,并且show之前没有其它字符,可以查看数据库中现有的邮箱地址。命令形式如show
用于关闭脚本,使用方法同show。命令形式如quit
日志的地址为./notifier.log
,可以从中检查各条通知的记录情况和邮件发送情况。
通过在运行脚本时输入额外的参数,可以指定运行模式,比如我在3中演示的deploy模式。下面列出了目前包括的运行模式:
通过执行命令python run.py
选择。正常模式下,程序每天会在北京时间12:00和18:00检查4m3网站上的通知,并且将在上一次检查之后才出现的通知放入数据库,并向所有数据库中的邮箱发送相应的通知邮件,邮件的开头是【TJ_notifier】+新通知的标题
,邮件正文是通知的内容
(如果存在的话),并且不包含附件。由于原理所限,每天发送邮件的时间可能略有变化,但误差范围应该不会太大。
通过执行命令python run.py deploy
选择。deploy模式主要用于第一次部署项目,在这种模式下脚本会抓取4m3上的信息并存入数据库,但不会将新通知发送给数据库中的用户(因为通常来讲,首次运行脚本会抓取到十几条通知,没有必要用十几封邮件去*扰用户),取而代之的是向用户发送一条service begin的通知。之后脚本会进入正常模式。
通过执行命令python run.py now
选择。now模式没有时间限制,脚本运行后会立即执行一次“抓取信息-存储通知-发送邮件”的操作。之后脚本会进入正常模式。
两个文件./TJ
和./mail
分别用于记录学生ID+密码
和发件邮箱地址+密码(或授权码)
,一般不需要修改。若是需要修改,请务必保持原有格式:第一行为ID或地址,第二行为密码。
登陆网站(如果有) ---> 爬取所有
通知id和标题 (返回一个字典)---> 与数据库中数据进行比对,筛选出新
通知(返回一个列表) ---> 爬取新通知的正文内容(返回一个字典) ---> 向数据库中的邮箱发送通知邮件
general_operation.py
文件中提供两个通用模块:数据库交互模块和邮件发送模块,分别为act_with_database()
和send_to_user()
。
- act_with_database(note_dict)
接受的参数为一个{id:标题}形式的字典,id和标题都是字符串类型;返回一个包含所有新通知id的列表。
- send_to_user(note_dict, detail_dict)
接受的第一个参数为{id:标题}形式的字典,这个字典即为1中的参数,接受的第二个参数为{id:正文}形式的字典,且id和正文都是字符串类型。这个函数会使用两个字典中的id进行匹配,组合标题与正文,形成一封邮件发送给数据库中的邮箱。
开发者只需要按格式设计爬取通知id和标题
和爬取通知正文
的函数即可。
开发者务必对不同网站之间获取的通知id进行区别,否则可能会导致冲突,比如来自4m3网站的id为'4379'的通知会与来自SSE网站的id同样为'4379'的通知冲突。建议的做法是,在来自学院的通知id前加上学院的英文缩写,例如软件学院的通知id为SSE4379
。但同时要注意,数据库中id字段的长度最大为10,务必确保通知的id长度不会超过这个上限。