1. 程式人生 > 實用技巧 >python介面自動化(二十一) multipart/form-data上傳圖片

python介面自動化(二十一) multipart/form-data上傳圖片

前言

在提交表單操作的時候,經常會遇到圖片上傳的操作,圖片上傳是一個單獨的介面,本篇以禪道為例,介紹如何上傳圖片

上傳介面

1.以禪道上提交bug為例,在選擇圖片時,點確定按鈕,就是上傳圖片了。

2.用fiddler抓包,檢視抓到的介面,以下這種介面就是multipart/form-data

先登入

1.因為上傳圖片是在登入之後操作的,這個需要依賴使用者登入

登入需要先訪問一次url,提取rand值,然後對rand和原密碼進行md5加密。

上傳圖片

1.上傳圖片以下這種格式:

2.寫成字典格式,key對應name="imgFile"中的"imgFile"

3.value裡面是一個元組()

  • 第一個引數是filename=後面對應的值,沒有就寫None
  • 第二個是上面的這個值“2.png",或者是”檔案open開啟的二進位制流。備註:嘗試使用“2.png”,可以生成url,但訪問url無圖片
  • 第三個是Content-Type對應的型別,如“image/png”
f={
    "localUrl":(None,"33.png"),
    "imgFile":("33.png",open("33.png","rb"),"image/png")
}

 驗證是否上傳成功

1.獲取上傳後的地址,放到瀏覽器的位址列請求下,看是不是剛才上傳的圖片

參考程式碼

# coding:utf-8
import requests
import re
import hashlib
pw="P@ssw0rd"
s=requests.Session()
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36"
}
vrand=0
while(True):
    rs1=s.get("http://localhost/zentaopms/www/user-login.html",headers=headers)
    rs1.encoding='utf-8'
    #print(rs1.text)
    rand=re.findall(r"'verifyRand' value='(.+?)'",rs1.text)
    #print(rand[0])
    if len(rand[0])==10:
        vrand=rand[0]
        break
print(vrand)
#方式一
hash=hashlib.md5()
hash.update(pw.encode('utf-8'))
f=hash.hexdigest()+vrand
#print(f)
#方式二
hash2=hashlib.md5(f.encode('utf-8'))
pwd=hash2.hexdigest()
print(pwd)
data={
"account":"fuhui",
"password":pwd,
"referer":"http://localhost/zentaopms/www/bug-browse-6.html",
"verifyRand":vrand
}
rs2=s.post("http://localhost/zentaopms/www/user-login.html",headers=headers,data=data)
rs2.encoding='utf-8'
#print(rs2.text)
rs3=s.get("http://localhost/zentaopms/www/bug-browse-6.html",headers=headers)
rs3.encoding='utf-8'
#print(rs3.text)
result=re.findall(r"\<a href=\'\/zentaopms\/www\/user-logout.html' \>(.+?)\<\/a\>",rs3.text)
print(result)
if result[0]=="退出":
    print("登入成功")

#上傳圖片
urlp="http://localhost/zentaopms/www/file-ajaxUpload-5f2b5bf056387.html?dir=image"
f={
    "localUrl":(None,"33.png"),
    "imgFile":("33.png",open("33.png","rb"),"image/png")
}

rp=s.post(urlp,files=f)
rp.encoding="utf-8"
try:
    purl="http://localhost"+rp.json()["url"]
    print("上傳圖片後,圖片的url:{}".format(purl))
except Exception as msg:
    print("返回值不是json格式的,錯誤為:{}".format(msg))
    #print(rp.content)
    #print(rp.text.encode("utf-8").decode("unicode_escape"))