人生苦短,我使用Python,Python是一种用于快速构建应用程序的优秀编程语言。在这篇文章中我们将学习如何使用Python搭建一个RSS通知系统,目标是使用Fedora愉快地学习Python。如果您正在寻找一个完整的RSS通知应用程序,Fedora中已经为您准备了几个软件包。Fedora和Python-Fedora中默认安装了Python3.6入门,它包括许多Python的标准库。标准库提供了一组模块,使我们的任务更容易。例如,在我们的例子中,我们将使用sqlite3模块来创建表,在数据库中添加和读取数据。在这种情况下,我们试图解决标准库中没有包含的特定问题,并且可能已经有人为我们开发了这样的模块。最好的方法是使用著名的PyPIPython包索引进行搜索。在我们的示例中,我们将使用feedparser来解析RSS提要。由于feedparser不是标准库,我们需要在我们的系统上安装它。幸运的是,Fedora有这个RPM包,所以我们可以运行以下命令来安装feedparser:$sudodnfinstallpython3-feedparser我们现在已经有了编写应用程序所需的东西。存储源数据我们需要存储已经发表文章的数据,这样我们的系统就可以只提示新发表的文章。我们要保存的数据将是识别文章的唯一方法。因此,我们将存储文章的标题和发布日期。因此,让我们使用Pythonsqlite3模块和一个简单的SQL语句来创建我们的数据库。还要添加一些稍后会用到的模块(feedparse、smtplib和email)。创建数据库#!/usr/bin/python3importsqlite3importsmtplibfromemail.mime.textimportMIMETextimportfeedparserdb_connection=sqlite3.connect('/var/tmp/magazine_rss.sqlite')db=db_connection.cursor()db.execute('CREATETABLEIFNOTEXISTSmagazine(titleTEXT,dateTEXT)')这几行代码新建了一个名为magazine_rss.sqlite的sqlite数据库文件,然后在数据库中新建了一个名为magazine的表。该表有两列——标题和日期——可以存储TEXT类型的数据,这意味着每一列中的值都是文本字符。检查数据库中的旧文章因为我们只想将新文章添加到我们的数据库中,所以我们需要一个函数来检查数据库中是否存在RSS提要中的文章。我们将使用它来确定是否发送电子邮件提醒(带有新文章)。好的,现在让我们来编写这个函数的代码。defarticle_is_not_db(article_title,article_date):"""检查给定的一对文章标题和日期是否在数据库中。args:article_title(str):文章的标题article_date(str):文章的发布日期Return:如果文章不在数据库中则为真如果文章已存在于数据库中则为假"""db.execute("SELECT*frommagazineWHEREtitle=?ANDdate=?",(article_title,article_date))如果不存在db.fetchall():returnTrueelse:returnFalse该函数的主要部分是我们运行的用于搜索数据库的SQL查询。我们使用SELECT命令来定义我们将在哪些列上运行查询。我们使用*符号来选择所有列(标题和日期)。然后,我们使用查询的WHERE条件article_title和article_date来匹配title和date列中的值来检索我们需要的东西。***,我们使用一个简单的逻辑,返回True或False来指示是否在数据库中找到了匹配的文章。向数据库中添加新文章现在我们可以编写一些代码来向数据库中添加新文章。defadd_article_to_db(article_title,article_date):"""向数据库添加新的文章标题和日期args:article_title(str):文章标题article_date(str):文章发表日期"""db.execute("INSERTINTOmagazineVALUES(?,?)",(article_title,article_date))db_connection.commit()这个函数很简单,我们使用SQL查询向杂志表的article_title和article_date列插入新行.然后提交到数据库并保存。这些就是我们数据库中需要的东西。下面我们就来看看如何使用Python实现提醒系统和发送邮件。发送电子邮件提示让我们使用Python标准库模块smtplib创建一个发送电子邮件的函数。我们还可以使用标准库中的电子邮件模块来格式化我们的电子邮件消息。defsend_notification(article_title,article_url):"""向数据库添加新文章标题和日期args:article_title(str):文章标题article_url(str):访问文章的url"""smtp_server=smtplib.SMTP('smtp.gmail.com',587)smtp_server.ehlo()smtp_server.starttls()smtp_server.login('your_email@gmail.com','123your_password')msg??=MIMEText(f'\n你好是一篇新的Fedora杂志文章:{article_title}。\n您可以在这里阅读它{article_url}')msg??['Subject']='NewFedoraMagazineArticleAvailable'msg['From']='your_email@gmail.com'msg['To']='destination_email@gmail.com'smtp_server.send_message(msg)smtp_server.quit()在这个例子中,我使用谷歌邮件系统的smtp服务器发送邮件,在你自己的代码中你需要改变它到您自己的电子邮件提供商的SMTP服务器。这个函数是一个样板,大部分内容应该根据你的smtp服务器的参数来配置。还要将代码中的电子邮件地址和凭据更改为您自己的。如果您对Gmail帐户使用双因素身份验证,那么您需要配置一个密码应用程序,以便为您提供该应用程序的唯一密码。请参阅此帮助页面。阅读FedoraMagazine的RSSFeed现在我们已经有了在数据库中存储文章和发送提醒邮件的功能,让我们创建一个解析FedoraMagazine的RSSfeed并提取文章数据的功能。defread_article_feed():"""从RSS提要中获取文章"""feed=feedparser.parse('https://fedoramazine.org/feed/')forarticleinfeed['entries']:ifarticle_is_not_db(article['title'],article['published']):send_notification(article['title'],article['link'])add_article_to_db(article['title'],article['published'])if__name__=='__main__':read_article_feed()db_connection.close()这里我们将使用feedparser.parse函数.此函数返回RSS提要的字典表示,有关feedparser的完整描述,请参阅其文档。RSS提要解析将返回前10篇文章作为条目,然后我们提取以下信息:标题、链接、文章发布日期。所以我们现在可以使用之前定义的函数来检查数据库中是否存在文章,然后发送提醒邮件并将文章添加到数据库中。运行我们的脚本时,***if语句运行我们的read_article_feed函数,然后关闭数据库连接。运行我们的脚本,给脚本文件正确的运行权限。接下来,我们使用cron实用程序每小时自动运行我们的脚本。cron是一个作业调度程序,我们可以使用它在固定时间运行任务。$chmoda+xmy_rss_notifier.py$sudocpmy_rss_notifier.py/etc/cron.hourly为了使本教程简单明了,如果您想了解有关cron的更多信息,我们使用cron.hourly目录每小时运行一次我们的脚本。以及如何配置crontab,请阅读有关cron的维基百科页面。总结在本教程中,我们学习了如何使用Python创建一个简单的sqlite数据库、解析RSS提要和发送电子邮件。我希望本文向您展示了使用Python和Fedora构建您自己的应用程序是多么容易。该脚本在GitHub上可用。
