今日油价:客服工作台的查价面板与调价提醒话术
约 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)





