どうもこんにちは
Firebase Cloud MessagingをAPIからキックしてみよう、というお話です。
本当はLaravelで何とかしたかったのですが、
いかんせんFirebase Admin SDKのPHP版がない!?いや、あるんだけど公式ではない(ゴニョゴニョ・・・
ということで、さっくりLaravelはあきらめて、今回はDjangoです。
コチラのサイトを参考にさせていただきました。
Django REST Framework で Firebase Cloud Messaging (FCM) のメッセージ送信 API を実装する
https://leben.mobi/blog/fcm_api/python/
今回の環境は、こんな感じです。
・Windows 7
・Python 3.6
・Django 2.1.7
・Firebase のプロジェクトは作成済み
では、始めます。
目次
Django REST Framework のインストール
Django で RESTFulなAPIといえば、これ一択ですよね。
偉そうなこと言うてますが、初めて使います。
ともあれ、pipでインストールです。
Virtualenvなときは、activateするのを忘れずに。
1 |
pip install djangorestframework |
ご参考までに、
Django REST Framework(以下、DRF)とは、RESTFulなAPIをいとも簡単に実装できてしまう
パワフルなFrameworkです。もちろん、Web画面とも共存できます。
公式ドキュメントはコチラ ⇒ Home – Django REST framework
種々解説サイトはあるのですが、個人的に一番わかりよいのはコチラ ⇒ Django REST Frameworkを使って爆速でAPIを実装する
Firebase Admin SDK をインストール
こちらもpipでインストールです。
1 |
pip install firebase-admin |
ちなみに、Firebaseとは?
Googleが提供しているmBaaS(mobile Backend as a Service)です。
Cloud Messagingのほかに、SNS認証やNoSQLなDatabaseなど、モバイルアプリを作るのに
必要そうな機能を一つにまとめたサービスです。
こういうのを駆使して、いわゆるサーバレスアーキテクチャが成立してるのかー
時代は進んだなー(遠い目)と思わせるシロモノです。
Firebase で秘密鍵をダウンロード
プロジェクトから、秘密鍵をダウンロードします。
すでにダウンロード済みの場合はそれを使えばよいのですが、今回は新規なので、作ります。
プロジェクトの設定 > サービスアカウントを選択します。
「新しい秘密鍵の生成」ボタンをクリックして、ダウンロードします。
ダウンロードしたら、Djangoプロジェクトの中に保存します。
実装!
それでは実装に入ります。
なお、今回はapiという名前のアプリケーションを作りました。
プロジェクト名は、prjです。
prj/setting.py
アプリケーションとDRF、Firebase秘密鍵のパスを記入します。
1 2 3 4 5 6 7 8 9 |
: INSTALLED_APPS = [ : 'api.apps.ApiConfig', 'rest_framework', : ] FIREBASE_CERTIFICATE = 'path/to/certificate.json' : |
必要に応じて、他も編集しておきましょう。
api/serializer.py
Serializerとは、DRFで扱うデータ入出力用のインターフェース、
DjangoでいうFormみたいなもの?という認識です(間違ってたらスミマセン)。
ちゃんとした解説は、いつも公式ドキュメントに頼ります。 ⇒ Serializers – Django REST Framework
今回は、token, title, bodyを受け付けるようにします、
1 2 3 4 5 6 7 |
from rest_framework import serializers class MessagingSerializer(serializers.Serializer): token = serializers.CharField() title = serializers.CharField() body = serializers.CharField() |
ちなみに、ここでのtokenは、公式ドキュメントによると
「エンドユーザー クライアント アプリのインスタンスごとにクライアント FCM SDK によって生成される文字列です。」
だそうです。FCM SDKについては、説明を割愛します。
今回は、ただリクエストから受け付けるのみです。
api/views.py
ViewSetクラスを継承して、apiの実装を行います。
Firebaseのドキュメントにしたがって、こんな感じにしています。
公式ドキュメントはコチラ ⇒ メッセージを送信する | Firebase
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import firebase_admin from firebase_admin import messaging, credentials from django.conf import settings from rest_framework import viewsets, status from rest_framework.parsers import JSONParser from rest_framework.response import Response from api.serializers import MessagingSerializer def initialize_firebase_admin_sdk(): cred = credentials.Certificate(settings.FIREBASE_CERTIFICATE) firebase_admin.initialize_app(cred) class MessagingViewSet(viewsets.ViewSet): parser_classes = (JSONParser,) def create(self, request): params = MessagingSerializer(data=request.data) if params.is_valid(): initialize_firebase_admin_sdk() firebase_admin.get_app() notification = messaging.Notification( title=params.title, body=params.body, ) apns = messaging.APNSConfig( payload=messaging.APNSPayload( aps=messaging.aps( ) ) ) token = params.token message = messaging.Message( notification=notification, apns=apns, token=token, ) messaging.send(message) return Response(params.data, status=status.HTTP_200_OK) else: return Response(params.errors, status=status.HTTP_400_BAD_REQUEST) |
ViewSetクラスにはいくつかアクションが定義されています。
公式ドキュメントはコチラ ⇒ ViewSets – Django REST Framework
endpoint | HTTPメソッド | アクション名 |
リソース名 | GET | list |
リソース名 | POST | create |
リソース名/id/ | GET | detail |
リソース名/id/ | POST | update |
リソース名/id/ | PUT | update_partial |
リソース名/id/ | DELETE | delete |
いったんidなしのPOSTでアクセスする想定なので、createで実装しました。
prj/url.py
ルーティングの設定をします。
本来なら、api/urls.pyを作ってそちらに・・・
としたいところですが、今回はプロジェクト直下のurls.pyに入れてしまいます。
1 2 3 4 5 6 7 8 9 10 11 |
from django.urls import path, include from rest_framework import routers from api.views import MessagingViewSet router = routers.DefaultRouter() router.register('messaging', MessagingViewSet, 'messaging') urlpatterns = [ path('api/', include(router.urls)) ] |
ここまでで、必要な実装はおしまいです。
送信してみる
さて、サーバを起動しましょう。
1 |
python manage.py runserver |
で、下記のURLにアクセスします。
http://localhost:8000/api/messaging
と、こんな画面が出ます。
あとはcontent:にJSON文字列を書いて、POSTすればテストできます。
# いやぁ、世の中便利になったもんだ。
あとがき
意外とさっくり実装までできました。
views.pyの送信部分をandroidに対応したり、Webに対応したり。
topicsの作成、削除を実装したり。
これをベースに、FCM用APIがすぐ作れそうです。
R.TANAKAがお届けしました。