Skip to content

Instantly share code, notes, and snippets.

@felipeandradebezerra
Created December 30, 2020 14:20
Show Gist options
  • Save felipeandradebezerra/57358345e521a4879fa7f69bf88e4db6 to your computer and use it in GitHub Desktop.
Save felipeandradebezerra/57358345e521a4879fa7f69bf88e4db6 to your computer and use it in GitHub Desktop.
Disparo de mensagem push para o Firebase FCM
# -*- 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment