Python (Telegram bot) | json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Рейтинг: 0Ответов: 1Опубликовано: 09.02.2023

Здраствуйте. Возникла проблема с функцией телеграм бота.

Принцип работы предельно прост: пользователь отправляет запрос и получает в ответ сообщение с изображением, которое загружается на Telegraph. Фрагмент кода упрощен от всех лишних деталей, так что тут нужно просто получить текстовый путь к этому файлу.

Основная проблема заключается в том, что задача выполняется через раз. Т.е., в один раз все происходит как требуется, в другой же возникает ошибка, код ошибки представлен ниже. Возможно это проблема связанна с самими запросами к Telegraph, который ограничивает их количество.

Пробовал выполнять различные манипуляции, предложенные в этой статье https://stackoverflow.com/questions/16573332/jsondecodeerror-expecting-value-line-1-column-1-char-0 , но не пришел к решению.

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

Основной код:

from telegraph import Telegraph
import json
import requests

telegraph = Telegraph()
telegraph.create_account(short_name='nick')
with open("image.jpg", 'rb') as f:
    path = requests.post('https://telegra.ph/upload', files={'file': ('file', f, 'image/jpg')}).json()[0]['src']
    print(path)

Правильный результат (пример):

/file/38ff935665107f3c8fb99.jpg

Ошибка:

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Ответы

▲ 0Принят

Ответ основан на советах пользователя insolor за что ему безмерная благодарность.

from telegraph import Telegraph
import json
import requests

from requests.exceptions import HTTPError # для обработки исключений

telegraph = Telegraph()
telegraph.create_account(short_name='nick')
retries = 3 # Кол-во попыток для запроса

# Цикл для корректного выполнения запроса к Telegraph
for n in range(retries):
    try:
        with open(image.jpg, 'rb') as f:
            response = requests.post('https://telegra.ph/upload', files={'file': ('file', f, 'image/jpg')}) # Выполнение запроса
            response.raise_for_status() # Получение информации о коде состояния HTTP

        # Если статус код состояния HTTP "200", то выполняется получение результата из него
        if response.status_code == 200:
            response = response.json()[0]['src']

        break

    # Если код состояния HTTP не "200" и соответствует значению в переменной code, то после задержки в 2 секунды, выполняется новая попытка совершения запроса
    except HTTPError as exc:
        code = exc.response.status_code

        if code in [429, 500, 502, 503, 504]:
            time.sleep(2)
            continue

        raise

    print(response)