Created
December 30, 2020 14:20
-
-
Save felipeandradebezerra/57358345e521a4879fa7f69bf88e4db6 to your computer and use it in GitHub Desktop.
Disparo de mensagem push para o Firebase FCM
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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