前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >获取Github最新CVE

获取Github最新CVE

作者头像
Naraku
发布2021-07-28 11:00:50
1.1K0
发布2021-07-28 11:00:50
举报
文章被收录于专栏:Naraku的专栏Naraku的专栏

请注意,本文编写于 460 天前,最后修改于 117 天前,其中某些信息可能已经过时。

文章还没发几天就爆出这个你还敢用Github上的PoC么?

前言

最近在@洛米唯熊公众号中看到一篇对Github新CVE的监控并推送到微信的文章,其结合Github的API获取CVE的相关数据,并通过itchat库推送到微信。但是使用这个库登录的微信时,是不能再在PC端登录微信的,否则会被挤下线。虽然可以使用小号微信来运行脚本,但是感觉还是不方便,因为偶尔小号也可能会需要登录PC端。因此对这部分代码进行了改写,使用Server酱来进行消息的推送。

数据获取

  • 这里进行了一点改动,将获取到的数据通过JSON库转换成字典类型返回,便于后续匹配。并通过CVE-{当前年份}来获取今年的CVE,这样就不用每年都改了(如果这个脚本能跑上几年...

代码语言:javascript
复制
import json
import requests

def getNews():
    year = time.strftime("%Y", time.localtime(time.time()))
    try:
       api = f"https://api.github.com/search/repositories?q=CVE-{year}&sort=updated"
       response = requests.get(api).text
       data = json.loads(response)
       return data
    except Exception as e:
       print(e, "Github链接不通")

if __name__ == '__main__':
    data = getNews()

数据解析

  • 获取到的数据使用itemgetter()函数进行关键字排序,通过比较total的变化来判断是否需要推送
代码语言:txt
复制
- 参考:[Python3 - 通过关键字排序字典列表](https://www.jianshu.com/p/4ef2639e75d3)
代码语言:javascript
复制
from operator import itemgetter

def parseData(index):
    item = items[index]
    cve_name = item['name']
    cve_url = item['svn_url']
    cve_des = item['description']
    if not cve_des:  # 描述为空时会返回None
        cve_des = "Null"
    content = f"{cve_name}: {cve_url}, Des: {cve_des}"
    return content

if __name__ == '__main__':
    total = 0  # 初始化为0
    data = getNews()
    if total != data['total_count']:
        total = data['total_count']
        items = sorted(data['items'], key=itemgetter('id'), reverse=True)  # 根据items中的id进行排序
        content = parseData(0)  # 返回最新的1条

推送信息

  • 使用Server酱很轻松就可以实现消息的推送
代码语言:javascript
复制
def sendMsg(content):
    send_url = f"https://sc.ftqq.com/{SCKEY}.send"
    data = {
        "text": "CVE监控提醒",
        "desp": content
    }
    r = requests.post(send_url, data=data)

if __name__ == '__main__':
    SCKEY = "Your_SCKEY"
    total = 0  # 初始化
    data = getDic()
    if total != data['total_count']:
        total = data['total_count']
        items = sorted(data['items'], key=itemgetter('id'), reverse=True)  # 根据items中的id进行排序
        content = parseData(0)  # 返回最新的1条
        sendMsg(content)

完整代码

  • 最后引入time()函数,每隔一段时间运行一次即可
代码语言:javascript
复制
# -*- coding:utf-8 -*-
"""
@Author: Naraku
@File: Github_CVE_Wechat.py
"""
import time
import json
import requests
from operator import itemgetter


def getNews():
    year = time.strftime("%Y", time.localtime(time.time()))
    try:
       api = f"https://api.github.com/search/repositories?q=CVE-{year}&sort=updated"
       response = requests.get(api).text
       data = json.loads(response)
       return data
    except Exception as e:
       print(e, "Github链接不通")


def parseData(index):
    item = items[index]
    cve_name = item['name']
    cve_url = item['svn_url']
    cve_des = item['description']
    if not cve_des:  # 描述为空时会返回None
        cve_des = "Null"
    content = f"{cve_name}: {cve_url}, Des: {cve_des}"
    return content


def sendMsg(content):
    send_url = f"https://sc.ftqq.com/{SCKEY}.send"
    data = {
        "text": "CVE监控提醒",
        "desp": content
    }
    r = requests.post(send_url, data=data)


if __name__ == '__main__':
    SCKEY = "Your_SCKEY"
    total = 0  # 初始化
    while True:
        data = getNews()
        if total != data['total_count']:
            total = data['total_count']
            items = sorted(data['items'], key=itemgetter('id'), reverse=True)  # 根据items中的id进行排序
            content = parseData(0)  # 返回最新的1条
            sendMsg(content)
        time.sleep(60)

版权属于:Naraku

本文链接:https://cloud.tencent.com/developer/article/1853395

本站所有原创文章均采用 知识共享署名-非商业-禁止演绎4.0国际许可证 。如需转载请务必注明出处并保留原文链接,谢谢~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020 年 04 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 数据获取
  • 数据解析
  • 推送信息
  • 完整代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档