在使用 cqhttp 发送定时动态图片时图片不更新问题

问题描述

现有通过定时任务每天早上发送每日新闻的图片的功能

大致代码为

def set_missions(self):
    # 每天新闻
    schedule.add_job(func=everyday_news, trigger='cron', hour=8)

    schedule.start()

def everyday_news():
    url = 'http://bjb.yunwj.top/php/tp/lj.php'
    res = get(url).json()['tp1']
    send_private_message(
        message=f'[CQ:image,file={res}]',
        user_id='********'
    )

但是运行后发现每天发送的图片相同

问题分析

首先查看 cqhttp关于图片的api文档1,发现该 api 使用下述参数:

image-20230602225505689

其中包含 fileurl 两类参数,经过分析发现,问题就出在这两个参数上

file 与 url 的区别

file 表示文件名称,支持的值有

image-20230602225721839

而 url 表示图片的唯一资源表示符,这与file似乎没有任何区别,但是其另一个隐藏含义为是否缓存

当使用 file 参数时,cqhttp会建立 data/image 路径,并将图片自动缓存2,当使用同一文件名称的图片时,便使用缓存中的文件进行发送,哪怕这个文件是网络图片,也会进行缓存

当使用 url 参数时,从上面的参数列表可以发现,我们可以额外选择 cache 参数,当参数值为1(默认值)时,表示将网络图片进行缓存,若缓存中存在文件名相同的图片时,直接将缓存中的图片进行发送,此时效果与使用 file 参数时的效果相同;当参数值为0时,表示不缓存,每一次都将会访问网络图片后进行发送。

解决方案

因此就有了两个解决方案:

  1. 使用 url 参数时 file 参数选择不同的值保证其与缓存中的文件名不相同
  2. 使用 url 参数时 cache 参数选择0(默认为1)

(注:无论哪种方式必须使用 file 参数指定文件名)

引用资料

知识共享许可协议
在使用 cqhttp 发送定时动态图片时图片不更新问题Wantz 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
上一篇
下一篇