Esto es algo que he trabajado ultimamente y me he guiado mucho de la documentación de oficial de telegram pero me gustaría compartir como hago para enviar fotos a telegram con dos funciones
send photo es de las cosas mas sencillas de hacer ya que necesitamos enviar la imagen que queremos publicar y listo.
pongo un ejemplo de como llamar esto
def sendPhoto(self, chat_id, namePhoto = ''):
if namePhoto != '':
try:
files = {'photo': open(namePhoto,'rb')}
tlgurl = url+"{}/sendPhoto?chat_id={}".format(botapi,str(chat_id))
requests.post(tlgurl, files= files)
except:
pass
en esta funciona paramos el nombre de la imagen que queremos cargar (enviar la ruta) y hacemos la carga por un multi/part colocando en nuestra librería request files = variable donde cargamos el stream de la foto.
Pero para usar sendMediaGroup o en español como un grupo de fotos o galerías de fotos las cosas se complican un poco mas, ya que debemos un poco mas de conocimiento en ello
pero con esta función todo es mas sencillo
def sendPhotoGroup(self, chat_id, groupjpg, id=0):
myfiles = []
files = []
n = 0
for x in groupjpg:
f = {"type": "photo", "media": "attach://img"+str(n)}
fi = "img"+str(n) , open(x, "rb")
myfiles.append(f)
files.append(fi)
n = n + 1
params= {
"reply_to_message_id": id,
"media":
json.dumps(myfiles)
}
tlgurl = url+"{}/sendMediaGroup?chat_id={}".format(self.botapi,str(chat_id))
r = requests.post(tlgurl, params = params,files = dict(files) )
# print(r.json())
De manera resumida lo que tenemos que hacer es crear una tupla para el archivo file, donde ira el nombre de los attach que nos pide telegram + la estructura json donde le decimos que es cada tipo de archivo, esto me costo entenderlo y espero sea de ayuda.
debemos dividir lo que lleva el body y lo que lleva el file, la estrucutra es similar a esto
body
{
«media»: [{
«type»: «photo» ,
«media»: «attach://»+nombre_a_identificar
}]
y en el archivo file ira esto:
file
{
nombre_a_identificar : open(ruta_de_imagen, «rb»)
}
ya que este último archivo (file) queremos que sea dinámico tenemos que hacer una tupla, para luego antes de enviar hacer un dict y convertir nuestra tupla en el formato necesario.
ahora para llamar varios archivos y luego enviarlo a telegram podemos llamarlo de la siguiente manera
import os
import glob
from datetime import datetime
from bottelegram import botSend
import requests
import json
group = '-10013700000000'
photos = glob.glob("./*.png")
# print(photos)
send = botSend()
f = open('namehotel.txt', 'r')
id = send.message('hola estas son las fotos de '+ str(f.read()), group)
send.sendPhotoGroup(group,photos, id)
# for i in photos:
# send.sendPhoto(group,i)
glob nos sirve para filtrar el tipo de imagen que queremos usar especificando su directorio , dejare el codigo completo de la clase del bot de telegram por si lo necesitan
import requests
import json
botapi = 'tokendebot'
class botSend:
def __init__(self):
global url
url = "https://api.telegram.org/bot"
self.botapi = botapi
def message(self, text, chat_id):
smsn = url+"{}/sendMessage?chat_id={}&text={}".format(self.botapi,str(chat_id),text)
r = requests.post(smsn)
resp = r.json()
return resp['result']['message_id']
def sendPhoto(self, chat_id, namePhoto = ''):
if namePhoto != '':
try:
files = {'photo': open(namePhoto,'rb')}
tlgurl = url+"{}/sendPhoto?chat_id={}".format(self.botapi,str(chat_id))
requests.post(tlgurl, files= files)
except:
pass
def sendPhotoGroup(self, chat_id, groupjpg, id=0):
myfiles = []
files = []
namefile = []
n = 0
for x in groupjpg:
f = {"type": "photo", "media": "attach://img"+str(n)}
fi = "img"+str(n) , open(x, "rb")
myfiles.append(f)
files.append(fi)
n = n + 1
params= {
"reply_to_message_id": id,
"media":
json.dumps(myfiles)
}
tlgurl = url+"{}/sendMediaGroup?chat_id={}".format(self.botapi,str(chat_id))
r = requests.post(tlgurl, params = params,files = dict(files) )
# print(r.json())
y el resultado después de muchas horas: