Skip to content

Instantly share code, notes, and snippets.

@felipeandradebezerra
Created December 30, 2020 14:20
Show Gist options
  • Select an option

  • Save felipeandradebezerra/57358345e521a4879fa7f69bf88e4db6 to your computer and use it in GitHub Desktop.

Select an option

Save felipeandradebezerra/57358345e521a4879fa7f69bf88e4db6 to your computer and use it in GitHub Desktop.

Revisions

  1. felipeandradebezerra created this gist Dec 30, 2020.
    115 changes: 115 additions & 0 deletions fcm.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,115 @@
    # -*- coding: utf-8 -*-
    """
    Notificações através do Firebase Cloud Messaging (FCM)
    Firebase Cloud Messaging (FCM) é utilizado para disparo de
    mensagens push para dispositivos iOS, Android e Web.
    Esse classe dispara três tipos de mensagens:
    - Para Tópicos ou Canais
    - Para uma plataforma específica
    - Para um cliente específico
    """

    import argparse
    import json
    import requests

    from oauth2client.service_account import ServiceAccountCredentials

    class FCM(object):

    BASE_URL = 'https://fcm.googleapis.com'
    SCOPES = ['https://www.googleapis.com/auth/firebase.messaging']

    def __init__(self, projectId, keyFileName):
    self.PROJECT_ID = projectId
    self.KEY_FILE_NAME = keyFileName
    self.FCM_ENDPOINT = 'v1/projects/' + self.PROJECT_ID + '/messages:send'
    self.FCM_URL = self.BASE_URL + '/' + self.FCM_ENDPOINT

    ##
    # Retrieve a valid access token that can be used to authorize requests.
    # :return: Access token.
    def get_access_token(self):
    credentials = ServiceAccountCredentials.from_json_keyfile_name(self.KEY_FILE_NAME, self.SCOPES)
    access_token_info = credentials.get_access_token()
    print access_token_info.access_token
    return access_token_info.access_token

    ##
    # Envia uma requisição HTTP para o FCM
    # Args:
    # fcm_message: o objeto JSON com o corpo da requisiçào
    def send_message(self, fcm_message):
    headers = {
    'Authorization': 'Bearer ' + self.get_access_token(),
    'Content-Type': 'application/json; UTF-8',
    }
    resp = requests.post(self.FCM_URL, data=json.dumps(fcm_message), headers=headers)
    if resp.status_code == 200:
    return (True, resp.text)
    else:
    return (False, resp.text)

    ##
    # Notificação push para um dispositivo
    def build_token_message(self, title, body, token):
    return {
    'message': {
    'token': token,
    'notification': {
    'title': title,
    'body': body
    }
    }
    }

    ##
    # Notificação push para um tópico
    def build_topic_message(self, title, body, topic):
    return {
    'message': {
    'topic': topic,
    'notification': {
    'title': title,
    'body': body
    }
    }
    }

    ##
    # Customiza a mensagem
    def override_message(self, fcm_message):
    apns_override = {
    'payload': {
    'aps': {
    'badge': 1
    }
    },
    'headers': {
    'apns-priority': '10'
    }
    }
    android_override = {
    'notification': {
    'click_action': 'android.intent.action.MAIN'
    }
    }
    fcm_message['message']['android'] = android_override
    fcm_message['message']['apns'] = apns_override
    return fcm_message

    # token do dispositio
    device_token = 'cibEZ...'
    topic = "novidades"

    fcm = FCM('ID_DO_PROJETO', 'SERVICE_ACCOUNT_KEY.JSON')
    device_message = fcm.override_message(fcm.build_token_message('TITULO', 'Mensagem push para dispositivo', device_token))
    result, message = fcm.send_message(device_message)
    print result, message

    # Envia mensagem para o tópico
    topic_message = fcm.override_message(fcm.build_topic_message('TITULO', 'Mensagem push para tópico: ' + topic, topic))
    result, message = fcm.send_message(topic_message)
    print result, message