python+django上傳圖片到微信

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

調用順序肯定是先判斷是否有錯在進行判斷是否成功,我這上傳的圖片是從服務器上拿下來的圖片,而不是本地上傳,因爲微信這種上傳接口有兩個,一個是本地上傳微信,另一個是網絡圖片上傳微信,而我寫的就是第二種,網絡圖片上傳。
東西很簡單,代碼也很容易。這只是單純的上傳不存在任何邏輯。可以根據需求加入你的項目。

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