利用Python进行SEPM virus definition自动下载:(二)代码实现

利用Python进行SEPM virus definition自动下载:(一)环境准备及页面分析
https://blog.51cto.com/blogger/success/2491345

?前面我们已经准备好了环境以及分析获取到了网页中我们想要的信息,本文我们来进行代码实现自动下载文件,并计算下载的文件的Hash值,然后和网页提供的Hash进行对比。

直接先上代码,后面有空再对代码进行一一说明。

# coding = utf-8
import requests
from tqdm import tqdm
import os
import hashlib
import json

# 设置requests请求的头和代理
headers = {
    ‘user-agent‘: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0‘
}
# 设置代理信息
proxy = {
    ‘http‘:‘0.0.0.0:xxxx‘,
    ‘https‘:‘0.0.0.0:xxxx‘
}
print("正在获取文件信息JSON…") # 打印操作提醒
# 通过访问JSON文件进行处理,得到需要的参数值
# 访问第一个JSON文件,获得“lastpubdate”值
url1 = "https://www.broadcom.com/pubdate/pubdate.json"
req1 = requests.get(url1, headers=headers) 
lastpubdate = json.loads(req1.text)[‘lastpubdate‘]
url2 = "https://www.broadcom.com/api/v2/getmetadata?vanityurl=support/security-center/definitions/download/detail&locale=avg_en&lastpubdate=" + lastpubdate
# 访问第二个JSON文件,获得“updateddate”值
req2 = requests.get(url2, headers=headers) 
updateddate = json.loads(req2.text)[‘updateddate‘]
# 构造最终访问的URL
url = "https://www.broadcom.com/api/getjsonbyurl?vanityurl=support/security-center/definitions/download/detail&locale=avg_en&updateddate=" +updateddate +"&gid=sep14"
print("获取JSON文件URL成功,URL为:%s"%url) # 打印操作提醒
req = requests.get(url, headers=headers)                  # 不使用代理
# req = requests.get(url, headers=headers, proxies=proxy) # 使用代理
print("获取JSON内容成功") # 打印操作提醒
data = json.loads(str(req.text))
win_data = data[‘groups‘][0][‘packages‘][6][‘file‘]
Lin_data = data[‘groups‘][1][‘packages‘][0][‘file‘]
print("解析JSON内容成功") # 打印操作提醒

# print(type(win_data[‘name‘]),win_data[‘name‘].split(‘/‘,2)[2])

# 字典中的文件名前面有“jdb/core3sds/”,通过字符串切割进行去除
win_data.update(name=win_data[‘name‘].split(‘/‘, 2)[2])

# 切换当前路径到当前目录的父目录
# os.chdir(os.path.abspath(os.path.dirname(os.getcwd())))

# 下载Windows平台的定义包jdb文件
print("正在下载Windows平台定义包文件:", win_data[‘name‘], "文件大小为:", win_data[‘size‘])
print("下载的定义包文件MD5值为:", win_data[‘md5‘])
r1 = requests.get(win_data[‘_url_‘], stream=True)                 # 不使用代理
# r1 = requests.get(win_data[‘_url_‘], stream=True, proxies=proxy) # 使用代理
with open(win_data[‘name‘], "wb") as f1:
    for data in tqdm(r1.iter_content(chunk_size=512), desc="下载中"):
        # if data:
        f1.write(data)
# 下载Linux平台的定义包sh文件
print("正在下载Linux平台定义包文件:", Lin_data[‘name‘], "文件大小为:", Lin_data[‘size‘])
print("下载的定义包文件MD5值为:", Lin_data[‘md5‘])
r2 = requests.get(Lin_data[‘_url_‘], stream=True)                 # 不使用代理
# r2 = requests.get(Lin_data[‘_url_‘], stream=True, proxies=proxy) # 使用代理
with open(Lin_data[‘name‘], "wb") as f2:
    for data in tqdm(r2.iter_content(chunk_size=512), desc="下载中"):
        f2.write(data)

# 对Windows平台文件进行MD5值计算
sw_calc_md5 = hashlib.md5(open(win_data[‘name‘], ‘rb‘).read()).hexdigest()
# 对比计算出的MD5值和网站提供的MD5值
if sw_calc_md5.upper() == win_data[‘md5‘]:
    print("\n hashlib计算出Windows平台的文件MD5值为%s\n此MD5值和网站提供的一致,可以直接使用 \n  " % sw_calc_md5)
else:
    print("\n error,计算的MD5值为%s,!=%s(网站提供的MD5值)\n " % (sw_calc_md5, win_data[‘md5‘]))

# 对Linux平台文件进行MD5值计算
sl_calc_md5 = hashlib.md5(open(Lin_data[‘name‘], ‘rb‘).read()).hexdigest()
# 对比计算出的MD5值和网站提供的MD5值
if sl_calc_md5.upper() == Lin_data[‘md5‘]:
    print(" \n hashlib计算出Linux平台的文件MD5值为%s\n此MD5值和网站提供的一致,可以直接使用\n " % sl_calc_md5)
else:
    print("\n error,计算的MD5值为%s,!=%s(网站提供的MD5值)\n " % (sl_calc_md5, Lin_data[‘md5‘]))

?未完待续……

相关推荐