问题描述
现有通过定时任务每天早上发送每日新闻的图片的功能
大致代码为
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 使用下述参数:
其中包含 file 和 url 两类参数,经过分析发现,问题就出在这两个参数上
file 与 url 的区别
file 表示文件名称,支持的值有
而 url 表示图片的唯一资源表示符,这与file似乎没有任何区别,但是其另一个隐藏含义为是否缓存
当使用 file 参数时,cqhttp会建立 data/image
路径,并将图片自动缓存2,当使用同一文件名称的图片时,便使用缓存中的文件进行发送,哪怕这个文件是网络图片,也会进行缓存
当使用 url 参数时,从上面的参数列表可以发现,我们可以额外选择 cache
参数,当参数值为1(默认值)时,表示将网络图片进行缓存,若缓存中存在文件名相同的图片时,直接将缓存中的图片进行发送,此时效果与使用 file 参数时的效果相同;当参数值为0时,表示不缓存,每一次都将会访问网络图片后进行发送。
解决方案
因此就有了两个解决方案:
- 使用 url 参数时 file 参数选择不同的值保证其与缓存中的文件名不相同
- 使用 url 参数时 cache 参数选择0(默认为1)
(注:无论哪种方式必须使用 file 参数指定文件名)