今天是星期天晚上。你躺在床上。你知道你的网站是否启动了吗?
在这个中级教程中,我将向您展示如何使用 Python 创建和自动化带有电子邮件通知的简单正常运行时间监视器。对于历史分析,稍后我们将数据存储在 MySQL 中。除了检测站点是启动还是关闭之外,我们还将获取一些快速数据和基本的TLS / SSL验证。
注意: 下面的某些代码中存在占位符,您需要在其中填写环境的详细信息。
要求和假设
访问Linux安装(我推荐Ubuntu)并了解基本的终端功能
已安装 Python 3 并理解基本的 Python 语法
在本地或外部访问 MySQL 数据库
导入必要的模块
Python 模块就像其他编码语言中的库。它们是预制函数的集合,您可以使用它们通过不重新发明轮子来节省时间。我们将要使用的大多数Python模块都应该预装,但有三个没有预装的是fake_useragent,yagmail和mysql.connector。请务必阅读yagmail上的文档,其中有一点配置。非常容易。要安装这些命令,请转到命令终端并键入以下两个命令:
pip3 install mysql.connector
pip3 install fake_useragent
pip3 install yagmail
如果您收到有关其他缺少模块的任何错误,则可以使用上面的相同代码来安装其余模块。只需确保将最后一部分替换为新模块的名称即可。有时名称不明显;您可以在此处搜索模块名称。
创建 MySQL 表
首先,我们需要设置存储监视数据的数据库。有两种常见的方法来访问和管理MySQL:通过命令终端和通过cPanel的phpMyAdmin GUI。
选项 1 – 命令行终端:
如果您没有cPanel或在终端中最舒适,请按照本指南登录MySQL以创建数据库和用户。然后,运行下面的 SQL 语句来创建表。
选项 2 – phpMyAdmin:
如果您有权访问cPanel,则可以在MySQL数据库区域中创建数据库和用户。之后,转到phpMyAdmin(也可以在cPanel中找到)。从左侧列表中选择数据库。在顶部的“SQL”选项卡中,输入以下 SQL 语句以创建包含要监视的网站的表。如果您已经根据我以前的指南之一创建了此表,则可以改用该表。
CREATE TABLE websites (
websiteid int NOT NULL AUTO_INCREMENT,
name varchar(255),
url varchar(255),
PRIMARY KEY (websiteid )
);
此时,您的网站 (URL) 将有一个空表。当然,您会希望此表填充要监视的 URL 数量。我通常只关注主页。如果您在phpMyAdmin中创建了表,则可以在左侧列中选择它,然后选择顶部的“插入”。为您要监控的每个网站填写该表单。
您也可以通过SQL插入网站记录,如下所示(网站ID是自动生成的):
INSERT INTO websites (name,url) VALUES ("Rocket Clicks","https://www.rocketclicks.com")
接下来,我们准备使用以下 SQL 语句为监视数据创建表:
CREATE TABLE uptime (
scanid int NOT NULL AUTO_INCREMENT,
websiteid int(255),
date varchar(255),
time varchar(255),
status_code int(255),
speed float(255),
cert_valid int(255),
PRIMARY KEY (scanid)
);
准备好脚本
启动您最喜欢的代码编辑器或 IDE。我推荐PyCharm给更有经验的程序员
将下面的代码放在文件的第一行。它被称为shebang或hashbang,告诉Linux如何执行文件。这通常是可选的,但在从 cronjob 运行时是必需的,我们稍后会这样做。这告诉Linux使用Python 3运行。
#!/usr/bin/python3
首先,让我们导入我们将要使用的 Python 模块。
## Get today's date
from datetime import date
## Get today's time
from datetime import datetime
## For header info
import requests
## For time delay
import time
## To connec to mysql
import mysql.connector
## Generate random valid user agents for request
from fake_useragent import UserAgent
## For email notifications
import yagmail
从这里开始,我们将在创建两个函数时稍微向后工作。一个用于处理网站请求,另一个用于写入 MySQL。
让我们从创建我们的 uptime() 函数开始,该函数将请求网站为其服务器并记录交互。此函数将接收 3 个变量、URL、名称和标头信息。对于我们对网站的请求,我们将使用 Try/Except ,因为我们使用的是请求函数的 verify 属性并将其设置为 True。这将验证 TLS 证书并防止您扫描恶意 URL。如果您确定要扫描的站点的安全性,则可以将其设置为 False。如果设置为 True 并且 URL 的证书无效,则会引发错误,脚本将停止。我们使用 Try/except 来记录事件,即使在出现错误后也继续。
def uptime(url,name,header):
try:
response = requests.get(url,headers=header,verify=True)
except:
gettime = "n/a"
status_code_num = "n/a"
cert_valid = "1"
return status_code_num,gettime,cert_valid
继续在 uptime() 函数中,我们将从刚刚创建的响应对象中获取status_code。然后,我们测试该状态代码是否是成功的 200 响应。如果是,我们将利用 elapsed_time 属性下载 URL 文件内容(源代码)所花费的时间。如果不是 200,我们将跳过获取速度数据。
status_code_num = response.status_code
if response.status_code == 200:
gettime = round(response.elapsed.total_seconds(),2)
else:
gettime = 0
return status_code_num,gettime, cert_valid
现在我们创建函数来存储来自 uptime() 函数的数据。我们可以在此处生成时间和日期,这对于跟踪停机原因很重要。我们构建 SQL 语句并执行它以插入记录。
def writetolog(websiteid,name,status_code_num,gettime,cert_valid):
now = datetime.now()
today = date.today()
getnow = now.strftime('%H:%M')
getdate = today.strftime('%m/%d/%Y')
mydb = mysql.connector.connect(port="3306", host="HOSTIP",user="USER",password="PASSWORD", database="DATABASE")
cursor = mydb.cursor()
new_scan = "INSERT INTO uptime (websiteid,date,time,code,speed,cert_valid) VALUES ('" + str(websiteid) + "','" + getdate + "','" + getnow + "','" + str(status_code_num) + "','" + str(gettime) + "','" +str(cert_valid)+ "')"
print(new_scan)
cursor.execute(new_scan)
写入日志记录后,让我们检查状态代码是否为 200 或是否存在证书问题,如果没有,请发送站点已关闭的通知!请务必使用之前使用 yagmail 配置的那个更改YOUR_GMAIL_ADDRESS。然后将TO_GMAIL_ADDRESS替换为应接收通知的电子邮件地址。您可以使用 if/then 轻松扩展它,以便在消息关闭或证书问题时更改消息。大多数情况下,如果出现严重的证书问题,浏览器会提醒用户并询问他们是否要继续。
if status_code_mum != 200 or cert_valid == 1:
body = "Your website: "+url+"Is DOWN! \n\n"
body += str(response.text.encode('utf8'))
yag = yagmail.SMTP("YOUR_GMAIL_ADDRESS")
yag.send(
to="TO_EMAIL_ADDRESS",
subject=name + " is Down or there is a TLS certificate issue!",
contents=body
)
这是脚本实际开始的地方。首先从数据库生成网站 URL 列表。填写 mydb 变量的连接信息。您会看到我创建了另一个数据库连接。如果有人知道我是否可以将 mydb 和光标传递给 writetolog 函数,请告诉我!继续前进,我们开始循环浏览我们的网站记录。我们获取网站ID,名称和URL。我包含一个注释掉的行,您可以在其中确保 URL 变量包含无法测试停机时间功能的 URL。
mydb = mysql.connector.connect(port="3306", host="IP",user="USER",password="PASSWORD", database="DBNAME")
new_scan = "SELECT * FROM websites"
cursor = mydb.cursor()
cursor.execute(new_scan)
records = cursor.fetchall()
for row in records:
websiteid = str(row[0])
name = str(row[1])
url = str(row[2])
#url = "https://expired.badssl.com/" ### For downtime testing
接下来,我们调用 fake_useragent 函数来生成 Chrome 用户代理,并将 URL、名称和标头传递到我们之前创建的 uptime() 函数中。uptime() 函数运行后,它返回状态代码、速度和证书状态。然后它将所有这些信息传递到我们已经创建的 writetolog() 函数中,并存储记录!
ua = UserAgent()
header = {
'User-Agent': ua.chrome
}
status_code_num, gettime, cert_valid = uptime(url,name,header)
writetolog(websiteid,name,status_code_num,gettime, cert_valid)
mydb.close()
自动扫描
如果您的正常运行时间 Python 脚本在手动运行时运行良好,那么是时候自动化它了。幸运的是,Linux 已经通过使用 crontab 为我们提供了一个解决方案。crontab 存储脚本条目,您可以在其中指定何时执行它们(如调度程序)。在如何安排脚本(一天中的任何时间、星期几、月中的某一天等)方面,您有很大的灵活性。要将条目添加到 crontab,请运行以下命令:
crontab -e
它可能会在 vi 编辑器中打开 crontab 文件。在文件底部的空白行上,键入下面的代码。此代码将在每周日的午夜运行脚本。要将时间更改为其他时间,请使用此 cronjob 时间编辑器。使用脚本路径进行自定义。
0 0 * * SUN /usr/bin/python3 PATH_TO_SCRIPT/filename.py
如果要创建日志文件以记录每次运行脚本的时间,可以改用该文件。使用脚本路径进行自定义。
0 0 * * SUN /usr/bin/python3 PATH_TO_SCRIPT/filename.py > PATH_TO_FILE/FILENAME.log 2>&1
保存 crontab 文件,您就可以开始了!请注意,在 cronjob 设置为运行时,您的计算机需要处于打开状态。