Python (Telegram bot) | json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Здраствуйте. Возникла проблема с функцией телеграм бота.
Принцип работы предельно прост: пользователь отправляет запрос и получает в ответ сообщение с изображением, которое загружается на 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)
Ответы (1 шт):
Ответ основан на советах пользователя 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)