tutorial python

Usando sendphoto y sendmediagroup para enviar imágenes – python

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:

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.