今日油价:客服工作台的查价面板与调价提醒话术

约 15 分钟 进阶今日油价客服系统调价提醒话术模板
# 今日油价:客服工作台的查价面板与调价提醒话术 接口/接入点:今日油价(apiCode=138)· 查询油价(138-46)/ 查询行情(138-49) · 免费 · 适用人群:加油、养车、车后市场客服系统 · 阅读时间:约 6 分钟 · 最后实测核对:2026-09-18 客服每天要回答两类问题:现在 92 号多少钱,什么时候调价。每查一次都去翻外部页面,慢而且口径容易不一致。把今日油价接进工作台,坐席输入省份就能拿到格式化好的话术。 ## 核心要点 - 查价格用查询油价(138-46),查涨跌和调价日用查询行情(138-49),后者 `prov` 必填。 - 两个接入点各返回一层结构化数据,拼话术的逻辑可以固定下来,所有坐席输出同一口径。 - 查询行情(138-49)实测返回 8 个标号的涨跌对象,2026-09-18 北京、广西、重庆、吉林四省的调价日一致。 ## 坐席面板要做的两件事 **查价**:坐席输入省份,输出一行可直接发出去的文案,包含 92、95 和柴油价格,以及数据时间。 **调价提醒**:取下一次调价日,算剩余天数,配合当前涨跌率生成提醒文案,在临近调价时主动触达用户。 ## 后端:两个查询函数 Python(requests): ```python import requests from datetime import date, datetime def query_price(prov): """查价:返回可直接发送的文案。""" resp = requests.post( "https://route.showapi.com/138-46", data={"appKey": "YOUR_APPKEY", "prov": prov}, timeout=5, ).json() if resp.get("showapi_res_code") != 0: raise RuntimeError(resp.get("showapi_res_error")) body = resp["showapi_res_body"] if body.get("ret_code") != 0: raise RuntimeError(body.get("remark")) item = body["list"][0] def show(raw): return raw if raw and float(raw) > 0 else "—" return ( f"{item['prov']}今日油价:92号 {show(item['p92'])} 元/升," f"95号 {show(item['p95'])} 元/升," f"0号柴油 {show(item['p0'])} 元/升。" f"数据时间 {item['ct']}" ) def query_market(prov): """查涨跌与调价日,返回结构化结果。""" resp = requests.post( "https://route.showapi.com/138-49", data={"appKey": "YOUR_APPKEY", "prov": prov}, # prov 必填 timeout=5, ).json() if resp.get("showapi_res_code") != 0: raise RuntimeError(resp.get("showapi_res_error")) body = resp["showapi_res_body"] if body.get("ret_code") != 0: raise RuntimeError(body.get("remark")) nxt = datetime.strptime(body["next_change_time"], "%Y%m%d").date() prev = datetime.strptime(body["before_change_time"], "%Y%m%d").date() p0 = body["p0"] delta = float(p0["change"]) return { "last_change": prev, "next_change": nxt, "days_left": (nxt - date.today()).days, "diesel_price": p0["price"], "diesel_change": delta, "diesel_change_percent": p0["change_percent"], "direction": "上调" if delta > 0 else ("下调" if delta < 0 else "持平"), } def remind_text(prov): """调价提醒文案。""" m = query_market(prov) return ( f"提醒:{prov}最近一次调价在 {m['last_change']}," f"下一次调价窗口是 {m['next_change']},还有 {m['days_left']} 天。" f"当前 0 号柴油 {m['diesel_price']} 元/升," f"{m['direction']} {abs(m['diesel_change'])}({m['diesel_change_percent']})。" f"数据仅供参考,以官方公布为准。" ) print(query_price("北京")) print(remind_text("北京")) ``` cURL: ```bash # 查价 curl -X POST "https://route.showapi.com/138-46?appKey=YOUR_APPKEY" \ -H "content-type: application/x-www-form-urlencoded" -d "prov=%E5%8C%97%E4%BA%AC" # 查涨跌与调价日 curl -X POST "https://route.showapi.com/138-49?appKey=YOUR_APPKEY" \ -H "content-type: application/x-www-form-urlencoded" -d "prov=%E5%8C%97%E4%BA%AC" ``` Node.js(fetch): ```javascript const pick = (raw) => (raw && Number(raw) > 0 ? raw : "—"); async function queryPrice(prov) { const resp = await fetch("https://route.showapi.com/138-46", { method: "POST", headers: { "content-type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ appKey: "YOUR_APPKEY", prov }), signal: AbortSignal.timeout(5000), }); const data = await resp.json(); if (data.showapi_res_code !== 0) throw new Error(data.showapi_res_error); const item = data.showapi_res_body.list[0]; return `${item.prov}今日油价:92号 ${pick(item.p92)} 元/升,` + `95号 ${pick(item.p95)} 元/升,0号柴油 ${pick(item.p0)} 元/升。` + `数据时间 ${item.ct}`; } async function remindText(prov) { const resp = await fetch("https://route.showapi.com/138-49", { method: "POST", headers: { "content-type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ appKey: "YOUR_APPKEY", prov }), // prov 必填 signal: AbortSignal.timeout(5000), }); const body = (await resp.json()).showapi_res_body; if (body.ret_code !== 0) throw new Error(body.remark); const parseYmd = (raw) => new Date(+raw.slice(0, 4), +raw.slice(4, 6) - 1, +raw.slice(6, 8)); const next = parseYmd(body.next_change_time); const days = Math.ceil((next - Date.now()) / 86400000); const delta = Number(body.p0.change); const direction = delta > 0 ? "上调" : delta < 0 ? "下调" : "持平"; return `提醒:${prov}下一次调价窗口是 ${next.toLocaleDateString()},还有 ${days} 天。` + `当前 0 号柴油 ${body.p0.price} 元/升,${direction} ${Math.abs(delta)}` + `(${body.p0.change_percent})。数据仅供参考,以官方公布为准。`; } console.log(await queryPrice("北京")); console.log(await remindText("北京")); ``` ## 实测话术样例 用 2026-09-18 的实测数据跑一遍,输出如下,可用来核对你的拼装逻辑: ``` 北京今日油价:92号 8.29 元/升,95号 8.83 元/升,0号柴油 8.02 元/升。数据时间 2026-09-18 12:00:05.916 提醒:北京最近一次调价在 2026-09-12,下一次调价窗口是 2026-09-25,还有 7 天。当前 0 号柴油 8.02 元/升,上调 0.21(2.689%)。数据仅供参考,以官方公布为准。 ``` 同一批实测里,广西、重庆、吉林三省的 `next_change_time` 也落在 `20260925`,展示文案可以直接用同一套模板。 ## 适用条件与注意事项 - 查询行情(138-49)的 `prov` 必填,不传时平台层返回 `showapi_res_code=-1` 与 `showapi_res_error="must input prov field"`,`showapi_fee_num=0`。 - 查询行情返回 8 个标号对象,`p90`、`p93`、`p97` 的子字段都是空字符串(2026-09-18 实测),拼话术前判空。 - `change_percent` 带 `%` 后缀,`change` 不带单位,做加减前先转换。 - 调价日是全国统一的窗口,各省取值一致;需要省份维度的差异时用价格字段。 - 对外话术建议标注以官方公布为准,涨跌数据只作展示参考。 ## FAQ **Q1:怎么避免不同坐席报价不一致?** 统一走今日油价接口,用固定的文案模板生成,所有坐席拿同一数据源的同一格式。 **Q2:调价提醒能自动发吗?** 可以。取查询行情(138-49)的 `next_change_time`,在距今 1 天或当天时触发推送。 **Q3:客服高频查询会不会把额度用满?** 会共用同一个档位额度,建议后端对查询结果做缓存。一次不传 `prov` 的调用能取回 31 个省份,2026-09-18 实测计费次数为 1,做话术查价足够。 **Q4:为什么拼出来的柴油价格是「—」?** 检查判空逻辑。价格字段是字符串,`"0.00"` 这类值不是空字符串,需要按数值判断。 **Q5:`change_percent` 是 `2.689%` 这样的字符串吗?** 是,带 `%` 后缀,实测值为 `"2.689%"`。展示可以直接用,参与计算要先去掉后缀。 ## 相关能力 / 下一步阅读 - [今日油价涨跌幅怎么查?查询行情接入点的调价日与涨跌率用法](https://www.showapi.com/guides/oilprice-trend-138) - [今日油价调用量规划:缓存粒度与 TTL 的确定方式](https://www.showapi.com/guides/oilprice-cache-138) - [今日油价 prov 参数怎么传?查询油价与查询行情的必填差异](https://www.showapi.com/guides/oilprice-prov-param-138) - **本系列共 13 篇**:查看[今日油价指南总目录](https://www.showapi.com/guides/oilprice-guides-138)
加载中...