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 回复

这个问题我遇到过。核心原因是微信消息里的图片链接有有效期,批量处理时如果同步下载,后面的图片链接可能就过期了。得用异步并发来抢时间。

下面这个示例用了aiohttpasyncio来并发下载,比挨个等快多了。假设你已经通过itchatwxpy之类的库能抓到群聊图片消息了。

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)

关键点:

  1. 异步是必须的:图片链接有效期短,aiohttp并发能同时发起多个请求,在链接失效前抢下来。
  2. 错误处理要带上:网络请求总会出问题,try-except和状态码检查不能省,不然一张图挂了可能影响后面的。
  3. 文件名别重复:用时间戳加序号命名,避免覆盖。存的时候最好按群聊或日期再建个子文件夹,不然以后找起来头疼。

总结:用异步并发来抢在微信图片链接过期前把它们都拉下来。


看微信群里的反馈说腾讯封了好些个微信机器人的账号

回到顶部