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

调用顺序肯定是先判断是否有错在进行判断是否成功,我这上传的图片是从服务器上拿下来的图片,而不是本地上传,因为微信这种上传接口有两个,一个是本地上传微信,另一个是网络图片上传微信,而我写的就是第二种,网络图片上传。
东西很简单,代码也很容易。这只是单纯的上传不存在任何逻辑。可以根据需求加入你的项目。