python3 重複監聽介面並更新下載檔案
阿新 • • 發佈:2019-01-01
詳細場景如下:定時監聽介面,介面根據傳來的version值與當前版本對比,如果版本號一致,則繼續監聽,否則下載更新並執行一個shell指令碼。
主要使用了urllib庫中request模組完成。
詳細程式碼如下:
from threading import Timer import urllib.request import json import os def hello(): print("hello hello") t = Timer(2, qaq) # 八個小時為28800 t.start() def cbk(a, b, c): """回撥函式 @a:已經下載的資料塊 @b:資料塊的大小 @c:遠端檔案的大小 """ per = 100.0*a*b/c if per > 100: per = 100 print('%.2f%%' % per) def compare_version(data): url = 'http://www.flasktest.com/version' # response = urllib.request.Request(url) # html = urllib.request.urlopen(response) data_encode = urllib.parse.urlencode(data).encode('utf-8') response = urllib.request.Request(url, data_encode) # 獲取返回值 html = urllib.request.urlopen(response) print(html.getcode()) msg = html.read().decode() print(msg) msg = json.loads(msg) print(type(msg['version_now'])) if msg['ret']: # version不同則下載更新,並且更新當前的version的值 print('download') download_url = msg['download_url'] urllib.request.urlretrieve(download_url, 'down.html', cbk) # 第一個引數指向url地址,第二個為儲存地址,第三個是回撥函式用於顯示下載進度 os.system('./use.sh') data['version'] = msg['version_now'] t = Timer(10, compare_version, (data,)) t.start() else: print('keep listening') t = Timer(1, compare_version, (data,)) t.start() if __name__ == "__main__": version = {"version": '1.0'} compare_version(version)
定時任務主要是通過thread庫中Timer來實現的,Timer的第一個引數指間隔時間,第二個引數是指呼叫函式,第三個引數是向呼叫函式傳遞的引數(注意,這裡的引數我使用的是一個tuple型別的,這裡好像對引數型別有限制)
下載則是urllib.request中的urlretrieve,urlretrieve,第一個引數指向url地址,第二個為儲存地址,第三個是回撥函式用於顯示下載進度,下載進度這裡,我的請求連結沒有content-length這個欄位導致檔案總大小得不到,檢視urlretrieve的原始碼發現,如果得不到content-length,那麼會設定總檔案大小為-1,就會顯示-819200.00%這種進度,所有要在返回值里加上Content-Length這個欄位才會正常顯示下載進度。