正在阅读:

[Python]安全新闻订阅脚本

4,497

自从firefox频繁升级以后,原来比较好用的feed新闻订阅插件brief就不好用了,而且插件装多了,firefox启动也比较慢。后来就一直没有再订阅各大网站的新文章了,这让我错过了好多好的文章,于是自己花了点时间折腾了一个订阅的脚本,分享给有需要的兄弟们。

脚本特点:

1、此脚本使用了python的feed解析库,需要独立安装。

2、使用sqlite3数据库存储已经更新的文章。

3、有文章更新以后,会发邮件到你指定的邮箱。

4、只有一个文件,代码也比较少,使用超级简单。

5、脚本注释详尽,不懂的话博客留言,我会回复你的。

feed库安装

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Date: 2015/12/10
# Created by 独自等待
# 博客 http://www.waitalone.cn/
import sqlite3
import smtplib
from email.mime.text import MIMEText

try:
    import feedparser
except ImportError:
    raise SystemExit(u'模块导入错误,请使用pip install feedparser命令安装')


class SecNews():
    "安全新闻获取类"

    def __init__(self):
        self.sec_news = []  # 保存更新的数据
        self.msg = u'<p style="color:red; font-size: 18px">独自等待博客技术支持</p>'  # 保存邮件发送的内容
        self.filter = u'招聘'  # 需要过滤的关键字
        self.news_db = 'sec_news.db'  # 存储的数据库名称
        self.init_db()  # 数据库初始化
        self.getnews()  # 获取安全新闻
        self.insert_news()  # 插入安全新闻

    def init_db(self):
        "初始化数据库,没有则自动创建"
        conn = sqlite3.connect(self.news_db)
        cursor = conn.cursor()
        cursor.execute(
            '''
            CREATE TABLE IF NOT EXISTS SecNews(
            id INTEGER PRIMARY KEY AUTOINCREMENT ,
            title VARCHAR (255),
            url VARCHAR (255),
            createdate DATETIME DEFAULT (DATETIME('now','localtime'))
            )
            '''
        )
        conn.close()

    def getnews(self):
        "获取安全新闻,只接受feed订阅"
        news_list = [
            'http://0day5.com/feed/',
            'https://www.leavesongs.com/rss.php',
            'http://bobao.360.cn/rss?type=learning',
            'http://www.wooyun.org/feeds/public',
            'http://drops.wooyun.org/feed',
            'http://www.iswin.org/atom.xml',
            # 'http://www.waitalone.cn/feed',
        ]  # feed列表,可自行添加
        for feed_url in news_list:
            self.parsexml(feed_url)

    def insert_news(self):
        "向数据库插入安全新闻"
        conn = sqlite3.connect(self.news_db)
        cursor = conn.cursor()
        for title, url in self.sec_news:
            cursor.execute("INSERT INTO SecNews(title,url) VALUES (?,?)", (title, url))
        conn.commit()
        cursor.close()

    def send_email(self, content):
        "向指定email发送邮件"
        mailto_list = ['xliang@vip.qq.com']  # 收件人地址,多个地址请用,分割
        mail_host = 'smtp.qq.com'  # 其它邮箱请自行更改
        mail_user = '10000'  # QQ邮箱账号(QQ号)
        mail_pass = 'waitalone.cn'  # 邮箱密码(QQ密码)
        mail_postfix = '@qq.com'  # 邮箱的后缀
        sender = u'独自等待安全新闻播报 <%s>' % (mail_user + mail_postfix)
        content += u'<p style="color:red">独自等待博客提供技术支持:' \
                   u'<a href="http://www.waitalone.cn/">' \
                   u'http://www.waitalone.cn/</a></p><br>'  # 授权,请勿删除!
        msg = MIMEText(content, _subtype='html', _charset='utf-8')
        msg['Subject'] = u'安全新闻播报'  # 邮件主题
        msg['From'] = sender  # 发件人名称
        msg['To'] = ','.join(mailto_list)  # 收件人名称
        smtp = smtplib.SMTP(mail_host)
        # smtp.set_debuglevel(True) #当邮件发送不成功的时候,请去掉本行最前面的#号进行调试
        smtp.login(mail_user, mail_pass)
        smtp.sendmail(sender, mailto_list, msg.as_string())
        smtp.close()

    def parsexml(self, feed_url):
        "解析安全新闻"
        feed = feedparser.parse(feed_url)
        for i in range(len(feed['entries'])):
            title = feed['entries'][i]['title']
            url = feed['entries'][i]['link']
            conn = sqlite3.connect(self.news_db)
            cursor = conn.cursor()
            cursor.execute("SELECT title,url FROM SecNews WHERE title LIKE ? OR url LIKE ?", (title, url))
            result = cursor.fetchall()
            if result == []:
                if self.filter in title: continue
                self.msg += title + '<br><a href="' + url + '">' + url + '</a><br><br>\n'
                self.sec_news.append((title, url))


if __name__ == '__main__':
    secnews = SecNews()
    if 'href' in secnews.msg:
        secnews.send_email(secnews.msg)

使用方法:

请将脚本保存为secnews.py 然后加入到计划任务执行即可,建议一天执行两次。

2016年3月16日,更新,请大家重新保存。

目前有:2条访客评论,博主回复2

  1. x
    2015-12-24 08:25

    bamboo feed reader插件也不错

    • 独自等待
      2015-12-24 09:59

      插件加载多了,浏览器启动老慢了。所以我现在已经不使用插件的方式了,现在就用这个脚本,也比较方便。谢谢兄弟。

  2. 别梦寒
    2016-04-08 22:00

    博主,该脚本运行后没报错,但是邮件却没有发送,这个是什么原因?再者sec_news.db用记事本打开中文是乱码的,这如何解决呢?望解答

    • 独自等待
      2016-04-11 09:47

      请重新保存代码,然后另存为UTF-8格式,然后执行,如果还是收不到邮件的话,请把smtp.set_debuglevel(True)前面的注释 打开,测试一下是不是邮箱登录出现了问题。

留下脚印,证明你来过。

*

*

流汗坏笑撇嘴大兵流泪发呆抠鼻吓到偷笑得意呲牙亲亲疑问调皮可爱白眼难过愤怒惊讶鼓掌