微信公众号自动回复海报

闲来没事,打算给公众号加一个功能,自动生成每天的海报,并自动回复给用户。

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过期时间也是三个小时。

这样就能在自动回复的时候根据用户输入的内容来返回生成的每日海报了(可以关注我的公众号【编程挺好玩】 回复【每日图片】体验)。

海报示例

在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值