微信个人号API开发案例:图片/语音/视频消息怎么下载解析存到本地?

发布时间:2026/10/28 0:07:14

微信个人号API开发案例:图片/语音/视频消息怎么下载解析存到本地? 收到的多媒体消息回调里一般只有一个临时下载地址不下载就过期。下载存本地这套流程要解决四个问题下载时机、格式转换、存储组织、可检索索引。这篇把从回调到落库的完整管道讲清楚。一、下载时机回调到达即触发别懒加载最常见的错误是用到才下载——图片消息存了 URL一周后用户想看历史图片URL 早过期了。正确做法是回调到达时立即触发下载任务进下载队列异步执行下载完成把本地路径回写到消息记录。下载失败要重试——网络抖动常见重试 3 次指数退避还失败标记下载失败趁 URL 有效期内人工处理或等消息重推再下。多媒体下载地址的有效期说明在 Eyun 开发文档 中可以查到。二、格式转换语音 silk 转 mp3图片统一格式微信语音是 silk 格式浏览器和多数播放器不支持要用 silk-v3-decoder 转成 mp3 或 wav 再存。图片可能是 webp、gif 等格式按存储策略决定是否统一转 jpg/png。视频一般保持 mp4 不转但要提取封面图首帧和时长信息入库列表页展示用。三、存储组织按日期和类型分目录文件存储建议按类型/年/月/日组织目录比如 voice/2026/10/27/xxx.mp3。文件名用 msg_id 加后缀保证唯一且能反查消息。大图可以压一份缩略图宽度 300px列表页用缩略图、详情页用原图省流量。存储介质选择量小直接用本地磁盘加定期备份量大用对象存储OSS/COS数据库里只存路径和元数据不存二进制。四、检索索引让文件能被找到存了不用等于白存。消息记录表里多媒体消息要存msg_id、类型、本地路径、文件大小、时长语音/视频、缩略图路径图片/视频、发送人、会话 ID、时间戳。按会话 ID 和时间建索引查某个好友的历史图片直接命中。多媒体下载对照类型转换额外元数据存储建议图片webp→jpg可选宽高、缩略图原图缩略图两份语音silk→mp3必须时长秒数单文件小按月归档视频不转封面、时长、分辨率对象存储文件不转文件名、大小对象存储下载存储管道实现import os, time, queue, threading, requests class MediaArchiver: def __init__(self, api, store, root/data/media): self.api api self.store store self.root root self.q queue.Queue() for _ in range(3): # 3 个下载线程 threading.Thread(targetself.worker, daemonTrue).start() def on_media_message(self, event): # 回调到达立即入下载队列 self.q.put({ msg_id: event[msg_id], type: event[type], url: event[media_url], retry: 0, }) def worker(self): while True: task self.q.get() try: local self._download(task) local self._convert(task[type], local) meta self._extract_meta(task[type], local) self.store.attach_media(task[msg_id], local_pathlocal, **meta) except Exception as e: if task[retry] 3: task[retry] 1 time.sleep(2 ** task[retry]) self.q.put(task) else: self.store.mark_media_failed( task[msg_id], str(e)) def _download(self, task): # 按 类型/年/月/日 组织目录 now time.localtime() subdir f{task[type]}/{now.tm_year}/{now.tm_mon:02d}/{now.tm_mday:02d} os.makedirs(f{self.root}/{subdir}, exist_okTrue) raw_path f{self.root}/{subdir}/{task[msg_id]}.raw with requests.get(task[url], streamTrue, timeout30) as r: r.raise_for_status() with open(raw_path, wb) as f: for chunk in r.iter_content(8192): f.write(chunk) return raw_path def _convert(self, mtype, raw_path): if mtype voice: # silk → mp3 out raw_path.replace(.raw, .mp3) os.system(fsilk-v3-decoder {raw_path} {out}) os.remove(raw_path) return out if mtype image: out raw_path.replace(.raw, .jpg) self._gen_thumb(raw_path, out.replace(.jpg, _thumb.jpg)) os.rename(raw_path, out) return out return raw_path.replace(.raw, .mp4 if mtype video else .bin) def _extract_meta(self, mtype, path): meta {size: os.path.getsize(path)} if mtype in (voice, video): meta[duration] self._probe_duration(path) if mtype video: meta[cover] self._extract_cover(path) if mtype image: meta[thumb] path.replace(.jpg, _thumb.jpg) return meta def _gen_thumb(self, src, dst): ... # 缩略图生成 def _probe_duration(self, path): ... # ffprobe 取时长 def _extract_cover(self, path): ... # 取首帧落地建议多媒体消息回调到达即入下载队列——别懒加载URL 过期就永远拿不回来了。下载失败指数退避重试 3 次趁 URL 有效期内处理失败任务。语音 silk 必须转 mp3 才能通用播放图片压缩略图列表页用视频提取封面和时长。存储按类型/年/月/日分目录文件名用 msg_id 反查消息元数据入库建会话索引。微信侧的多媒体消息与下载接口由Eyun 这类个人微信API平台 提供下载存储管道在自建服务实现具体字段以平台开发文档为准。
延伸阅读

