由于企业微信发送图片需要base64编码值和MD5值,这就需要我们将照片存在本地并用base64和hashlib两个包读取并转换
import base64
import hashlib
with open(imgPath, 'rb') as file:
data = file.read()
encodestr = base64.b64encode(data)
image_data = str(encodestr, 'utf-8')
with open(imgPath, 'rb') as file:
md = hashlib.md5()
md.update(file.read())
image_md5 = md.hexdigest()
但是因为工作中需要使用到轻流作为前端,用户上传头像和输入一下信息,生成一张工牌,轻流不具备这个功能,因此打算借助HiFlow代码块功能,获取到的轻流数据是一个网络地址:https://file.qingflow.com/documents/form/attach/*****.jpg
这里需要借助requests包来获取response.content的方式读取到网络文件,PIL包来处理文件为二进制流
import base64
from io import BytesIO
import requests
import hashlib
from PIL import Image
def image_to_base64(img, fmt='png'):
output_buffer = BytesIO()
img.save(output_buffer, format=fmt)
byte_data = output_buffer.getvalue()
base64_str = base64.b64encode(byte_data).decode('utf-8')
return base64_str
def image_to_md5(img, fmt='png'):
output_buffer = BytesIO()
img.save(output_buffer, format=fmt)
byte_data = output_buffer.getvalue()
md = hashlib.md5()
md.update(byte_data)
return md.hexdigest()
img_src = filepath = bundle['inputData']['filepath']
response = requests.get(img_src)
with Image.open(BytesIO(response.content)) as _img:
image_data = image_to_base64(_img)
with Image.open(BytesIO(response.content)) as _img:
image_md5 = image_to_md5(_img)
output={'image_data':image_data,'image_md5':image_md5}
至此,我们已经能够把一张网络位置的图片转换成base64编码了,就可以将此作为参数去请求工牌图片了,在将工牌发送到企业微信群的时候,发现MD5不匹配,因此我想尝试用自己的方法将返回的工牌图片base64编码转为二进制流,再转一次MD5,代码如下:
import base64
import hashlib
def base64_to_md5(base64_data):
img_data = base64.b64decode(base64_data)
md = hashlib.md5()
md.update(img_data)
return md.hexdigest()
base64_param = bundle['inputData']['base64_param']
md5_data = base64_to_md5(base64_param)
output = {'base64_param': base64_param, 'md5_data': md5_data}