黄河口马拉松成绩查询,用Golang写个自己查自己的小工具

嘿,跑完黄河口马拉松的朋友们,是不是一过终点线就急着翻手机查成绩?我懂那种感觉,汗还在滴、腿还在抖,就想看看自己到底跑了多少,但有时候官...

嘿,跑完黄河口马拉松的朋友们,是不是一过终点线就急着翻手机查成绩?我懂那种感觉,汗还在滴、腿还在抖,就想看看自己到底跑了多少,但有时候官方页面卡得不行,或者你想要的不是简单查个名次,而是想把自己的成绩跟去年比、跟朋友比,甚至自己搞个统计小工具,这时候,要是能用 Golang 自己写个查询程序,是不是挺酷的?

其实没那么复杂,先想想“查成绩”到底在查什么

你打开官方查询页面,输入参赛号,跳出来一行数据:姓名、枪声成绩、净成绩、排名、分段计时……背后其实就是服务器返回了一堆JSON或HTML数据,我们写个小程序,本质就是:

  1. 发个请求(模拟你在网页上点查询)
  2. 拿到数据(解析返回的内容)
  3. 展示出来(按你想要的格式打出来)

Golang的 net/http 包干这事儿特别顺手,而且编译完就一个二进制文件,扔服务器上跑都不用装依赖,比Python那种还得考虑环境的感觉清爽多了。

第一步:搭个最简单查询框架

先别想太多,就用 命令行程序 跑起来,你输入参赛号,它帮你查。

package main
import (
 "fmt"
 "io/ioutil"
 "net/http"
 "os"
)
func main() {
 if len(os.Args) < 2 {
  fmt.Println("用法: go run query.go 你的参赛号")
  return
 }
 bib := os.Args[1]  // 参赛号
 url := "https://api.huanghekou-marathon.com/result?bib=" + bib
 resp, err := http.Get(url)
 if err != nil {
  fmt.Println("网络不行啊兄弟:", err)
  return
 }
 defer resp.Body.Close()
 body, _ := ioutil.ReadAll(resp.Body)
 fmt.Println(string(body))
}

你看,这就十几行的事,但这里有个问题:黄河口马拉松官方API地址是什么? 实际开发中,你得先去官网的“成绩查询”页面,按F12看网络请求,找到真正的接口,比如它可能是 POST 方式,或者需要带个 token,这个你得自己动手抓一下,教是教不来的,但方法就是“打开浏览器开发者工具 → 网络 → 查一次成绩 → 看请求”。

第二步:把数据拆开看,别让它糊在一起

上面那个程序打印出来的多半是一整坨JSON,看起来眼睛疼,我们得把有用的字段挑出来,假设返回数据长这样:

{
  "status": 0,
  "data": {
    "name": "张三",
    "bib": "A1234",
    "gun_time": "03:24:56",
    "net_time": "03:22:10",
    "rank": 128,
    "age_group": "30-39",
    "group_rank": 15
  }
}

Golang处理JSON用 encoding/json 包,我一般先定义一个结构体,把想要的字段列出来:

type Result struct {
 Name     string `json:"name"`
 Bib      string `json:"bib"`
 GunTime  string `json:"gun_time"`
 NetTime  string `json:"net_time"`
 Rank     int    `json:"rank"`
 GroupRank int   `json:"group_rank"`
}

然后解析:

var res Result
json.Unmarshal(body, &res)
fmt.Printf("选手: %s 参赛号: %s\n", res.Name, res.Bib)
fmt.Printf("枪声成绩: %s  净成绩: %s\n", res.GunTime, res.NetTime)
fmt.Printf("总排名: %d  年龄组排名: %d\n", res.Rank, res.GroupRank)

你看,这样是不是清楚多了?而且你还可以加个条件:如果净成绩比你的PB(个人最好成绩)快,就打印个“破PB啦!” 这种小把戏,自己写代码最有意思。

第三步:别只查自己,把朋友圈的也查一遍

