Python微信机器人代码,群聊中多张图片无法完全保存
@itchat.msg_register(itchat.content.PICTURE, isGroupChat=True) def download_files(msg):
msg['Text'](msg['FileName'])
itchat.send(’@%s@%s’%(‘img’ if msg[‘Type’] == ‘Picture’ else ‘fil’, msg[‘FileName’]), msg[‘FromUserName’])
return ‘%s received’%msg[‘Type’]
进行测试后,群聊中发送 8 张图片也就保存下来 3 张
Python微信机器人代码,群聊中多张图片无法完全保存
2 回复
这个问题我遇到过。核心原因是微信消息里的图片链接有有效期,批量处理时如果同步下载,后面的图片链接可能就过期了。得用异步并发来抢时间。
下面这个示例用了aiohttp和asyncio来并发下载,比挨个等快多了。假设你已经通过itchat或wxpy之类的库能抓到群聊图片消息了。
import aiohttp
import asyncio
import os
from datetime import datetime
async def download_one_image(session, url, save_path):
"""下载单张图片的协程"""
try:
async with session.get(url) as resp:
if resp.status == 200:
content = await resp.read()
with open(save_path, 'wb') as f:
f.write(content)
print(f"保存成功: {save_path}")
return True
else:
print(f"下载失败,状态码{resp.status}: {url}")
return False
except Exception as e:
print(f"下载异常 {url}: {e}")
return False
async def download_images_concurrently(img_url_list):
"""并发下载多张图片的主协程"""
async with aiohttp.ClientSession() as session:
tasks = []
for i, url in enumerate(img_url_list):
# 生成文件名,按时间戳和序号来,避免重复
filename = f"wechat_img_{datetime.now().strftime('%Y%m%d_%H%M%S')}_{i}.jpg"
save_path = os.path.join('wechat_images', filename)
task = asyncio.create_task(download_one_image(session, url, save_path))
tasks.append(task)
# 等待所有下载任务完成
results = await asyncio.gather(*tasks, return_exceptions=True)
return results
def save_group_images(img_url_list):
"""主调用函数"""
# 创建保存目录
os.makedirs('wechat_images', exist_ok=True)
# 运行异步下载
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
results = loop.run_until_complete(download_images_concurrently(img_url_list))
success_count = sum(1 for r in results if r is True)
print(f"处理完成,成功{success_count}/{len(img_url_list)}张")
finally:
loop.close()
# 示例用法
if __name__ == '__main__':
# 这里替换成你实际从微信消息中提取的图片URL列表
example_urls = [
'https://example.com/image1.jpg',
'https://example.com/image2.jpg',
# ... 更多URL
]
save_group_images(example_urls)
关键点:
- 异步是必须的:图片链接有效期短,
aiohttp并发能同时发起多个请求,在链接失效前抢下来。 - 错误处理要带上:网络请求总会出问题,
try-except和状态码检查不能省,不然一张图挂了可能影响后面的。 - 文件名别重复:用时间戳加序号命名,避免覆盖。存的时候最好按群聊或日期再建个子文件夹,不然以后找起来头疼。
总结:用异步并发来抢在微信图片链接过期前把它们都拉下来。
看微信群里的反馈说腾讯封了好些个微信机器人的账号

