Python - ошибка при попытке доступа к API более одного раза - PullRequest
0 голосов
/ 29 апреля 2018

Я программирую в школе, и скоро мне нужно будет запрограммировать мой последний кусок. Следующая программа (написанная на языке программирования Python) как программа, которую я пишу просто для тренировки доступа к API. Я пытаюсь получить доступ к API для прицела, основанного на игре. Идея программы состоит в том, чтобы каждые 30 секунд проверять этот API на наличие изменений в данных, сохраняя их в наборах данных («baseRank» и «basePP»), как только он запускается, а затем сравнивать эти данные с новыми полученными данными. 30 секунд спустя Вот моя программа:

import time

apiKey = '###'
rankDifferences = []
ppDifferences = []
const = True

username = '- Legacy'
url = "https://osu.ppy.sh/api/get_user?u={1}&k={0}".format(apiKey,username)        
import urllib.request, json 
with urllib.request.urlopen(url) as url:
    stats = json.loads(url.read().decode())
stats = stats[0]

basePP = stats['pp_raw']
print(basePP)
baseRank = stats['pp_rank']
print(baseRank)

while const == True:
    time.sleep(30)
    import urllib.request, json 
    with urllib.request.urlopen(url) as url:
        check = json.loads(url.read().decode())
    check = check[0]

    rankDifference = baseRank + check['pp_rank']
    ppDifference = basePP + check['pp_raw']
    baseRank = check['pp_raw']
    basePP = check['pp_raw']

    if rankDifference != 0:
        print(rankDifference)

    if ppDifference != 0:
        print(ppDifference)`

Обратите внимание: там, где я написал 'apiKey =' ### '', я на самом деле использую реальный работающий ключ API, но я его спрятал, так как сайт просит не делиться своим ключом API с другие. Вот состояние оболочки после запуска:

5206,55

12045

Traceback (последний вызов был последним):

Файл "C: / Users / ethan / Documents / osu API Accessor.py", строка 23, в с urllib.request.urlopen (url) в качестве URL: Файл

"C: \ Users \ ethan \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ urllib \ request.py",> строка 223, в urlopen return opener.open (url, data, timeout)

Файл

"C: \ Users \ ethan \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ urllib \ request.py",> строка 518, в открытом виде протокол = req.type

AttributeError: у объекта 'HTTPResponse' нет атрибута 'type'

Как вы можете видеть, он печатает как basePP, так и baseRank, доказывая, что я могу получить доступ к этому API. Проблема, кажется, когда я пытаюсь получить доступ к нему во второй раз. Честно говоря, я не совсем уверен, что означает эта ошибка. Поэтому, если вы не возражаете потратить время на объяснение и / или помощь в исправлении этой ошибки, это будет с благодарностью.

Примечание: я впервые пользуюсь этим форумом, поэтому, если я делаю что-то не так, мне очень жаль!

1 Ответ

0 голосов
/ 29 апреля 2018

Проблема, кажется, когда вы делаете:

with urllib.request.urlopen(url) as url:
    stats = json.loads(url.read().decode())

Использование вами переменной url меняет ее, поэтому, когда вы попытаетесь использовать ее позже, она не будет работать.

Попробуйте что-то вроде:

with urllib.request.urlopen(url) as page:
    stats = json.loads(page.read().decode())

и все должно быть в порядке.

...