# 二维码生成和识别:批量生成二维码的全链路设计
> 接口/接入点:二维码生成和识别(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)