python+django上傳圖片到微信
此功能是先把網絡圖片上傳到七牛雲服務器,再獲取圖片路徑,上傳到微信。
上傳微信需要公衆號的token和cookie也就是說,需要有公衆號登錄來獲取這兩個值。
首先我這個代碼是在項目中使用的,沒有例子,太麻煩了。
# 圖片路徑上傳微信測試使用
new_url = 'http://img.xunmang.com/144121axjRLKq6uAKQDWC8hMmfk3.jpg'
# 公衆號的token
account_token = ''
# 公衆號的cookie
account_cookie = ''
注意cookie需要進行解析,導入json,用json.loads(cookie)進行解析。(從網頁拿的不需要解析,我這個是從數據庫取出的格式不一樣,所以需要解析)
例如:
def request_header(self, cookie, token):
cookies = ''
# 解析cookie
cookie = json.loads(cookie)
for c in cookie:
name = c.get('name', None)
value = c.get('value', None)
if (name and value) is None:
continue
cookies = cookies + str(c["name"]) + '=' + str(c["value"]) + ';'
# 設置請求頭
# print('正在設置請求頭')
referer = f'https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&lang=zh_CN&token=${token};'
header = {
"Content-Type": "application/x-www-form-urlencoded",
'dateType': 'form-url-encoded',
'Referer': referer,
'cookie': cookies
}
# print('設置請求頭完畢')
return header
這裏不進解析了cookie還設置了請求微信的request請求頭,referer是必須的,裏面就吧公衆號的token帶入就行了。在請求頭再帶入解析好的cookies其他都是固定寫法,最後返回設置好的請求頭。
接下來就直接請求微信接口就好了,這個上傳方法是post請求
def request_interface(self, new_url, token, header):
timeout = (10, 20) # 請求request過期時間
# 請求微信上傳接口
url = f'https://mp.weixin.qq.com/cgi-bin/uploadimg2cdn?token={token}&lang=zh_CN'
body = {
'imgurl': new_url,
't': 'ajax-editor-upload-img'
}
try:
# print('上傳中.........')
res = requests.post(url, headers=header, data=body, timeout=timeout)
data = res.json()
# print('上傳成功')
except(RequestException,):
raise exceptions.APIException('請求超時!')
return data
把剛纔設置好的圖片路徑,公衆號的token,請求頭,帶入方法
這個timeout是請求過期時間,url就是微信上傳圖片的接口,因爲是post請求所以會有body主體
使用requests庫的post方法請求,把參數帶入,requests.post(請求的接口, headers=請求頭, data=參數主體, timeout=過期時間)
body中的’t’: 'ajax-editor-upload-img’是固定寫法,請求完畢後返回的結果需要解析,直接吧返回結果轉成json
進行返回就行了
if 'url' in data.keys():
# 向數據庫添加新數據
self.add_data(data['url'])
返回的結果被轉成json後,就可以判斷了,如果上傳成功微信會返回給你新的url,這樣就可以判斷返回結果中的key包不包括url。如果包括就進行存值,如果不存在就不存。
不存在url就肯定是錯誤信息,就可以判斷是否上傳失敗。
# 判斷微信錯誤
def error_of_judgment(self, data):
info = ''
# 微信返回來的錯誤信息
if 'err_msg' in data.keys():
info = f'fail,{data['err_msg']}'
# 微信返回錯誤代碼
if data['errcode'] != 0:
info = f'fail,{data['errcode']}'
return info
調用順序肯定是先判斷是否有錯在進行判斷是否成功,我這上傳的圖片是從服務器上拿下來的圖片,而不是本地上傳,因爲微信這種上傳接口有兩個,一個是本地上傳微信,另一個是網絡圖片上傳微信,而我寫的就是第二種,網絡圖片上傳。
東西很簡單,代碼也很容易。這只是單純的上傳不存在任何邏輯。可以根據需求加入你的項目。