船讯网 (www.shipxy.com) 船舶查询 CLI 插件,基于 @jackwener/opencli。
支持通过船名、IMO、MMSI 或呼号批量查询船舶参数(船长/船宽/吃水/类型)与实时 AIS 位置(经纬度/航速/航向/目的地/更新时间)。
| 命令 | 是否需登录 | 用途 |
|---|---|---|
opencli shipxy search --kw "…" |
否 | 关键字搜索 → MMSI/IMO/船名候选列表 |
opencli shipxy info --mmsi "…" |
是 | 完整船舶参数 + 实时位置 |
opencli shipxy position --mmsi "…" |
是 | 实时位置子集(脚本友好) |
# 前置:opencli CLI + Chrome extension(首次用需 Chrome 里 Load Unpacked 装扩展)
opencli plugin install /path/to/opencli-plugin-shipxy
opencli doctor # 应看到 Extension: connectedinfo / position 命令依赖 shipxy 的登录态,请先在 opencli 桥接的 Chrome 里手动打开 https://www.shipxy.com/ 完成登录,token cookie 会自动被复用。未登录时命令会抛出 AuthRequiredError 并给出提示。
# 1. 搜索:船名/MMSI/呼号都吃
opencli shipxy search --kw "COSCO12,MAERSK,9525338" --limit 5
# 2. 完整信息(船参数 + 位置)
opencli shipxy info --mmsi 413543265
opencli shipxy info --mmsi "413543265,574952645" --format json
# 3. 只要位置,输出 CSV
opencli shipxy position --mmsi 413543265 --format csv
opencli shipxy position --kw "COSCO12,MSC" --format csv管道场景:先 search 拿 MMSI 再 info 补齐参数:
opencli shipxy search --kw "MAERSK ESSEX" --limit 3 --format json \
| jq -r '.[] | select(.mmsi != "") | .mmsi' \
| tr '\n' ',' \
| xargs -I {} opencli shipxy info --mmsi {}| 字段 | 含义 |
|---|---|
mmsi |
9 位海事移动业务标识 |
imo |
IMO 号(无则为空) |
name / cnname |
英文名 / 中文名 |
callsign |
呼号 |
type / typeLabel |
AIS 船舶类型代码 + 中文标签 |
length_m / width_m / draught_m |
船长 / 船宽 / 吃水(米) |
lon / lat |
经纬度(十进制度) |
sog_kn |
对地航速(节) |
cog_deg / hdg_deg |
对地航向 / 船首向(度)。511 是 AIS 里"未知"的哨兵值 |
navistatus |
航行状态码(0=在航, 1=锚泊, 5=系泊, 255=未知...) |
dest / eta |
目的港 / 预到时间(AIS 由船员手工输入,可能过时) |
lastPositionUtc |
最近一次位置更新时间(UTC) |
search走 PUBLIC:GET searchv4.shipxy.com/index.ashx?f=srch&kw=...,无需登录,返回{status,ship:[{m,n,i,c,t}],port:[]}。这是唯一能免登录联通船名 → MMSI 的入口。info/position走 INTERCEPT + browser=true:POST www.shipxy.com/ship/GetShipmbody 只是mmsi=xxx,但服务端要 headers(签名) +t(unix 秒)。签名逻辑封装在页面 JSwindow.R0VOQ1NJR04(data)里(Base64 = "GENCSIGN"),jQuery 全局beforeSend → setHeaders(xhr, o)会自动注入。所以我们不自己算签名,而是page.evaluate里用window.jQuery.ajax发请求,签名 + HttpOnly token cookie 全部由页面自身处理。- 规避 401 的关键:
goto https://www.shipxy.com/ship/{mmsi}会返回{"status":401,"msg":"未授权"}(该路径就是 API 端点)。必须留在主页https://www.shipxy.com/里 evaluate。ensureShipxyReady会检测window.jQuery+window.R0VOQ1NJR04+token cookie三者齐全再放行。 - 数值单位换算:API 返回的整数是放大过的:
length/width /10 = 米、draught /1000 = 米、lon/lat /1e6 = 度、sog /1000 = 节、cog/hdg /100 = 度。已在normalizeShipm里统一。
- shipxy 搜索接口
f=srch只识别船名/MMSI,输入 IMO 号不一定命中;如需按 IMO 查,请先手动查到 MMSI 或走f=auto(页面自身也是这么做的,未来可以扩展)。 - 部分船的 AIS 数据不完整时,
hdg会是511、cog是3600之类的哨兵值——这些是数据源问题,本工具不做二次修正。 GetShipm一次只查一个 MMSI,批量在客户端 for-loop,规模大时耗时线性增长(每个约 200-500ms)。- 详情页面里其他信息(船东/建造年/吨位/历史轨迹)需要另一个接口
POST /ship/GetIHSData,本插件暂未纳入,可作 v0.2 扩展。
MIT