2015-07-03 8 views
6

Ich habe einen Bot-Bot, der Foto auf Anfrage sendet von URL mit pyTelegramBotAPI Wrapper. Also habe ich versucht, eine Dummy-Foto-URL zu erstellen und zu testen, ob der Bot das Bild senden kann, aber es ist mit dem folgenden Fehler fehlgeschlagen.Senden von Fotos von URL mit Telegram Bot

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

Ich bin nicht sicher, was der Fehler ist, aber wie kann ich richtig ein Foto von URL-Telegramm Bietet API senden? Hier ist mein Code

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) 

Ich bin mir nicht sicher, ob ich etwas verpasst habe.

Antwort

6

Versuchen Sie folgendes:

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) 

oder (mit 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) 
+0

Also brauchen wir ganze Datei in lokalen Ordner herunterladen, bevor schließlich zu Telegramm hochladen. Gibt es eine Möglichkeit, die Bildgröße beim Herunterladen zu reduzieren, wenn ich das Skript vollständig auf meinem Computer ausführen? – Zerocchi

+0

Ich weiß nicht, was es genau ist, was Sie versuchen zu machen, aber ich bin sicher, es gibt Möglichkeiten, Bilder mit Python zu komprimieren, nur nicht _while_ Download. Stellen Sie sicher, dass Sie das Bild von Ihrem Computer löschen, wenn Sie die Datei nicht mehr benötigen. – Pete

+0

Mein Code hier - ich glaube, ich bin neu in Python - erfordert nicht das Bild in den lokalen Ordner herunterladen: http://StackOverflow.com/a/32441772/1097372 – Iyas

2
elif 'Hi' in text: 
    reply(img=urllib2.urlopen('img url').read()) 
Verwandte Themen