技术博客
二维码生成和识别:批量生成二维码的全链路设计

二维码生成和识别:批量生成二维码的全链路设计

作者: 万维易源
2026-08-31
批量生成二维码并发落库
# 二维码生成和识别:批量生成二维码的全链路设计 > 接口/接入点:二维码生成和识别(apiCode=887,生成接入点 887-1)· 是否免费:是(有档次限制)· 返回格式:JSON · 适用人群:全栈工程师、需批量出码的产品 · 阅读时间:约 6 分钟 ## 核心要点 - 批量生成 = 循环调用 887-1 + 并发限流 + 结果落库;图片拿到后**立即下载保存**(12h 清理)。 - 免费接口有档次限制,批量务必控制 QPS,避免触发限流。 - 生成图存 ShowAPI 服务器每 12h 删除,落盘方案见[保存与缓存策略](https://www.showapi.com/guides/qrcode-save-strategy-887)。 ## Why:单条调用撑不起批量业务 活动要发 1 万张专属二维码、电商要批量出物流码——循环发请求看似简单,但忽略并发、落库、保存时效就会丢图、被限流、数据错乱。本文给一条可落地的全链路。 ## What:全链路要素 | 环节 | 要点 | |------|------| | 数据源 | 待编码内容列表(URL/编号) | | 调用 | 887-1,appKey 放 query | | 并发 | 令牌桶/信号量限流,控制 QPS | | 落库 | 内容 → 自有存储地址映射 | | 保存 | 生成即下载 imgUrl 到对象存储 | | 重试 | 失败指数退避,记录失败项 | ## How:批量生成 + 立即落盘(Python) ```python import requests, base64, time, asyncio, aiohttp API = "https://route.showapi.com/887-1" APPKEY = "YOUR_APPKEY" SEM = asyncio.Semaphore(5) # 并发上限,按档位调整 async def gen_one(session, content, size="8"): async with SEM: params = {"appKey": APPKEY} data = {"content": content, "size": size, "imgExtName": "png"} async with session.post(API, params=params, data=data, timeout=aiohttp.ClientTimeout(total=10)) as r: body = (await r.json())["showapi_res_body"] if body.get("ret_code") != "0": return None return body.get("imgUrl") async def download(session, url): # 生成图每 12h 删除,必须立即下载到自有存储 async with session.get(url) as r: return await r.read() async def main(contents): async with aiohttp.ClientSession() as s: for c in contents: img_url = await gen_one(s, c) if not img_url: print("失败:", c); continue raw = await download(s, img_url) # TODO: 存到 OSS/本地,并建立 content→存储地址 映射 print(f"已保存 {c} -> {len(raw)} bytes") # asyncio.run(main(["https://a.com/1", "https://a.com/2"])) ``` ### 同步版(更易读,适合小批量) ```python import requests def gen_and_save(content): resp = requests.post(API, params={"appKey": APPKEY}, data={"content": content}, timeout=10) body = resp.json()["showapi_res_body"] if body.get("ret_code") != "0": return None # 立即下载 img = requests.get(body["imgUrl"], timeout=10).content return img # 落库 ``` ```bash # 单条批量可用 xargs 串接;生产建议用脚本而非 shell 循环 cat urls.txt | xargs -P5 -I{} curl -s "https://route.showapi.com/887-1?appKey=YOUR_APPKEY" \ -d "content={}" -o /dev/null ``` ## 进阶 / 边界 - **限流**:免费接口有档次限制,盲目高并发会被拒。用信号量/令牌桶控 QPS,档位提升后放宽。 - **保存时效**:`imgUrl` 12h 删除,批量场景下"生成后不立即下载"= 后期图失效。务必生成即落盘。 - **失败重试**:对 `ret_code != "0"` 做指数退避重试,记录失败清单便于补跑。 ## FAQ **Q1:能一次传多个 content 吗?** A:文档生成接入点为单 content 调用。批量需循环/并发多次请求。 **Q2:批量会超免费档位吗?** A:会。免费有档次限制,大批量前评估调用量,必要时兑换更高档位(以[官方档位说明](https://www.showapi.com/free-api)为准)。 **Q3:生成后图片还要自己存吗?** A:必须。ShowAPI 仅暂存 12h,生产环境生成即下载到自有存储。 **Q4:并发多少合适?** A:以档位为准。先用低并发(如 5)验证,再按成功率与限额上调。 ## 相关能力 / 下一步阅读 - [二维码生成和识别:图片每 12 小时清理,如何设计保存与缓存策略](https://www.showapi.com/guides/qrcode-save-strategy-887) - [二维码生成和识别:5 分钟接入,从注册到生成第一个二维码](https://www.showapi.com/guides/qrcode-quickstart-887) - [二维码生成和识别:10 个实战避坑清单(100KB 上限 / 12h 清理 / 格式)](https://www.showapi.com/guides/qrcode-best-practices-887) - **本系列共 12 篇**:查看[二维码生成和识别指南总目录](https://www.showapi.com/guides/qrcode-guides-887)