2015-07-03 30 views
6

Tôi đã tạo một bot điện tín gửi ảnh theo yêu cầu từ URL bằng cách sử dụng trình bao bọc pyTelegramBotAPI. Vì vậy, tôi đã thử đặt một URL ảnh giả và kiểm tra xem bot có thể gửi hình ảnh nhưng không thành công với lỗi sau.Gửi ảnh từ URL bằng Telegram Bot

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

Tôi không chắc chắn những gì lỗi là, nhưng làm thế nào tôi có thể gửi ảnh từ URL sử dụng Telegram Bot API chính xác? Đây là mã của tôi

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) 

Tôi không chắc mình có bỏ sót điều gì không.

Trả lời

6

Hãy thử điều này:

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) 

hoặc (sử dụng 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

Vì vậy, chúng ta cần phải tải về toàn bộ tập tin vào thư mục địa phương trước khi tải lên để Telegram sau khi tất cả. Có cách nào để giảm kích thước hình ảnh trong khi tải xuống, khi tôi chạy tập lệnh hoàn toàn trên máy của mình không? – Zerocchi

+0

Tôi không biết chính xác những gì bạn đang cố gắng thực hiện, nhưng tôi chắc chắn có nhiều cách để nén hình ảnh bằng python, chỉ không _while_ tải xuống. Và đảm bảo xóa hình ảnh khỏi máy tính của bạn khi bạn không cần tệp nữa. – Pete

+0

Mã của tôi ở đây - Tôi tin rằng tôi mới dùng python - không yêu cầu tải hình ảnh vào thư mục cục bộ: http://stackoverflow.com/a/32441772/1097372 – Iyas

2
elif 'Hi' in text: 
    reply(img=urllib2.urlopen('img url').read()) 
Các vấn đề liên quan