Использование Codeforces API для получения информации обо всех AC пользователя по вопросам CF через discord bot (discord.py) - json ошибка обработки файла в python - PullRequest
0 голосов
/ 02 августа 2020

Я пытался создать бота Discord, который давал бы мне информацию о вопросах, в которых пользователь, которого я ввожу, получил AC. Для этого я взял файл json из CF API и преобразовал его в словарь, чтобы получить доступ к ключу, который содержал эту информацию, я приложил формат полученного 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

await coro (* args, ** kwargs)

Файл «C: / Users / HP / Desktop / labsheets / new_stuff / discbalalabot / bot.py», строка 23 в on_message для отправки в json_obj ['result']:

KeyError: 'result'

Вывод в Discord

  • nandini Сегодня в 14: 23
  • ! Stalk prabhu4
  • balalala BOT Сегодня в 14: 23
  • stalk prabhu4: (последнее правильно решено название проблемы)

API Link вы можете обратиться к метод user.status на этой странице

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 Ответ

1 голос
/ 02 августа 2020

Я начну с того, что посоветую вам использовать библиотеку aiohttp вместо библиотеки запросов, поскольку запросы блокируются, а aiohttp - asyn c. Он начинается с первых двух строк вашего кода. Вы хотите получить все слова, кроме команды. message.content - это не список слов, а строка сообщения. Вам нужно будет разбить его на слова, используя message.content.split (''). Теперь вы должны получить правильные результаты, когда получите файл json. Следующий requestinfo. json () возвращает dict, и создание dict не требуется. Когда вы это реализовали, все должно работать.

...