Enviar notificaciones PUSH a Google API de Firebase Cloud Messaging (V1) usando Python

Tiempo de lectura: 3 minutos

Hoy vamos a aprender cómo podemos enviar un mensaje al endpoint de Firebase Cloud Messaging usando Python. (https://firebase.google.com/docs/cloud-messaging/http-server-ref?hl=es-419)

Para ello necesitamos el endpoint de Google:

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send

Y previamente tenemos que generar un token en nuestra aplicación, para ello vamos a Firebase, seleccionamos nuestro proyecto y pulsamos en Configuración del Proyecto:

Aquí dentro buscamos Cloud Messaging

Ahora vamos a la seccion de API de Firebase Cloud Messaging (V1)

Pulsamos en Administrar cuentas de servicio.

Vamos a nuestra cuenta y pulsamos en el menú contextual de 3 puntitos:

y elegimos Adminsitrar claves:

Ahora pulsamos en Agregar Clave > Crear clave nueva:

Elegimos tipo JSON y pulsamos en crear:

Guardamos este JSON en la raíz del proyecto y creamos un archivo llamado send_push.py

-app.json
-send_push.py

Ahora vamos a crear el código send_push.py

import json
import requests
import jwt
from datetime import datetime, timedelta

JSON_DIR = "app.json"

def enviar_mensaje_cloud(titulo_enviar, mensaje_enviar, token_enviar):
    access_token = get_access_token()
    project_id = get_data_json()["project_id"]

    url = f'https://fcm.googleapis.com/v1/projects/{project_id}/messages:send'

    data = {
        'message': {
            'token': token_enviar,
            'notification': {
                'title': titulo_enviar,
                'body': mensaje_enviar,
            },
            'data': {
                'key_1': 'Value for key_1',
                'key_2': 'Value for key_2',
            },
        },
    }

    headers = {
        'Content-type': 'application/json',
        'Authorization': 'Bearer ' + access_token,
    }

    response = requests.post(url, json=data, headers=headers)

    # Manejar la respuesta según tus necesidades
    # Puedes imprimir el resultado para depuración
    print(response.text)

def get_access_token():
    
    private_key = get_data_json()["private_key"]  # Reemplaza con tu clave privada
    cliend_id = get_data_json()["client_id"]  # Reemplaza con tu dirección de correo electrónico del cliente

    now = datetime.utcnow()
    expiration_time = now + timedelta(hours=1)

    jwt_payload = {
        'iss': cliend_id,
        'scope': 'https://www.googleapis.com/auth/firebase.messaging',
        'aud': 'https://www.googleapis.com/oauth2/v4/token',
        'exp': expiration_time,
        'iat': now,
    }

    encoded_jwt = jwt.encode(jwt_payload, private_key, algorithm='RS256')

    data = {
        'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer',
        'assertion': encoded_jwt,
    }

    response = requests.post('https://www.googleapis.com/oauth2/v4/token', data=data)
    response_data = response.json()
    return response_data['access_token']

def get_data_json():
    with open(JSON_DIR) as json_file:
        data = json.load(json_file)
        return data

Deberás cambiar JSON_DIR = «app.json» por la ruta de tu json.

Además hay que instalar jwt:

 pip install PyJWT

Para enviar un mensaje podrás usar lo siguiente:

enviar_mensaje_cloud('Título del mensaje', 'Cuerpo del mensaje', 'token_del_dispositivo')

Para ‘token_del_dispositivo’, tendrás que usar un Token de dispositivo válido aquí te explico cómo puedes obtenerlo: https://devcodelight.com/?p=7128

Deja un comentario