使用 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)
Tailwind css - “list-disc”没有正确设置 <li> 项目符号(双项目符号)