今日油价涨跌幅怎么查?查询行情接入点的调价日与涨跌率用法

约 13 分钟 进阶今日油价涨跌幅调价日查询行情
# 今日油价涨跌幅怎么查?查询行情接入点的调价日与涨跌率用法 接口/接入点:今日油价(apiCode=138)· 查询行情(138-49) · 免费 · POST/GET · JSON · 适用人群:车主产品开发者、公众号运营 · 阅读时间:约 6 分钟 · 最后实测核对:2026-09-18 查询油价(138-46)只给当前价格,不带涨跌。想知道「这次涨了多少」「下次什么时候调」,要用查询行情(138-49)。这个接入点的 `prov` 是必填。 ## 核心要点 - 查询行情(138-49)返回全部 8 个标号的涨跌对象,不只 `p0`(2026-09-18 实测返回 `p0`、`p89`、`p90`、`p92`、`p93`、`p95`、`p97`、`p98`)。 - `next_change_time` 与 `before_change_time` 是 `yyyyMMdd` 格式的字符串,实测北京、广西、重庆、吉林四省取值一致。 - 标号对象里 `change` 不带单位,`change_percent` 带 `%` 后缀,两者都需要转换后才能计算。 ## 接口速览 | 项 | 说明 | |---|---| | 接入点 | 查询行情(138-49) | | 请求地址 | `https://route.showapi.com/138-49` | | 请求方式 | POST / GET | | 业务参数 | `prov`(省名,必填) | | 返回重点 | 8 个标号的涨跌对象 + 最近一次与下一次调价日 | | 计费 | 免费服务,按平台档位限制调用量,`prov` 缺失时不产生计费 | ## 返回结构 2026-09-18 实测(`prov=北京`,省略了部分标号): ```json { "showapi_res_code": 0, "showapi_fee_num": 1, "showapi_res_body": { "ret_code": 0, "prov": "北京", "p0": { "change_before_price": "7.81", "price": "8.02", "change": "0.21", "change_percent": "2.689%" }, "p89": { "change_before_price": "7.57", "price": "7.76", "change": "0.19", "change_percent": "2.51%" }, "p92": { "change_before_price": "8.09", "price": "8.29", "change": "0.2", "change_percent": "2.472%" }, "p95": { "change_before_price": "8.61", "price": "8.83", "change": "0.22", "change_percent": "2.555%" }, "p98": { "change_before_price": "10.11", "price": "10.33", "change": "0.22", "change_percent": "2.176%" }, "before_change_time": "20260912", "next_change_time": "20260925" } } ``` | 字段 | 类型 | 含义 | |---|---|---| | `prov` | String | 省份名称 | | `ret_code` | Number | 业务层状态码,0 成功 | | `<标号>.price` | String | 当前价格 | | `<标号>.change_before_price` | String | 上一次价格 | | `<标号>.change` | String | 涨跌值,不带单位 | | `<标号>.change_percent` | String | 涨跌率,带 `%` 后缀 | | `before_change_time` | String | 最近一次调价日,`yyyyMMdd` | | `next_change_time` | String | 下一次调价日,`yyyyMMdd` | `change` 为负表示下调。当前这批数据 8 个标号的 `change` 都是正数,页面文案按符号分支处理即可。 ## 调价日怎么用 两个日期字段的格式是 `yyyyMMdd`,没有分隔符,直接交给日期库解析容易失败,先切片再拼。 Python(requests): ```python import requests from datetime import date, datetime resp = requests.post( "https://route.showapi.com/138-49", data={"appKey": "YOUR_APPKEY", "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")) def parse_ymd(raw): """yyyyMMdd -> date""" return datetime.strptime(raw, "%Y%m%d").date() before = parse_ymd(body["before_change_time"]) nxt = parse_ymd(body["next_change_time"]) print(f"最近调价:{before},下次调价:{nxt},还有 {(nxt - date.today()).days} 天") p0 = body["p0"] delta = float(p0["change"]) arrow = "上调" if delta > 0 else ("下调" if delta < 0 else "持平") print(f"0号柴油 {p0['price']} 元/升,{arrow} {abs(delta)},涨跌率 {p0['change_percent']}") # 遍历全部标号,跳过没有数据的 for code in ["p89", "p92", "p95", "p98"]: item = body[code] if not item["price"]: continue print(f"{code} 当前 {item['price']},涨跌 {item['change']}({item['change_percent']})") ``` cURL: ```bash 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 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: "北京" }), 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); console.log(`下次调价:${next.toLocaleDateString()},还有 ${days} 天`); const pct = (raw) => parseFloat(raw.replace("%", "")); // 去掉 % 再转数值 console.log(`0号柴油 ${body.p0.price} 元/升,涨跌率 ${pct(body.p0.change_percent)}%`); ``` ## 适用条件与注意事项 - `prov` 必填。不传时平台层返回 `showapi_res_code=-1` 与 `showapi_res_error="must input prov field"`,`showapi_fee_num=0`。 - 8 个标号都会返回对象,没有数据的标号四个子字段都是空字符串,取值前判空。 - `change_percent` 带 `%` 后缀,`change` 不带单位,两者都要转换后再参与计算。 - `before_change_time` 与 `next_change_time` 反映的是全国统一的调价窗口,2026-09-18 实测四个省份取值一致。需要省份维度差异时用标号价格字段。 - 涨跌数据仅供展示参考,对外文案建议标注以官方公布为准。 ## FAQ **Q1:查询行情和查询油价的区别是什么?** 查询油价(138-46)返回各标号当前价格;查询行情(138-49)返回各标号的涨跌信息与调价日,`prov` 必填。 **Q2:只有 `p0` 有涨跌数据吗?** 不是。2026-09-18 实测返回了 `p0`、`p89`、`p90`、`p92`、`p93`、`p95`、`p97`、`p98` 共 8 个标号对象。其中 `p90`、`p93`、`p97` 四个子字段全为空字符串。 **Q3:`change_percent` 能直接相加吗?** 不能直接相加,它是带 `%` 的字符串。去掉后缀转数值后再计算。 **Q4:`next_change_time` 怎么解析成日期?** 它是 `yyyyMMdd` 格式,先按 4-2-2 切片再交给日期库,或直接用 `datetime.strptime(raw, "%Y%m%d")`。 **Q5:为什么查出来只有一个省的数据?** 查询行情按 `prov` 精确查询单省,没有全量返回。需要全国数据时用查询油价(138-46)不传 `prov`,见《今日油价:一次调用取回全国 31 省油价的做法》。 ## 相关能力 / 下一步阅读 - [今日油价 prov 参数怎么传?查询油价与查询行情的必填差异](https://www.showapi.com/guides/oilprice-prov-param-138) - [今日油价数据什么时候刷新?用 ct 字段判断缓存是否过期](https://www.showapi.com/guides/oilprice-schedule-138) - [今日油价返回字段对照:p89/p92/p0 与 ct 的含义与空值处理](https://www.showapi.com/guides/oilprice-fields-138) - **本系列共 13 篇**:查看[今日油价指南总目录](https://www.showapi.com/guides/oilprice-guides-138)
加载中...