更多相关文章

2026/10/28 0:07:14

Gemini 生成文件入门:在对话里直接产出 Word、Excel 和 PDF

适合人群:经常让 AI 帮忙写方案、整理表格、做学习计划,但每次都要把回答复制到 Word 或表格里再调格式的同学和上班族。本文介绍 Gemini 应用里的“生成文件”功能:在对话中直接说明要什么格式,Gemini 会把结果做成可下载的文件&…

2026/10/28 0:07:14

Dify 入门:用 Docker 自部署并搭建知识库问答助手

适合人群:想在自己电脑或服务器上搭一个“能根据内部文档回答问题”的 AI 助手,会一点命令行、装过 Docker,但不想从零写 RAG 代码的同学和开发者。 Dify 是一个开源的 AI 应用开发平台,可以在网页界面里配置模型、知识库、聊天助…

2026/10/28 0:07:13

Cline 入门:在 VS Code 里用 Plan/Act 模式让 AI 帮你写代码

适合人群:已经装了 VS Code,想试试让 AI 直接在项目里读代码、改文件、跑命令,但又担心 AI 乱改代码的编程初学者。本文介绍开源编程智能体 Cline 的基本用法:安装、接入模型、用 Plan/Act 模式完成小项目、用检查点回退。 Cline …

2026/10/28 1:17:18

Yuzu模拟器性能优化配置指南:5步解决卡顿闪退的完整教程

Yuzu模拟器性能优化配置指南:5步解决卡顿闪退的完整教程 【免费下载链接】yuzu-downloads 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu-downloads 本文是一份 Yuzu 模拟器性能优化配置指南:基于 yuzu-downloads 仓库提供的 2024 年 …

2026/10/28 1:17:18

LinkSwift 网盘直链获取教程:9 大网盘取直链,6 种输出任选

LinkSwift 网盘直链获取教程:9 大网盘取直链,6 种输出任选 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国…

2026/10/28 1:17:18

AI时代:DeepSeek 实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/28 1:12:18

STM32F103+AT24C02:I2C通信与EEPROM读写全流程实战拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 14:24:03

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/27 9:34:54

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/27 0:59:21

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/28 0:02:13

Python股票自动交易系统源码解析:从行情获取到风控的完整链路

简介:这份资源是面向高校计算机、金融相关专业毕业设计场景的完整项目源码包,主题为基于Python的股票自动交易系统,适合需要完成毕设选题、课程设计或自学金融量化交易开发的学生与开发者参考。压缩包共收录687个文件,整体约14.93…

2026/10/28 0:02:13

视酷酷信IM源码部署指南:Java 17+MySQL 8.0.33实战配置

简介:这是一套2024年亲测可部署的视酷酷信IM即时通讯系统源码,面向具备Java、OC、C#及Vue开发能力的技术人员,解决私有化即时通讯平台快速搭建与二次定制需求,尤其适用于需集成商城、保障数据主权的中小型企业或独立开发者。资源共…

2026/10/28 0:02:13

Python爬取百度迁徙数据:接口解析、批量采集与避坑指南

简介:这份资源是一个用Python爬取百度迁徙数据的脚本压缩包,面向具备Python基础、希望入门网络爬虫与数据解析的开发者,解决按日期获取全国热门城市人口迁徙数据的问题。包内共1个文件,为单个py脚本,压缩包约1KB&#…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