来自 chess.com 的 chess960 实时统计?

Live statistics chess960 from chess.com?

交叉post编辑chess se,但没有。


lichess and chess.com have the feature to play the variant chess960 都在直播。但是,只有 lichess 有图表显示您的实时 chess960 评分随时间的变化情况。 Lichess 还显示其他统计数据,如最高、最低、最佳胜场、最差失利、平均对手评分等。(chess.com 对应 chess960 确实有此信息。)

我可以在 Excel/Google 表格中创建自己的图表和统计数据,方法是手动记录每场比赛的日期,然后在我的用户名旁边显示我的评分,但是...

问题:有没有一种方法可以在每场 chess960 比赛后使用某种脚本获取玩家的评分,或者一般情况下是如何获取评分的? public 配置文件然后提取数据?

我觉得这种脚本以前有人做过,即使这不是专门为 chess.com 的 live chess960 做的。该脚本不必绘制图表(一旦您需要数据就很容易做到:只需使用 excel/google 工作表)。我只需要脚本来收集用户游戏每一行的所有日期和评级数字。


编辑 1:不确定堆栈中的主题、题外内容,但我已经 post编辑了之前的堆栈。我的第一个 post 是在 2014 年。似乎这些 post 正在获得负面反应,因为我似乎要求用勺子喂食或其他东西。如果这不是一些家庭作业,我认为用勺子喂食不一定是这里的问题,而且用勺子喂食不一定是我要问的或至少打算(或 'am intending' ?)问的。你可以给我一般的想法。例如,如果这与 'scraping' 或其他事情有关,那么就这么说。'

但是,我不太认为这个问题与这些问题有什么不同:

  1. How do I get notified if SE tweets my question? --> 在这里你可以争辩说我是在问 se 本身,所以应该允许。我问过 chess.com 个人,但他们没有回复我,所以我来了。

  2. Pricing when arbitrage is possible through Negative Probabilities or something else --> 我的意思是这家伙是在用勺子喂食还是写脚本什么的?

编辑 2:此外,我在此 post 中试图表达的是避免 重新发明 [=73] 的概念=] 重塑。 我的意思是,我不可能成为互联网历史上第一个想要从 chess.com 或 lichess 或其他东西中提取数据的人。另外,国际象棋是一种已经存在了一段时间的游戏。它不像 csgo 或 valorant w/c 相对较新。我真的没有看到任何要点 A - 自己查找如何从网站中提取数据,作为自己手动输入数据的替代方法,当然还有 B - 自己手动输入数据,如果这看起来很奇怪目前还没有现成的方法来做到这一点。


更新 2:现已修复。查看 'json' 与 'preformed'。哇。

更新 1:Mike Steelson 似乎有一个答案 ,其中给出的代码为

=arrayformula( regexextract(split( substitute(substitute(substitute(getDataJSON(A1;"/games";"/pgn");"[";"");"]";"");"""";"") ;char(10));"\s.*") )

这里给出了一个例子

https://docs.google.com/spreadsheets/d/1MX1o5qdy0K3gTMzbimUV3SmFf-0XPCSJ8Vz4IjI-8Ak/copy

只在chess960的情况下出现了问题。考虑例如 this player:用玩家的用户名替换 'gmwso' 会产生奇怪的输出。我想混合 chess960 和国际象棋的输出会更混乱。

我的 answer on Chess.SE 的副本,以防有人在这里寻找答案。


是的,可以得到你想要的数据。 Chess.com 有一个 REST API,在以下新闻 post 中有描述:

https://www.chess.com/news/view/published-data-api

您可以使用以下 URL 获取玩家游戏的每月存档列表:

https://api.chess.com/pub/player/{username}/games/archives

在此列表中,您会发现 URL 如下所示:

https://api.chess.com/pub/player/{username}/games/{YYYY}/{MM}

如果您将 /pgn 附加到此 URL,您将获得 PGN 格式的所有游戏,这可能更容易解析。

让我们看一个例子:

https://api.chess.com/pub/player/magnuscarlsen/games/2018/01/pgn

在这里您可以找到 Magnus Carlsen 在 2018 年 1 月玩过的游戏。此列表包含几个 Chess960 游戏,它们由以下标签标识:

[Variant "Chess960"]

以下标签将为您提供游戏的 UTC 日期和时间以及当时玩家的评分:

[UTCDate "2018.01.03"]
[UTCTime "21:50:55"]
[WhiteElo "2706"]
[BlackElo "2940"]

Lichess 还有一个 API 可以下载游戏,我已经描述过 here

代码

下面是一些提取数据的简单 Kotlin 代码(您需要更改文件和用户名):

import java.io.File

fun main() {
    val data = (File("ChessCom_magnuscarlsen_201801.pgn").readText().trim().split("\n\n\n").map {
        it.split('\n').filter { it.startsWith('[') }.map {
            val t = it.replace(Regex("[\[\]]"), "").split(' ', limit = 2)
            t[0] to t[1]
        }.toMap()
    })
    data.forEach {
        if (it["Variant"] == "\"Chess960\"") {
            println("${it["UTCDate"]} ${it["UTCTime"]} ${it[if (it["White"] == "\"MagnusCarlsen\"") "WhiteElo" else "BlackElo"]}")
        }
    }
}

结果:

"2018.01.03" "21:50:55" "2706"
"2018.01.03" "21:09:41" "2727"
"2018.01.03" "19:43:22" "2703"

好吧,我找到了一种只用记事本和命令提示符(和 java/jar)来完成 Sleafar 输出的方法

这是基于 Run Kotlin in Windows cmd (and also this How to Download and Install Kotlin on Windows,但也许所有的东西都已经在视频中了):

  1. 创建一个 .kt(不是 .kts!)文件,例如 extractgames.kt 例如 C:\Users\user(参见下面的 (A))

  2. 打开 cmd(命令提示符),然后如果需要 运行 cd "C:\Users\user" 更改目录。

  3. 运行 kotlinc extractgames.kt -include-runtime -d extractgames.jar

  4. 运行 java -jar extractgames.jar


(A) Re (1) 上面,我猜代码看起来像

import java.io.File

fun main() {
    val data = (File("[insert full directory here and remove rectangular brackets. you may or may not need the \ instead of just \]").readText().trim().split("\n\n\n").map {
        it.split('\n').filter { it.startsWith('[') }.map {
            val t = it.replace(Regex("[\[\]]"), "").split(' ', limit = 2)
            t[0] to t[1]
        }.toMap()
    })
    data.forEach {
        if (it["Variant"] == "\"Chess960\"") {
            println("${it["UTCDate"]} ${it["UTCTime"]} ${it[if (it["White"] == "\"[insert username here and remove rectangular brackets. i guess need not be case sensitive. but check for yourself]\"") "WhiteElo" else "BlackElo"]}")
        }
    }
}

更新 2:现已修复。查看 'json' 与 'preformed'。哇。

更新 1:Mike Steelson 似乎有一个答案 ,其中给出的代码为

=arrayformula( regexextract(split( substitute(substitute(substitute(getDataJSON(A1;"/games";"/pgn");"[";"");"]";"");"""";"") ;char(10));"\s.*") )

这里给出了一个例子

https://docs.google.com/spreadsheets/d/1MX1o5qdy0K3gTMzbimUV3SmFf-0XPCSJ8Vz4IjI-8Ak/copy

只到chess960的情况下好像有问题。考虑例如 this player:用玩家的用户名替换 'gmwso' 会产生奇怪的输出。我想混合 chess960 和国际象棋的输出会更混乱。