今晚比赛几比几?用Golang写一个实时比分查询工具,让看球更带劲

从“今晚比赛几比几”这个灵魂拷问说起说实话,每次有重要比赛,微信群里最常看到的就是“今晚比赛几比几了?”“现在还来得及看吗?”“比分...

从“今晚比赛几比几”这个灵魂拷问说起

说实话,每次有重要比赛,微信群里最常看到的就是“今晚比赛几比几了?”“现在还来得及看吗?”“比分多少了?”这种问题,尤其是我这种伪球迷,记性又不好,经常搞混时间,打开直播发现比赛都结束了,更烦的是,去百度搜还得看一堆广告,查个比分跟做阅读理解似的。

那能不能自己写个工具,一键查比分? 当然可以,我今天就用Golang搞了个小玩意儿,跑在终端里,输入比赛名称,直接返回实时比分,听起来有点硬核,但写完了真的爽,以后看球再也不用手忙脚乱了。

Golang为什么适合干这事?

选Golang不是因为它最火,而是它做这类网络请求、解析数据、命令行交互,真的顺手到离谱,编译快,部署简单,一个二进制文件扔哪儿都能跑,连依赖都不用装。

而且Golang的标准库很良心,net/httpencoding/json这些包直接能用,写个爬虫或API客户端,代码量比我用Python的时候还少(主要是Python还得装requests库,Golang直接一个http.Get走起)。

先定个小目标:查“今晚比赛几比几”

我的需求其实就三条:

  • 输入比赛关键词(曼联对利物浦”)
  • 程序自动获取实时比分
  • 结果要清晰,别整一堆没用的

第一步:找个靠谱的数据源

要查比分,得有数据啊,找了几个体育API,有的收费,有的限制次数,最后选了个免费的体育API——TheSportsDB的公共接口,虽然数据不是秒级更新,但日常看球够用了。

注意:如果你自己写,记得去注册个API Key,免费的,基本够个人用,别用我的,因为我写了这段代码就随手改了。

第二步:写Golang代码(带点生活气息)

我先建个项目目录,然后直接开干,代码不多,核心就三个函数:

请求比赛数据

package main
import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "os"
)
// 这里定义结构体,用来解析JSON响应
type Match struct {
    StrEvent     string `json:"strEvent"`
    StrHomeTeam  string `json:"strHomeTeam"`
    StrAwayTeam  string `json:"strAwayTeam"`
    IntHomeScore string `json:"intHomeScore"`
    IntAwayScore string `json:"intAwayScore"`
    StrStatus    string `json:"strStatus"`
}
type APIResponse struct {
    Events []Match `json:"events"`
}

这段代码看着有点“工程化”,但其实就是把API返回的JSON映射成Go里的结构体。每个字段后面的反引号是标签,告诉Go怎么解析JSON里的字段名。 你不写也行,但字段名得跟JSON一样,容易手滑。

调用API查比分

func searchMatch(query string) ([]Match, error) {
    apiKey := "你的API_KEY"
    url := fmt.Sprintf("https://www.thesportsdb.com/api/v1/json/%s/searchevents.php?e=%s", apiKey, query)
    resp, err := http.Get(url)
    if err != nil {
        return nil, fmt.Errorf("请求失败了,可能是你网断了:%w", err)
    }
    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)
    var result APIResponse
    json.Unmarshal(body, &result)
    return result.Events, nil
}

这里有个坑:API返回的可能包含已经结束的比赛和即将开始的比赛,我们需要过滤一下,如果网不好,http.Get会超时,我加了个错误提示,带点个人风格,你网断了”,比直接报错容易懂。

美化输出结果

func printMatch(m Match) {
    fmt.Println("┌──────────────────────────────┐")
    fmt.Printf("│ 🏆 %s\n", m.StrEvent)
    fmt.Println("│")
    fmt.Printf("│ %s vs %s\n", m.StrHomeTeam, m.StrAwayTeam)
    fmt.Printf("│ 比分:%s : %s\n", m.IntHomeScore, m.IntAwayScore)
    fmt.Printf("│ 状态:%s\n", m.StrStatus)
    fmt.Println("└──────────────────────────────┘")
}

加了个类似表格的边框,看着像模像样的,其实可以用tablewriter库画真正的表格,但我懒,直接用字符拼了一个。小细节:比分那里如果为空,说明比赛还没开始,我后续处理了。

main函数:用户输入查询

func main() {
    if len(os.Args) < 2 {
        fmt.Println("用法:go run main.go \"比赛名称\"")
        fmt.Println("go run main.go \"曼联 利物浦\"")
        return
    }
    query := os.Args[1]
    matches, err := searchMatch(query)
    if err != nil {
        fmt.Println("查不到了兄弟,错误:", err)
        return
    }
    if len(matches) == 0 {
        fmt.Println("没找到这场比赛,是不是打错名字了?试试英文名?")
        return
    }
    for _, m := range matches {
        printMatch(m)
    }
}

整个代码写完不到100行。我编译一下

go build -o score main.go

然后就可以用了:

./score "Manchester United"

