Raspberry Pi zero w Camara II – Captura y envio por gmail o Telegram

Hace un tiempo vimos como configurar picamera en una raspberry pi zero. En esta ocasión vamos a tomar una foto para enviarla por email o por Telegram.

La verdad es que esta entrada se explica casi sola, ásí que vamos a instalar los paquetes python y al código.

Instalando picamera

Para el control de la Pi Camera utilizaremos el paquete picamera.

pip3 install picamera

Con esto tenemos lo necesario, mas sencillo imposible, viva Python! xD

Capturando fotos con picamera

El siguiente ejemplo captura una foto y la guarda como captura1.jpg.

Por comodidad incluimos el código de captura en una única función, capturephoto()

import time
import picamera

def capturephoto(imgname):
  with picamera.PiCamera() as camera:
  camera.resolution = (640, 480)
  camera.start_preview()
  camera.exif_tags['IFD0.Artist'] = 'Altaruru'
  camera.exif_tags['IFD0.Copyright'] = 'Copyright (c) 2019 Altaruru.com!'
  camera.exposure_compensation = 2
  time.sleep(2)
  camera.capture(imgname)
  camera.stop_preview()

capturephoto("captura1.jpg")

Enviando foto por email

Añadimos los include necesarios:

import smtplib
import os
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

Incluimos la función encargada del envio:

def send_gmailX(gmailsmtpsvr, gmailusr, gmailpwd, sdestino, asunto, texto, adjunto):
    mensaje = MIMEMultipart()
    mensaje["Subject"] = asunto
    mensaje["From"] = gmailusr
    mensaje["To"] = ', '.join(sdestino)

    textomensaje = MIMEText(texto)
    mensaje.attach(textomensaje)

    # adjuntamos el archivo:
    with open(adjunto, 'rb') as f:
        imagen = MIMEImage(f.read())

    imagen.add_header("Content-Disposition", "attachment", filename=os.path.basename(adjunto))
    mensaje.attach(imagen)

    mail = smtplib.SMTP_SSL(gmailsmtpsvr, 465)
    mail.login(gmailusr, gmailpwd)
    mail.sendmail(gmailusr, sdestino, mensaje.as_string())
    mail.quit()

Enviamos el email tras la captura de la foto:

capturephoto("captura1.jpg")
send_gmailX("smtp.gmail.com", "altaruru@gmail.com", "password", 
  ["emaildestino1@gmail.com", "emaildestino2@gmail.com"], "capturapicam - altaruru example", 
  "Ejemplo de envio por gmail de captura con picam. Siguenos en www.Altaruru.com ;-)", "captura1.jpg")

Si quieres conocer más detalles del envío de emails con gmail desde Python puedes ver la entrada: GMAIL desde Python, enviando emails

Envio de la captura por Telegram

Para enviar por Telegram necesitarás tener un bot.

La creación de un bot Telegram y una breve intro a su uso desde Python la vimos en Telegram-Como crear un bot y utilizarlo desde Python.

Con el bot ya configurado, incluimos los paquetes necesarios al inicio del código:

import telegram
bot = 0

Utilizaremos una variable global para el bot, la definimos al inicio, justo a continuación de los import, posteriormente en cada función la declararemos como global.

Declaramos las siguientes funciones:

def bot_connect():
	global bot
	bot_token = '819999999:AAA9Aa99aA99A9A9AA9a-9aaA9AAA99AAA9Aa'
	bot = telegram.Bot(token=bot_token)
	print(bot.get_me())

def bot_sendpicture(chatid, spathimg):
	bot.send_photo(chatid, photo=open(spathimg, 'rb'))

Debes reemplazar el TOKEN en bot_token = ‘…’ por el de tu bot.

Solo nos queda incluir la llamada para enviar la foto:

bot_connect()
bot_sendpicture('899999968','captura1.jpg')

El primér parámetro de la fx bot_sendpicture es el ID del Chat Destino.

Código completo de ejemplo

Dejo el código completo del ejemplo para que se vea más claro:

import time
import picamera

import smtplib
import os
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

import telegram

bot = 0

def capturephoto(imgname):
	with picamera.PiCamera() as camera:
		camera.resolution = (640, 480)
		camera.start_preview()
		camera.exif_tags['IFD0.Artist'] = 'Altaruru'
		camera.exif_tags['IFD0.Copyright'] = 'Copyright (c) 2019 Altaruru.com!'
		camera.exposure_compensation = 2
		time.sleep(2)
		camera.capture(imgname)
		camera.stop_preview()

def send_gmailX(gmailsmtpsvr, gmailusr, gmailpwd, sdestino, asunto, texto, adjunto):
    mensaje = MIMEMultipart()
    mensaje["Subject"] = asunto
    mensaje["From"] = gmailusr
    mensaje["To"] = ', '.join(sdestino)

    textomensaje = MIMEText(texto)
    mensaje.attach(textomensaje)

    # adjuntamos el archivo:
    with open(adjunto, 'rb') as f:
        imagen = MIMEImage(f.read())

    imagen.add_header("Content-Disposition", "attachment", filename=os.path.basename(adjunto))
    mensaje.attach(imagen)

    mail = smtplib.SMTP_SSL(gmailsmtpsvr, 465)
    mail.login(gmailusr, gmailpwd)
    mail.sendmail(gmailusr, sdestino, mensaje.as_string())
    mail.quit()		

def bot_connect():
	global bot
	bot_token = '819999999:AAA9Aa99aA99A9A9AA9a-9aaA9AAA99AAA9Aa'
	bot = telegram.Bot(token=bot_token)
	print(bot.get_me())

def bot_sendpicture(chatid, spathimg):
	bot.send_photo(chatid, photo=open(spathimg, 'rb'))

capturephoto("captura1.jpg")
send_gmailX("smtp.gmail.com", "altaruru@gmail.com", "password", 
  ["emaildestino1@gmail.com", "emaildestino2@gmail.com"], "capturapicam - altaruru example", 
  "Ejemplo de envio por gmail de captura con picam. Siguenos en www.Altaruru.com ;-)", "captura1.jpg")
bot_connect()
bot_sendpicture('899999968','captura1.jpg')

Eso es todo por hoy. Cualquier duda, sugerencia o comentarios ya sabeis.

Feliz código!!, Altaruru

Deja un comentario

Tu dirección de correo electrónico no será publicada.