Отправка фото с URL с помощью Telegram Bot

Я сделал бота для телеграмм, который отправляет фото по запросу с URL-адреса с помощью оболочки pyTelegramBotAPI. Поэтому я попытался поместить фиктивный URL-адрес фотографии и проверить, может ли бот отправить изображение, но это не удалось со следующей ошибкой.

telebot.apihelper.ApiException: sendPhoto failed. Returned result: <Response [400]>

Я не уверен, в чем заключается ошибка, но как правильно отправить фотографию с URL-адреса с помощью Telegram Bot API? Вот мой код

import telebot
import time
import urllib
from io import BytesIO
from PIL import Image

TOKEN = '<token here>'
url='http://scontent-b.cdninstagram.com/hphotos-xfa1/t51.2885-15/e15/10919672_584633251672188_179950734_n.jpg'

def listener(*messages):
    for m in messages:
        chatid = m.chat.id
        if m.content_type == 'text':
            text = m.text
            name = m.fromUser.first_name
            msgid = m.message_id
            if(text.startswith('/photo')):
                img = BytesIO(urllib.request.urlopen(url).read())
                tb.send_chat_action(chatid, 'upload_photo')
                tb.send_photo(chatid, img, reply_to_message_id=msgid)


tb = telebot.TeleBot(TOKEN)
tb.get_update()  # cache exist message
tb.set_update_listener(listener) #register listener
tb.polling()
while True:
    time.sleep(1)

Я не уверен, что я что-то пропустил.


person Zerocchi    schedule 03.07.2015    source источник


Ответы (1)


Попробуй это:

import telebot
import time
import urllib

url = 'http://scontent-b.cdninstagram.com/hphotos-xfa1/t51.2885-15/e15/10919672_584633251672188_179950734_n.jpg'
f = open('out.jpg','wb')
f.write(urllib.request.urlopen(url).read())
f.close()

def listener(*messages):
    for m in messages:
        chat_id = m.chat.id
        if m.content_type == 'text':
            text = m.text
            msgid = m.message_id
            if text.startswith('/photo'):
                tb.send_chat_action(chat_id, 'upload_photo')
                img = open('out.jpg', 'rb')
                tb.send_photo(chat_id, img, reply_to_message_id=msgid)
                img.close()


tb = telebot.TeleBot(TOKEN)
tb.set_update_listener(listener) #register listener
tb.polling()

while True:
    time.sleep(0)

или (используя pyTelegramBotAPI 0.2.0)

import telebot
import time
import urllib

url='http://scontent-b.cdninstagram.com/hphotos-xfa1/t51.2885-15/e15/10919672_584633251672188_179950734_n.jpg'
f = open('out.jpg','wb')
f.write(urllib.request.urlopen(url).read())
f.close()

tb = telebot.TeleBot(TOKEN)

@tb.message_handler(commands=['photo'])
def send_photo(message):
    tb.send_chat_action(message.chat.id, 'upload_photo')
    img = open('out.jpg', 'rb')
    tb.send_photo(message.chat.id, img, reply_to_message_id=message.message_id)
    img.close()

tb.polling()

while True:
    time.sleep(0)
person Pete    schedule 03.07.2015
comment
Поэтому нам нужно загрузить весь файл в локальную папку перед загрузкой в ​​Telegram. Есть ли способ уменьшить размер изображения при загрузке, если я полностью запускаю скрипт на своей машине? - person Zerocchi; 04.07.2015
comment
Я не знаю, что именно вы пытаетесь сделать, но я уверен, что есть способы сжимать изображения с помощью python, но не во время загрузки. И обязательно удалите изображение со своего компьютера, когда он вам больше не нужен. - person Pete; 04.07.2015
comment
Мой код здесь - я считаю, что я новичок в python - не требует загрузки изображения в локальную папку: stackoverflow.com/ a / 32441772/1097372 - person Iyas; 07.09.2015