使用 Codeforces API 通过 discord bot (discord.py) 获取有关用户在 CF 问题上的所有 AC 的信息 - python 中的 json 文件处理错误

Posted

技术标签:

【中文标题】使用 Codeforces API 通过 discord bot (discord.py) 获取有关用户在 CF 问题上的所有 AC 的信息 - python 中的 json 文件处理错误【英文标题】:Using Codeforces API to get information about all ACs of a user on CF questions through discord bot (discord.py) - json file handling error in python 【发布时间】:2020-11-22 15:18:17 【问题描述】:

我正在尝试制作一个不和谐的机器人,它可以为我提供有关我输入的用户获得 AC 的问题的信息。为此,我从 CF API 获取 json 文件并将其转换为字典以访问保存此信息的密钥,我附上了获取的 json 的格式。问题是它在我访问密钥的行上给了我一个错误,以及另一个我无法确定头部或尾部的错误,我也附上了错误。谁能告诉我我在哪里搞砸了,因为我对这个框架和 python 都很陌生,我也在下面附上了我的代码。

代码


import discord
import requests
import json
token = '(my_token)'
client = discord.Client()


@client.event
async def on_message(message):
    if message.content.startswith("!stalk"):
        handle = ""
        words = message.content
        for word in words[1:]:
            handle += word
        await message.channel.send(handle + ': (last correctly solved problem name) ')
        link = "https://codeforces.com/api/user.status?handle="
        link += handle
        request_info = requests.get(link)
        json_obj = dict(request_info.json())
        last_correct_problems = []
        for submissions in json_obj['result']:
            if submissions['verdict'] == 'OK':
                last_correct_problems.append(submissions['problem']['name'])
        for problem in last_correct_problems:
            await message.channel.send(problem + ', ')
client.run(token)

错误

忽略 on_message 中的异常

Traceback(最近一次调用最后一次):

文件“C:\Users\HP\Anaconda3\envs\balalalabot\lib\site-packages\discord\client.py”,第 312 行,在 _run_event 中

等待 coro(*args, **kwargs)

文件“C:/Users/HP/Desktop/labsheets/new_stuff/discbalalabot/bot.py”,第 23 行,on_message 对于 json_obj['result'] 中的提交:

KeyError: '结果'

不和谐的输出

nandini 今天 14:23 !stalk prabhu4 balalala BOT 今天 14:23 stalk prabhu4:(最后正确解决的问题名称)

API 链接 you can refer to the user.status method on this page

提取的 JSON

"status":"OK",
"result":["id":88388369,
"contestId":702,
"creationTimeSeconds":1596059866,
"relativeTimeSeconds":2147483647,
"problem":"contestId":702,
"index":"A",
"name":"Maximum Increase",
"type":"PROGRAMMING",
"rating":800,
"tags":["dp","greedy","implementation"],
"author":"contestId":702,
"members":["handle":"Prabhu4"],
"participantType":"PRACTICE",
"ghost":false,"startTimeSeconds":1469804400,
"programmingLanguage":"GNU C++17",
"verdict":"OK",
"testset":"TESTS",
"passedTestCount":32,
"timeConsumedMillis":46,
"memoryConsumedBytes":3788800,
"id":88388346,
"contestId":702,
"creationTimeSeconds":1596059822,
"relativeTimeSeconds":2147483647,
"problem":"contestId":702,
"index":"A",
"name":"Maximum Increase",
"type":"PROGRAMMING",
"rating":800,
"tags":["dp","greedy","implementation"],
"author":"contestId":702,
"members":["handle":"Prabhu4"],
"participantType":"PRACTICE",
"ghost":false,
"startTimeSeconds":1469804400,
"programmingLanguage":"GNU C++17",
"verdict":"WRONG_ANSWER",
"testset":"TESTS",
"passedTestCount":0,
"timeConsumedMillis":15,
"memoryConsumedBytes":3788800]

【问题讨论】:

【参考方案1】:

首先我建议您使用 aiohttp 库而不是 requests 库,因为请求是阻塞的,而 aiohttp 是异步的。 它从代码的前几行开始。您想获取除命令之外的所有单词。 message.content 不是单词列表,而是消息的字符串。您必须使用 message.content.split(' ') 将其拆分为单词。 现在,当您获取 json 文件时,您应该会得到正确的结果。 下一个 requestinfo.json() 返回一个字典并且不需要制作一个字典。 当你实现它后,它应该可以工作了。

【讨论】:

天啊,非常感谢,因为一个普通的 .split 我被卡住了这么久,非常感谢你的帮助。

以上是关于使用 Codeforces API 通过 discord bot (discord.py) 获取有关用户在 CF 问题上的所有 AC 的信息 - python 中的 json 文件处理错误的主要内容,如果未能解决你的问题,请参考以下文章

使用官方API可视化codeforces.com中的用户数据

STM32F769I-disc片内flash对接fal框架(基于RT-thread)

如何使用 API 调用重现 quser.exe?

Tailwind css - “list-disc”没有正确设置 <li> 项目符号(双项目符号)

如何将 list-disc 应用于 Markdownit 呈现的 ul?

python3-disc和set