Я не могу отправить сообщение пользователям бота telegram, но сам - PullRequest
0 голосов
/ 19 ноября 2018

Почему я не могу отправить сообщение пользователям моего бота?

filename = 'a.png'

url = "https://api.telegram.org/botxxxxx:yyyyyyyyyyyyy/sendPhoto";
files = {'photo': open(filename, 'rb')}

data = {'chat_id': "538087xx"}
r = requests.post(url, files=files, data=data)
print(r.status_code, r.reason, r.content)

data = {'chat_id': "642201xx"}
r = requests.post(url, files=files, data=data)
print(r.status_code, r.reason, r.content)

data = {'chat_id': "350225xx"}
r = requests.post(url, files=files, data=data)
print(r.status_code, r.reason, r.content)

Я пытаюсь отправить сообщение 3 пользователям, во-первых, я, владелец бота, и я могу получить сообщение.2 других аккаунта уже отправили сообщение боту.но результаты:

(200, 'OK', '{"ok":true,"result":{"message_id":77,"from":{"id":5258785xx,"is_bot":true,"first_name":"anal_bot","username":"rojandco_bot"},"chat":{"id":538087xx,"first_name":"Ehsan","username":"Shirzadi","type":"private"},"date":1542626038,"photo":[{"file_id":"AgADBAADeqwxG0-KmVNFxlFtWWBr7AQvuhoABG2shK_JcTywFuQEAAEC","file_size":1084,"width":90,"height":63},{"file_id":"AgADBAADeqwxG0-KmVNFxlFtWWBr7AQvuhoABKqN07Vwmbw_F-QEAAEC","file_size":12199,"width":320,"height":224},{"file_id":"AgADBAADeqwxG0-KmVNFxlFtWWBr7AQvuhoABCOVGKfhnnt_GeQEAAEC","file_size":49836,"width":800,"height":561},{"file_id":"AgADBAADeqwxG0-KmVNFxlFtWWBr7AQvuhoABAyOV-TH27bRGOQEAAEC","file_size":99617,"width":1280,"height":898}]}}')
(400, 'Bad Request', '{"ok":false,"error_code":400,"description":"Bad Request: file must be non-empty"}')
(400, 'Bad Request', '{"ok":false,"error_code":400,"description":"Bad Request: file must be non-empty"}')

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Проблема в том, что requests.post читает файл, но не сбрасывает его в исходное положение, как видно здесь : в строке 159 происходит чтение.

Итак, ваш первый post работает, но все последующие запросы будут отправлять пустой файл в telegram. Это именно то, что телеграмма говорит вам с "Bad Request: file must be non-empty": вы отправляете пустой файл.

Это означает, что для того, чтобы отправить один и тот же файл несколько раз, вы можете либо открыть файл заново или выполнить поиск в начале файла, либо - когда вы все равно читаете файл - передать содержимое файла непосредственно в requests (вероятно, лучшее решение из трех), как это:

with open(filename, 'rb') as photo:
    files = {'photo': photo.read()}  # note that we actually read() the file here

for user in all_the_users_you_want_to_send_the_file_to:
    requests.post(url, files=files, ...)

Обратите внимание, что это работает, потому что requests также принимает строку вместо файловоподобного объекта. Таким образом, файл читается только один раз, что может быть быстрее в зависимости от размера файла. (см. документацию для более подробной информации)

Также обратите внимание, что действительно должно использовать оператор with при чтении или записи файлов.

requests не не закрывает файл, когда это будет сделано. В этом случае вы увидите сообщение об ошибке типа

ValueError: чтение закрытого файла

0 голосов
/ 19 ноября 2018

Вы открываете файл в четвертой строке с помощью

files = {'photo': open(filename, 'rb')}

Первый вызов request.post, вероятно, закрывает дескриптор файла, таким образом не делая его доступным для второго и третьего request.post.

В сообщении об ошибке, которое вы разместили, содержится нужная вам информация. Чтобы это исправить, просто заново откройте файл, прежде чем публиковать данные каждый раз.

Edit: Вомбац прав requests.post читает в конец файла.

Вот как вы будете искать начало файла:

files['photo'].seek(0)
...