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

问题描述

交叉发布 chess se,但没有。


lichess 和 chess.com 都具有实时播放变体 chess960功能。但是,只有 lichess 有图表显示您的实时 chess960 评分随时间的变化情况。 Lichess 还显示其他统计数据,如最高、最低、最好的胜利、最差的失败、平均对手评分等。(不过 chess.com 确实有对应的 chess960。)

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

问题:有没有一种方法可以使用某种脚本来获取每场 chess960 游戏后的评分,或者一般来说,获得评分的方法是使用某种脚本查看玩家的公开资料然后提取数据?

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


编辑 1:不确定堆栈上的主题,偏离主题的东西,但我之前在堆栈上发布过。我的第 1 个帖子是在 2014 年。似乎这些帖子收到了负面反应,因为我似乎要求用勺子喂食之类的。我不相信勺子喂养在这里一定是一个问题,如果它不是一些家庭作业,勺子喂养不一定是我要问的或至少打算(或“打算”?)问的问题。你可以给我一般的想法。例如,如果这与“抓取”或其他内容有关,那就直接说出来。'

然而,我并不认为这个问题与这些有什么不同:

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


更新 2:现已修复。请参阅“json”与“预制”。哇。

更新 1:Mike Steelson 似乎有一个答案 here,其中代码

=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,在以下新闻帖子中进行了描述:

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(还有这个How to Download and Install Kotlin on Windows,但也许所有的东西都已经在视频中了):

  1. 在例如 C:\Users\user 中创建一个 .kt(不是 .kts!)文件,例如 extractgames.kt(参见下面的 (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("[\\[\\]]"),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”与“预制”。哇。

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

=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 和国际象棋的输出会更混乱。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...