一个人查多没劲,你可以把朋友的参赛号也放进去,批量查,比如弄个切片:

bibs := []string{"A1234", "B5678", "C9012"}
for _, bib := range bibs {
 // 查成绩逻辑...
 // 顺便比一下谁快
}

甚至可以把结果存到一个 表格 里,打印出来更直观:

选手姓名 参赛号 净成绩 总排名 年龄组排名
张三 A1234 3:22:10 128 15
李四 B5678 3:45:02 312 42
王五 C9012 4:10:33 587 89

在Golang里用 fmt.Printf 配合制表符 \t 就可以对齐,或者用第三方库 tablewriter 画得更漂亮,我有时候就这么干——把一帮跑友的成绩拉下来,跑得慢的请吃烧烤,愿赌服输嘛。

第四步:加个“防卡死”机制

比赛结束那几天,官方服务器压力大,请求可能超时,你可以用 http.Client 设置超时:

client := &http.Client{Timeout: 10 * time.Second}
resp, err := client.Get(url)

如果超时了,打印一句“服务器累了,等会儿再试”,比直接崩掉友善多了,你还能加个 重试机制,最多试三次,每次间隔2秒,这在实际查询中特别管用——我自己跑北马查成绩就这么干过,官方页面挂了,但我自己写的脚本反而查到了,因为它在默默重试。

黄河口马拉松成绩查询,用Golang写个自己查自己的小工具

第五步:整点高级的——把数据存本地

每次跑完马拉松,我只查一次就完了?不,我想保存下来,以后回头看:2025年黄河口跑了3小时22分,2026年跑了3小时18分……这不就是自己的跑步日记吗?

你可以把结果写进本地 CSV 文件,以后用Excel打开:

file, _ := os.OpenFile("results.csv", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
defer file.Close()
writer := csv.NewWriter(file)
writer.Write([]string{res.Name, res.Bib, res.NetTime, fmt.Sprintf("%d", res.Rank)})
writer.Flush()

下回再查,就直接往后面追加,几年后你打开这个CSV,看到自己成绩一点点提升,那感觉比查成绩本身还爽。

一点真实建议

Golang做这种小工具的优势在于 编译快、部署简单,你可以在自己电脑上写完了,编译成Windows或Mac的可执行文件,发给朋友直接用,都不用安装Go环境,我就经常这么干——跑团群里有人问“谁帮我查下成绩”,我直接扔个exe过去,对方双击就能用(当然要提前说一声信任问题)。

黄河口马拉松的官方查询页面如果你觉得排版不好看,完全可以自己写个 本地网页版,用Golang做后端,启动一个HTTP服务,在浏览器里输入参赛号查,那就更接近一个“微型网站”了,不过那是另一个话题了,今天先到这。

你去官网上找找那个API吧,找着了,十几行代码就能跑起来,然后把自己的成绩配上那个“破PB”的彩蛋,跑完步还能乐一下,多好。

本文来自作者[kyadmin]投稿,不代表678体育 - 全网热门体育赛事高清直播平台立场,如若转载,请注明出处:http://www.seanway.cn/ly/865.html

(5)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-07-18

    我是678体育 - 全网热门体育赛事高清直播平台的签约作者“kyadmin”!

  • kyadmin
    kyadmin 2026-07-18

    希望本篇文章《黄河口马拉松成绩查询,用Golang写个自己查自己的小工具》能对你有所帮助!

  • kyadmin
    kyadmin 2026-07-18

    本站[678体育 - 全网热门体育赛事高清直播平台]内容主要涵盖:678体育,678体育官网,678赛事直播

  • kyadmin
    kyadmin 2026-07-18

    本文概览:嘿,跑完黄河口马拉松的朋友们,是不是一过终点线就急着翻手机查成绩?我懂那种感觉,汗还在滴、腿还在抖,就想看看自己到底跑了多少,但有时候官...

    联系我们

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注我们