之前问了一下学长,目前的每日安全新闻推送框架有没有开源的,发现目前好像大家都是自己用自己的,也比较浪费时间,就有了写一个通用框架来推送信息的想法。

实现效果

日常解析RSS内容:

12ff0a991c011d9328676f63e5f3d9d3

3aa9275f87da67352104f0354c288525

请忽略我的字体…

0bee8a3dc6de9820261525584a4a9dce

内置了155个插件,包含各个类别的安全博客、论坛、社区等。

5f21fed523bab87dc01ef91ee69d3194

ReadMe

  • 目录结构
1
2
3
4
├── generat_plugin.py
├── info_collect.py
└── plugins
├── ...

将文章分为web、re、pwn、generic、coding、news这几类,方便推送给用户时,用户可根据自身需求快速查看对应文章,如需增加类别,需要修改以下代码:

在model_types中添加你要新增的类别名称即可。

6f54ba3920f5143224656da86ea78075

RSS源:zer0yu/CyberSecurityRSS: RSS: 优秀的网络安全知识来源

存入mongodb的数据字段:

24d5ae03167d39eca38c034024bbffbc

使用插件式开发,可以满足自定义插件以及自定义类别的需求,只需要按照格式写好对应的插件即可。

插件开发

插件格式:{}_{}_plugin.format(name,type,)

generat_plugin.py是用来以模板形式生成插件的,usage如下:

1
2
3
4
5
6
7
8
9
usage: generat_plugin.py [-h] -u URL -pn PLUGIN_NAME --type TYPE --rsstype
RSSTYPE

optional arguments:
-h, --help show this help message and exit
-u URL, --url URL Rss Url.
-pn PLUGIN_NAME, --plugin_name PLUGIN_NAME
Plugin name.
--type TYPE Plugin type.

这几个参数都是必须要传入的,url是rss的url,pn是插件的名称,type是插件的type,即web、re、pwn这些,使用这款插件生成工具,可以解决百分之90的rss源解析。

使用方式:

994502b98087e84ab63b548129b1bd6d

按照格式传入信息后,会在当前目录下生成插件:

e78b712bde489809ed60d5e69d5615f4

如果输出如上,即打印出了rss内的文章信息,并且两个时间格式都是相同的,就可以直接用了,不过在用之前要删去这两行:

c96b2616f1c61c31bc897b5de3ec2178

PS:我在模板中设置了rss的解析时间为10s,如果超出这个解析时间,默认定为解析失败,有需要的可以自行修改。

⚠️:插件生成工具不是万能的,有的插件并不支持我自定义好了的模板,比如某one插件。

他的rss是这样的:

56d81b7d62daa2f8e4ab99e6f337f0d0

里边没有我在模板中写好的updated参数,所以插件直接生成的脚本用不了,稍微改改才能用,最终运行效果如下。

56ea64e8ccc4243b1eef1a8bfefa8bc4

另外,写插件也并不一定非要是解析RSS的插件,其他插件都是可以的,只要最终往mongodb中插入指定结构的数据即可。

技术栈

  • 插件式开发
  • 协程
  • 数据库管理
  • 来源分类

已知问题

  • 工具运行后无法结束,一直卡顿。

这是一个python3协程的bug,也不知道为什么会一直卡住,之前在群里问了许多师傅都没得到解决办法,遂在stackoverflow写了个帖子,目前还没人回复,我会一直跟进。

stackflow地址:asyncio wait_for timeout exceptions but the program didn’t exit

短期解决办法:

  • 手动关闭
  • 使用crontab在后台运行程序

爬取下来的数据如何利用

这个是最简单的问题了,既然数据都有了,无非就是套各种的推送工具,如qq机器人、企业微信机器人…等等。

当然,如果你想写个前端来展示这些数据的话,也是很简单的,只需要学一天django就够了,奈何我前端实在太烂,之前想写个在线工具来用,后端一个下午解决,前端写了三天还没写好,最终他长这个样子:

be80cc0819a7a4000ca7724902df3d3b

综上所述,如果想实现一个推送demo,其实很简单,把数据每天定时代进去就好了,附上企业微信推送的方法。

先下载企业微信,在群聊里添加一个机器人,会得到一个api地址。

1
2
3
4
5
6
def push_wechat_group(content):
resp = requests.post("https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=9651234b-f90e-4064-80fd-0a69d6c1d867",
json={"msgtype": "markdown",
"markdown": {"content": content}})
if resp.json()["errno"] != 0:
raise ValueError("push wechat group failed, %s" % resp.text)

最后把数据展示成content,传给api就好了,如上⬆️。

以下是我第一版还没做分类时的推送效果:

0bb40dbe8354d9f3b6c149ea8dc1d497

cfdef57f40588b7943ec342548029d38

写在最后

开发不易,且嫖且珍惜。(开玩笑

项目地址:https://github.com/p1g3/Collect-Info-Research