我想將復雜的 curl 命令發送到 python (3.9.7) 腳本以下載輸出檔案 .tif 我使用 TimeNum 變數,因為我想下載不同的檔案并將 .tif 剪輯到個人感興趣的區域(我想要使用 for 回圈)。
curl 命令是這樣的:
curl --data '{"productType":"VMI","productDate":"1648710600000"}' -H "Content-Type: application/json" -X POST https://example.it/wide/product/downloadProduct --輸出hrd2.tif
我嘗試不同的解決方案:
1)
import shlex
import subprocess
TimeNum=1648710600000
cmd ='''curl --data \'{"productType":"VMI","productDate":"%s"}\' -H "Content-Type: application/json" -X POST https://example.it/wide/product/downloadProduct --output %s.tif''' % (TimeNum,TimeNum)
args = shlex.split(cmd)
process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
下載作業,但輸出占用 1KB 而不是大約 11MB,當我嘗試在 Windows 中打開它時出現錯誤。
- 我逐行撰寫一個帶有 curl 命令列串列的 txt 檔案,然后:
file = open('CURL_LIST.txt', 'r')
lines = file.readlines()
for line in enumerate(lines):
os.system(line.strip())
但不能正常作業,我的輸出與上面的案例 1 相同。現在我嘗試使用 urllib.request 但我不能很好地使用它。
有人有建議嗎?在此先感謝您的幫助
uj5u.com熱心網友回復:
重要資訊
該服務器上有一個自簽名證書,因此您會收到警告(這也是您獲得小檔案的原因)。
在下面的示例中,我禁用了證書檢查,但這是危險的,只有在您了解風險并且無論如何對您來說都可以的情況下才應該使用它(例如,您是 example.it 的所有者)。
鑒于 example.it 的性質,我假設您只是將它用于學習目的,但無論如何請小心并閱讀有關自簽名證書風險的更多資訊。
從風險/安全的角度來看,類似問題的正確解決方案是不連接到這樣的服務器。
一旦清楚了,為了測驗/學習,我建議使用 Python 的 requests 庫(請注意verify=False禁用證書檢查):
import requests
time_num = 1648710600000
headers = {
# Already added when you pass json=
# 'Content-Type': 'application/json',
}
json_data = {
'productType': 'VMI',
'productDate': time_num,
}
response = requests.post('https://example.it/wide/product/downloadProduct', headers=headers, json=json_data, verify=False)
with open(time_num '.tif', 'wb') as f:
f.write(response.content)
如果您更喜歡您發布的方法,也可以在 curl (-k選項)中禁用證書檢查:
import shlex
import subprocess
TimeNum=1648710600000
cmd ='''curl -k --data \'{"productType":"VMI","productDate":"%s"}\' -H "Content-Type: application/json" -X POST https://example.it/wide/product/downloadProduct --output %s.tif''' % (TimeNum,TimeNum)
args = shlex.split(cmd)
process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/463724.html
