打造一个通用的信息推送框架
2020-02-06 10:12:30 Author: xz.aliyun.com(查看原文) 阅读量:271 收藏

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

实现效果

日常解析RSS内容:

请忽略我的字体...

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

ReadMe

  • 目录结构
├── generat_plugin.py
├── info_collect.py
└── plugins
    ├── ...

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

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

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

存入mongodb的数据字段:

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

插件开发

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

⚠️:插件一定要满足这个格式,否则是无法正常使用的,比如chy的插件名格式为chybeta_web_plugin,以此类推。

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

usage: generat_plugin.py [-h] -u URL -pn PLUGIN_NAME --type TYPE

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源解析。

使用方式:

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

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

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

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

他的rss是这样的:

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

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

下面演示如何把chybeta写成一个插件:

技术栈

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

已知问题

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

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

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

短期解决办法:

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

爬取下来的数据如何利用

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

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

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

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

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就好了,如上⬆️。

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

写在最后

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

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


文章来源: http://xz.aliyun.com/t/7165
如有侵权请联系:admin#unsafe.sh