此功能是先把网络图片上传到七牛云服务器,再获取图片路径,上传到微信。
上传微信需要公众号的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
调用顺序肯定是先判断是否有错在进行判断是否成功,我这上传的图片是从服务器上拿下来的图片,而不是本地上传,因为微信这种上传接口有两个,一个是本地上传微信,另一个是网络图片上传微信,而我写的就是第二种,网络图片上传。
东西很简单,代码也很容易。这只是单纯的上传不存在任何逻辑。可以根据需求加入你的项目。