闲来没事,打算给公众号加一个功能,自动生成每天的海报,并自动回复给用户。
Pillow 处理图片
首先利用python来处理空白的海报模板。
im = Image.open(img_path) # 打开图片画图
# print(im.size) # 图片尺寸
draw = ImageDraw.Draw(im)
# 这些文字的位置对于每个图片来说都是固定的,可以有很多模板图片,然后每天随机选一个模板
draw.text((220, 240), str(today), fill='white', font=fnt) # day
draw.text((480, 420), month + '.', fill='white', font=fnt2) # 月份
draw.text((320, 520), '宜 ' + data['better'], fill='white', font=fnt2) # 月份
wenzi = data['juzi']
_res = ''
index = 0
for i in wenzi:
_res += i
if len(_res) == 18:
draw.text((200, 1400 + index *70), _res, fill='black', font=fnt2) # 文字
_res = ''
index += 1
if _res:
draw.text((200, 1400 + index *70), _res, fill='black', font=fnt2) # 文字
from_who = '—— ' + data['from']
draw.text((780, 1400 + (index+1) *70), from_who, fill='black', font=fnt2) # 文字
out = im.resize((621, 1104), Image.ANTIALIAS) # 分辨率调整,因为原图太大了
out.save(today_for_pic + '.png', quality = 95)
利用微信接口上传图片获取自动回复的media_id
r = redis.Redis(host='localhost', port=6379, db=0)
def get_token():
# 利用微信的接口获取access_token
if not r.exists('access_token_wx'):
res = requests.get('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=&secret=')
access_token_wx = eval(res.content.decode())['access_token']
r.set('access_token_wx', access_token_wx)
r.expire('access_token_wx', 6200)
else:
print("access_token存在")
access_token_wx = r.get('access_token_wx').decode()
return access_token_wx
def get_img_list():
# 获取指定目录下的所有jpg 和 png 文件
imagelist = []
for parent, dirnames, filenames in os.walk('/root/poster_img/'):
for filename in filenames:
if filename.lower().endswith(('.jpg', '.png')):
imagelist.append({'file_name': filename, 'path': os.path.join(parent, filename)})
return imagelist
def add_to_redis(media_id, file_name):
r.set('poster-' + file_name, media_id)
r.expire('poster-' + file_name, 3*24*60*60)
def upload_image(pic_path, access_token, pic_name):
# 上传到微信获取media_id
print(f'++++++++++++++++++begin {pic_name}++++++++++++++++++')
files = {'img': (pic_name, open(pic_path, 'rb'))}
res = requests.post(f'http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token={access_token}&type=image', files=files)
print(res.content)
media_id = eval(res.content.decode())['media_id']
add_to_redis(media_id, pic_name)
print(f"++++++++++++++++end {pic_name} ++++++++++++++++")
因为是个人订阅号且未认证,是没有永久素材的,而临时素材的media_id只能保存3个小时(好像是的),所以我在服务器写了一个cron任务,每三个小时运行一次,将数据保存到redis里,同时redis的key过期时间也是三个小时。
这样就能在自动回复的时候根据用户输入的内容来返回生成的每日海报了(可以关注我的公众号【编程挺好玩】 回复【每日图片】体验)。