Dễ dàng sử dụng API FCM V1 trong Python

Dec 05 2022
Nè mọi người. Như bạn đã biết, khi tạo một dự án fcm mới, bạn không thể sử dụng API kế thừa.

Nè mọi người. Như bạn đã biết, khi tạo một dự án fcm mới, bạn không thể sử dụng API kế thừa. Bạn chỉ phải sử dụng API V1. Và nó không có tài liệu chi tiết hoặc bài viết trong bài viết để thiết lập điều này một cách ngắn gọn và thuận tiện. Nên sau khi loay hoay mãi cũng xong project với API mới này, mình quyết định không dùng SDK vì nó đang dùng phiên bản JWT mà project của mình không chấp nhận. Vì vậy, từ bây giờ, chúng tôi sẽ tiếp tục với chính API theo cách thô sơ.

Nhận tệp cấu hình

Sau khi tạo Dự án FCM, hãy chuyển đến cài đặt Dự án và chọn Tài khoản dịch vụ, sau đó tạo cặp khóa mới và lưu trữ trong nền tảng của bạn.

Sau khi tải xuống tệp JSON, bạn có thể sao chép và lưu trữ tệp đó trong môi trường của mình, chẳng hạn như Vault. Sau đó, sử dụng nó để xác thực và nhận mã thông báo truy cập từ FCM API. Bạn nhận được mã thông báo truy cập trong mã.

creds   = {} # Your credentials dict that you installed above
scopes  = ['https://www.googleapis.com/auth/firebase.messaging']
cred_service = ServiceAccountCredentials.from_json_keyfile_dict(creds, scopes)
access_token = cred_service.get_access_token().access_token

headers = {
        'access_token_auth':'true',
        'Authorization':f'Bearer {access_token}'
    }
# For subscribing to topic

response = requests.post('https://iid.googleapis.com/iid/v1:batchAdd',headers=headers,
    json={
        "to":f"/topics/your_topic",
        "registration_tokens":[user_fcm_token]
    }
)

# For unsubscribing from topic

response = requests.post('https://iid.googleapis.com/iid/v1:batchRemove',headers=headers,
      json={
          "to":f"/topics/your_topic",
          "registration_tokens":[user_fcm_token]
      }
  )

# project_id is in credentials file you have downloaded

base_url = f'https://fcm.googleapis.com/v1/projects/{project_id}/messages:send'
headers = {'Authorization': 'Bearer ' + access_token}
data = {
    "message": {
        "topic": f'user_push_{topic}',
        "notification": {
            "title": title,
            "body": description
        },
        "webpush": {
        "fcm_options": {
            "link": url
            }
        },
        "data": {}
        }
}
resp = requests.post(base_url, json=data, headers=headers)