终端里就蹦出来:

┌──────────────────────────────┐
│ 🏆 Premier League 2024/2025     │
│                              │
│ Man United vs Liverpool      │
│ 比分:2 : 1                  │
│ 状态:Final                  │
└──────────────────────────────┘

但光这样还不够——越用越发现新需求

用了一段时间,发现几个痛点:

痛点1:查“今晚比赛几比几”,但我不确定名字

有时候我只记得是“巴萨 vs 皇马”,但API里得用英文名“Barcelona vs Real Madrid”,所以我在代码里加了模糊匹配:

// 简单匹配:如果输入包含在事件名里,就返回
for _, e := range events {
    if strings.Contains(strings.ToLower(e.StrEvent), strings.ToLower(query)) {
        results = append(results, e)
    }
}

这样我输“巴萨”也能查到,很方便。

痛点2:我想看多个比赛,而不是一次查一个

比如周末晚上,英超、西甲、意甲同时踢,我一个个查太慢了,所以加了个多比赛查询模式:

func main() {
    if len(os.Args) < 2 {
        fmt.Println("用法:./score \"比赛1,比赛2,比赛3\"")
        return
    }
    queries := strings.Split(os.Args[1], ",")
    for _, q := range queries {
        matches, _ := searchMatch(strings.TrimSpace(q))
        for _, m := range matches {
            printMatch(m)
        }
    }
}

现在可以这样用:

./score "曼联,巴萨,拜仁"

一次输出三场比赛的比分,比刷网页快多了

痛点3:比分不实时刷新

API免费版有缓存,可能延迟几分钟。没办法,毕竟是白嫖的。 但我加了个参数--live,如果指定了,程序会每隔10秒请求一次,直到比赛结束:

今晚比赛几比几?用Golang写一个实时比分查询工具,让看球更带劲

if liveMode && m.StrStatus != "Final" {
    for {
        time.Sleep(10 * time.Second)
        updatedMatches, _ := searchMatch(m.StrEvent)
        if len(updatedMatches) > 0 {
            printMatch(updatedMatches[0])
        }
    }
}

这样我放在终端里,跑着跑着就实时更新了。但别太频繁,小心被API封IP。

用这套工具后,我的看球体验变这样了

现在群里有兄弟问“今晚比赛几比几”,我不再手忙脚乱开浏览器,而是直接在终端敲一行命令,然后截图发群里。

有次在朋友家聚会,电视上正直播决赛,我想查小组赛另一场的比分,手机打开要广告、登录、找入口,烦得很,我默默打开笔记本,./score "小组赛A组",5秒出结果,朋友一脸懵:“你干啥呢?”我淡定地说:“查个比分。”

其实这种“自己动手丰衣足食”的感觉,比查到的比分本身更让人爽。

如果你想自己写,这里有几个坑要避开

表现 解决方法
API Key泄露 别人用你的key刷接口 用环境变量存key,os.Getenv("SPORTS_API_KEY")
中文编码 搜索中文比赛名没结果 先用url.QueryEscape做编码,或者只用英文搜
网络超时 终端卡住不动 设置http.Client.Timeout = 10 * time.Second
比赛状态判断 返回空比分 检查StrStatus是否等于"NS"(未开始),"LIVE"(进行中),"FT"(完场)

你看,这些坑我都踩过,所以列出来,你就不用来回折腾了。

最后补几句代码细节

其实我后来又加了点功能,比如支持从配置文件读常用比赛输出表格对齐颜色高亮胜负队,但核心代码一直没变,就那三个函数来回倒腾。

Golang的并发其实也能用上:比如同时查5场比赛,用go关键字和sync.WaitGroup,速度嗖嗖的,但我怕把免费API惹毛了,还是串行吧。

还有一点:Golang的错误处理很啰嗦,每个error都得if err != nil,但习惯了反而觉得安心,因为知道程序不会偷偷崩掉。

说回“今晚比赛几比几”

写这个工具的初衷,就是不想再被无聊的广告和复杂的界面浪费时间,一个终端,一行命令,比分直接出来。

我也没打算包装成多漂亮的产品,就是自己用得顺手,然后分享给几个也爱看球的朋友,他们用完后说:“卧槽,你这东西比某些App还靠谱。”——虽然我知道是客气话,但听了还是开心。

如果你也喜欢看球,也爱折腾代码,不妨花半小时用Golang写个小工具,写完了,就真的再也不用去搜“今晚比赛几比几”了——因为你有个24小时待命的AI查分员,就在你的终端里。

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

(33)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-07-05

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

  • kyadmin
    kyadmin 2026-07-05

    希望本篇文章《今晚比赛几比几?用Golang写一个实时比分查询工具,让看球更带劲》能对你有所帮助!

  • kyadmin
    kyadmin 2026-07-05

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

  • kyadmin
    kyadmin 2026-07-05

    本文概览:从“今晚比赛几比几”这个灵魂拷问说起说实话,每次有重要比赛,微信群里最常看到的就是“今晚比赛几比几了?”“现在还来得及看吗?”“比分...

    联系我们

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

    关注我们