前言

最近在做微信小程序时,需要将词云的模块部署到微信云托管中,词云在云托管中生成的词云图片无法直接return,需要先上传至云托管的对象存储,然后再由微信小程序调用云托管中的对象存储进行图片的读取。

python上传图片到云托管的对象存储

首先看官方文档的云托管对象存储 发现这是小程序内部调用的方法,转到 服务端和其他客户端看到了上传文件的两个步骤,获取 文件上传链接上传文件

获取文件上传链接

查看官方文档可知首先我门需要获取ACCESS_TOKEN

python 获取window小程序窗口 小程序调用python_对象存储


查看官方文档如何获取ACCESS_TOKEN

python 获取window小程序窗口 小程序调用python_微信小程序_02


有三个参数第一个是获取access_token为固定的client_credential

另外两个参数的获取需要进入自己的微信小程序小程序中进行查看

python 获取window小程序窗口 小程序调用python_对象存储_03


AppSecret(小程序密钥) 需要进行获取,并不可查看,获取后进行保存。

然后进行代码编写:

import json
import requests
#获取token
response = requests.get('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=你的appid&secret=你的AppSecret',)
print(response.json())

这样就得到了access_token

然后回到上一步获取文件上传链接

env的查看:

python 获取window小程序窗口 小程序调用python_微信小程序_04


path就是你要存到对象存储的路径和文件名

data ={
    "env": "你的env",
    "path": "dir/filename.jpg"
}
#转json
data = json.dumps(data) #一定要把参数转为json格式,不然会请求失败
response = requests.post("https://api.weixin.qq.com/tcb/uploadfile?access_token="+response.json()['access_token'],data)
print(response.json())

返回数据与官方文档一致

python 获取window小程序窗口 小程序调用python_云托管_05

上传文件

data2={
    "Content-Type":(None,".jpg"), #此处为上传文件类型
    "key": (None,"dir/filename.jpg"),
    "Signature": (None,response.json()['authorization']),
    'x-cos-security-token': (None,response.json()['token']),
    'x-cos-meta-fileid': (None,response.json()['cos_file_id']),
    'file': ('filename.jpg',open(r"本地文件路径","rb"))
}
response2 = requests.post(response.json()['url'], files=data2) #此处files提交的为表单数据,不为json数据,json数据或其他数据会报错
print(response2)

注意此处传参

python 获取window小程序窗口 小程序调用python_微信小程序_06


由官方文档知格式为multipart/form-data上网查询Python发送form-data请求及拼接form-data内容的方法后了解方法

就上传成功了。

#注意保存
fileid = response.json()["file_id"]
#可在小程序端调用获取图片

总代码

import json
import requests


def duixiangcunchu(courseid):
  #获取token
  response = requests.get('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=你的appid&secret=你的AppSecret',) #需填入appid和AppSecret
  data ={
    "env": "你的env",
    "path": "dir/filename.jpg"
  }#需填入env和path
  #转json
  data = json.dumps(data)
  response = requests.post("https://api.weixin.qq.com/tcb/uploadfile?access_token="+response.json()['access_token'],data)
  print(response.json())
  #得到上传链接

  data2={
    "Content-Type":(None,".jpg"), #此处为上传文件类型
    "key": (None,"dir/filename.jpg"), #需填入path
    "Signature": (None,response.json()['authorization']),
    'x-cos-security-token': (None,response.json()['token']),
    'x-cos-meta-fileid': (None,response.json()['cos_file_id']),
    'file': ('filename.jpg',open(r"本地文件路径","rb")) #需填入本地文件路径
	}
    response2 = requests.post(response.json()['url'], files=data2) #此处files提交的为表单数据,不为json数据,json数据或其他数据会报错
  print(response2)
  return response.json()["file_id"]

部署云托管需知

在将代码部署到云托管中,再回到微信小程序中会报一个错误大概是说requests.exceptions.SSLError 请求异常,上网查询知requests需要加入参数requests.exceptions.SSLError 请求异常,SSL错误,证书认证失败问题解决 将以上代码的requests请求中均加入参数verify=False就成功了。我在此处就不做修改了。