/Tongji-Notifier

获取同济大学4m3网站和各学院网站通知并进行邮件广播的Python爬虫框架

Primary LanguagePython

Tongji-Notifier

获取同济大学4m3、软件学院、外事办网站通知并进行邮件广播

1. 运行环境

Python 3.x

确保运行的主机上提供了可用的邮件服务(eg. Linux需要安装sendmail)

2. 额外的依赖包

requestsbeautiful soup,请保证你安装的是Python3版本

3. 初次使用

如果是首次在你的个人电脑或者服务器上部署Tongji-Notifier,我建议你按照以下步骤完成部署:

  1. 使用python database_manage.py命令建立数据库,并向其中添加你的邮箱地址,用于接下来检查邮箱服务是否正常工作。关于手动管理数据库的操作我将在之后详细说明。
  2. 使用python run.py deploy命令部署项目。在第一次部署项目时,程序会要求你依次输入学生ID学生ID 对应的密码用于发送邮件的邮箱(目前只支持QQ邮箱)和邮箱对应的密码。请注意,务必确保用于发送邮件的邮箱开通了SMTP服务,并且确认是否需要使用授权码作为密码登陆。
  3. 继续向数据库中添加需要发送邮件通知的邮箱地址。

4. 数据库的使用方法

数据库的名字是TJ_notice.db,你完全可以通过自己编程来管理它。这个数据库只包括两张表单,分别是notice (id varchar(10) primary key, title varchar(100)user (mail varchar(100) primary key)。其中,我为管理user这张表单设计了一个更简洁的管理脚本,它现在包含四个命令:

1. add

add命令将新的邮箱地址加入数据库,请保证add之前没有空格或其它字符,并且add与邮箱地址之间用空格分隔。命令形式如add example@qq.com

2. delete

delete命令用于删除数据库中的邮箱地址,它的使用方法与add相同。命令形式如delete example@qq.com

3. show

直接输入show,并且show之前没有其它字符,可以查看数据库中现有的邮箱地址。命令形式如show

4. quit

用于关闭脚本,使用方法同show。命令形式如quit

5. 程序运行日志

日志的地址为./notifier.log,可以从中检查各条通知的记录情况和邮件发送情况。

6. 几种运行模式

通过在运行脚本时输入额外的参数,可以指定运行模式,比如我在3中演示的deploy模式。下面列出了目前包括的运行模式:

1. 正常模式

通过执行命令python run.py选择。正常模式下,程序每天会在北京时间12:00和18:00检查4m3网站上的通知,并且将在上一次检查之后才出现的通知放入数据库,并向所有数据库中的邮箱发送相应的通知邮件,邮件的开头是【TJ_notifier】+新通知的标题,邮件正文是通知的内容(如果存在的话),并且不包含附件。由于原理所限,每天发送邮件的时间可能略有变化,但误差范围应该不会太大。

2. deploy模式

通过执行命令python run.py deploy选择。deploy模式主要用于第一次部署项目,在这种模式下脚本会抓取4m3上的信息并存入数据库,但不会将新通知发送给数据库中的用户(因为通常来讲,首次运行脚本会抓取到十几条通知,没有必要用十几封邮件去*扰用户),取而代之的是向用户发送一条service begin的通知。之后脚本会进入正常模式。

3. now模式

通过执行命令python run.py now选择。now模式没有时间限制,脚本运行后会立即执行一次“抓取信息-存储通知-发送邮件”的操作。之后脚本会进入正常模式。

7. 其它

两个文件./TJ./mail分别用于记录学生ID+密码发件邮箱地址+密码(或授权码),一般不需要修改。若是需要修改,请务必保持原有格式:第一行为ID或地址,第二行为密码。

8. 开发说明

整体逻辑说明

登陆网站(如果有) ---> 爬取所有通知id和标题 (返回一个字典)---> 与数据库中数据进行比对,筛选出通知(返回一个列表) ---> 爬取新通知的正文内容(返回一个字典) ---> 向数据库中的邮箱发送通知邮件

拓展方法

general_operation.py文件中提供两个通用模块:数据库交互模块和邮件发送模块,分别为act_with_database()send_to_user()

  1. act_with_database(note_dict)

接受的参数为一个{id:标题}形式的字典,id和标题都是字符串类型;返回一个包含所有新通知id的列表。

  1. 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长度不会超过这个上限。