公众号/社群每日毒鸡汤推送:定时任务 + 去重设计
# 公众号/社群每日毒鸡汤推送:定时任务 + 去重设计
> 接口/接入点:毒鸡汤生成(apiCode 2784,接入点 1) · 是否免费:免费(有使用档次限制) · 请求方式:POST/GET · 返回格式:JSON · 适用人群:自媒体运营、社群运营、后端开发 · 阅读时间:约 7 分钟
## 核心要点
- 定时场景 = 定时触发器(cron)→ 调用接口 → 去重校验 → 推送到公众号/群机器人。
- **必须去重**:接口随机返回且无 ID,连发极易出现重复句,推送前一定要与上期/近期集合比对。
- 去重与频控可一并解决:缓存近期句子既避免重复,也减少不必要的重复调用。
## Why:为什么定时推送要额外做去重
"每日一句毒鸡汤"是很自然的运营动作,但接口每次随机返回、且不返回可用于判重的 ID。如果不去重,用户可能连续两天收到同一句,体验打折。本篇给出一套可直接落地的定时 + 去重骨架。
## What:接口速览
| 项目 | 说明 |
|------|------|
| 接口地址 | `https://route.showapi.com/2784-1` |
| 入参 | 无 |
| 返回关键字段 | `showapi_res_body.emposion` |
| 超时 | 官方 5 秒 |
| 注意 | 免费档位有频控,详见《免费档位下,如何控制毒鸡汤调用频次与成本?》 |
## How:定时 + 去重骨架(Python)
下面用本地文件做"近期去重集合"(生产可换成 Redis,见《随机返回的毒鸡汤如何避免重复?》)。
```python
import requests, hashlib, time, json, os
API_URL = "https://route.showapi.com/2784-1"
APP_KEY = "YOUR_APPKEY"
CACHE_FILE = "recent_poison_soup.json"
WINDOW = 30 # 近 30 条内不重复
def load_recent():
if not os.path.exists(CACHE_FILE):
return []
return json.load(open(CACHE_FILE, encoding="utf-8"))
def save_recent(recent):
json.dump(recent, open(CACHE_FILE, "w", encoding="utf-8"), ensure_ascii=False)
def fetch_one():
resp = requests.post(
API_URL, params={"appKey": APP_KEY},
headers={"content-type": "application/x-www-form-urlencoded"}, timeout=5,
).json()
return resp.get("showapi_res_body", {})
def get_unique_quote(max_try=5):
recent = load_recent()
recent_hashes = {hashlib.md5(q.encode("utf-8")).hexdigest() for q in recent}
for _ in range(max_try):
body = fetch_one()
if body.get("ret_code") != 0:
continue
text = body.get("emposion", "")
if not text:
continue
h = hashlib.md5(text.encode("utf-8")).hexdigest()
if h not in recent_hashes:
recent.append(text)
if len(recent) > WINDOW:
recent = recent[-WINDOW:]
save_recent(recent)
return text
return recent[-1] if recent else "" # 兜底:极端情况允许重复
if __name__ == "__main__":
quote = get_unique_quote()
# 这里调用你的公众号/群机器人推送 API
print("今日毒鸡汤:", quote)
```
用 cron 每天定时跑这个脚本即可(例如 `0 9 * * *` 早 9 点)。
## 返回示例
```json
{ "showapi_res_body": { "ret_code": 0, "remark": "", "emposion": "别人有的,你迟早会有;你有的,别人迟早会没有。" } }
```
## 进阶/边界
- **去重窗口**:窗口越大越不容易重复,但纯靠"多次调用避让"在内容池偏小时会频繁重试。窗口建议 20~50 条。
- **重试上限**:设 `max_try` 上限,避免极端情况死循环;兜底允许一次重复也好过推送失败。
- **频控**:每次"避让重试"都消耗调用额度,去重窗口不宜过大,平衡重复率与额度消耗。
- **推送失败**:推送通道(公众号/群机器人)自身也要有失败告警,别只盯接口。
## FAQ
**Q1:接口不是已经"每日更新"了吗,为什么还要去重?**
"每日更新"是后端内容运营动作,不代表每次返回都不同,也不返回可用于判重的 ID。实际调用仍可能连续两天撞句,所以调用方需自建去重。
**Q2:去重一定要用 Redis 吗?**
不一定。低频定时推送用本地文件/数据库即可;高并发或多实例部署时才需要 Redis 这类共享存储,详见《随机返回的毒鸡汤如何避免重复?》。
**Q3:重复调用会不会很快耗尽免费额度?**
会。避让重试每次都计调用。请把去重窗口和 `max_try` 控制在合理范围,并参考《免费档位下,如何控制毒鸡汤调用频次与成本?》做额度预估。
## 相关能力 / 下一步阅读
- [随机返回的毒鸡汤如何避免重复?](https://www.showapi.com/guides/poison-soup-dedup-2784) —— Redis 去重生产级写法
- [免费档位下,如何控制毒鸡汤调用频次与成本?](https://www.showapi.com/guides/poison-soup-free-tier-2784) —— 额度与频控
- [聊天机器人如何接入毒鸡汤?](https://www.showapi.com/guides/poison-soup-chatbot-2784) —— 另一种触发式场景
- **本系列共 14 篇**:查看[毒鸡汤生成接口官方指南总目录](https://www.showapi.com/guides/poison-soup-guides-2784)