利用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']))

 未完待續……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章