Ошибка отправки HTTP v1 в облачной службе Firebase - 400 Ошибка клиента: Неверный запрос URL: https://fcm.googleapis.com/v1/projects/ / Сообщений: отправить - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь использовать облачный обмен сообщениями Firebase HTTP v1

Вот код Python, который работает под Windows

import json
import requests
from google.oauth2.service_account import Credentials
import google.auth.transport.requests

def _get_access_token():
    credentials = Credentials.from_service_account_file(
        'C:/yocto/wenote-notification/send_notification/wenote-206215-firebase-adminsdk-9fpls-a3fdd2934c.json',
        scopes=['https://www.googleapis.com/auth/firebase.messaging']
    )

    request = google.auth.transport.requests.Request()

    credentials.refresh(request)

    access_token = credentials.token

    return access_token

def generate_header():
    return {'Authorization' : 'Bearer ' + _get_access_token(), 'Content-type' : 'application/json'}


# Header    
headers = generate_header()
print(headers)


# Data
string = '{"message":{"token": "cSW75-6OF-w:APA91bE-E6vWucBe8rRijpDLlZGHhyfwoaLJr3R1TZEvieBM-__ZXwXlBS34kUticUN_eSbwvQGTymbmtd7sHT5U9O_v9HePyVn7jnUD9IBdoZZYSQ1CrgxXS1sz9wjAd5pKHIddoKj8", "data": {"sync": false, "sync_device_count": 2}, "fcm_options": {"analytics_label": "wenote_analytics_label"}}}'
request_data = json.loads(string)
print(request_data)


r = requests.post('https://fcm.googleapis.com/v1/projects/wenote-206215/messages:send', headers=headers, json=request_data)

if r.status_code != 200:
    r.raise_for_status()

Сообщение, которое я отправляю на сервер Firebase,

{
   "message":{
      "token":"cSW75-6OF-w:APA91bE-E6vWucBe8rRijpDLlZGHhyfwoaLJr3R1TZEvieBM-__ZXwXlBS34kUticUN_eSbwvQGTymbmtd7sHT5U9O_v9HePyVn7jnUD9IBdoZZYSQ1CrgxXS1sz9wjAd5pKHIddoKj8",
      "data":{
         "sync":false,
         "sync_device_count":2
      },
      "fcm_options":{
         "analytics_label":"wenote_analytics_label"
      }
   }
}

Однако я получаю следующую ошибку

c:\yocto\wenote-notification\send_notification>python a.py
{'Authorization': 'Bearer ya29.c.Ko8BvQdCd-8US-DzQ-AcuTOURlGTQEvJt4mtofaeM08LRIhXBfC4RFN3QzkAcCdnaqI6uJLQlk1YJg67KQOhF8CtNux9t743nq2NN9uoW2mbQiB2y_2fjRUhiIIM7Wz2nt9rDOM4zFIFwKlHtLPXRLa4IGo0Ho-dq8zzVxQH1qPNGqy_ja8WowQCY5ReAQkmAmE', 'Content-type': 'application/json'}
{'message': {'token': 'cSW75-6OF-w:APA91bE-E6vWucBe8rRijpDLlZGHhyfwoaLJr3R1TZEvieBM-__ZXwXlBS34kUticUN_eSbwvQGTymbmtd7sHT5U9O_v9HePyVn7jnUD9IBdoZZYSQ1CrgxXS1sz9wjAd5pKHIddoKj8', 'data': {'sync': False, 'sync_device_count': 2}, 'fcm_options': {'analytics_label': 'wenote_analytics_label'}}}
Traceback (most recent call last):
  File "a.py", line 38, in <module>
    r.raise_for_status()
  File "C:\Python36\lib\site-packages\requests\models.py", line 940, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://fcm.googleapis.com/v1/projects/wenote-206215/messages:send

Есть идеи, почему это так, и как я могу решить эту проблему?

У меня есть проверка моя консоль обмена сообщениями в облаке Firebase. Это включено.

enter image description here

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Вам нужно немного адаптировать свой объект request_data, потому что схема изменилась.

До (устаревший протокол http):

{
  "to": "/topics/news",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available."
  },
  "data": {
    "story_id": "story_12345"
  }
}

После (HTTP v1 API):

{
  "message": {
    "topic": "news",
    "notification": {
      "title": "Breaking News",
      "body": "New news story available."
    },
    "data": {
      "story_id": "story_12345"
    }
  }
}

Обратите внимание на изменение параметров topi c, так как хорошо обернуть объектом сообщения.

Ознакомьтесь с этим руководством: https://firebase.google.com/docs/cloud-messaging/migrate-v1

Вы можете проверить этот очень чистый и структурированный минимальный пример python для FCM: https://github.com/firebase/quickstart-python/blob/688fcfa8068dcac67978a171df828c9e77cd320e/messaging/messaging.py#L57

0 голосов
/ 12 февраля 2020

Это способ устранения вышеуказанной проблемы.

Используйте

if r.status_code != 200:
    print(r.text)
    r.raise_for_status()

вместо

if r.status_code != 200:
    r.raise_for_status()

Мы получим следующую ошибку

{
  "error": {
    "code": 400,
    "message": "Invalid value at 'message.data[0].value' (TYPE_STRING), false\nInvalid value at 'message.data[1].value' (TYPE_STRING), 2",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.BadRequest",
        "fieldViolations": [
          {
            "field": "message.data[0].value",
            "description": "Invalid value at 'message.data[0].value' (TYPE_STRING), false"
          },
          {
            "field": "message.data[1].value",
            "description": "Invalid value at 'message.data[1].value' (TYPE_STRING), 2"
          }
        ]
      }
    ]
  }
}

Похоже, HTTP v1 довольно строг в отношении типа значения (это должна быть строка)

Следовательно, вместо использования

string = '{"message":{"token": "cSW75-6OF-w:APA91bE-E6vWucBe8rRijpDLlZGHhyfwoaLJr3R1TZEvieBM-__ZXwXlBS34kUticUN_eSbwvQGTymbmtd7sHT5U9O_v9HePyVn7jnUD9IBdoZZYSQ1CrgxXS1sz9wjAd5pKHIddoKj8", "data": {"sync": false, "sync_device_count": 2}, "fcm_options": {"analytics_label": "wenote_analytics_label"}}}'

Нам нужно использовать

string = '{"message":{"token": "cSW75-6OF-w:APA91bE-E6vWucBe8rRijpDLlZGHhyfwoaLJr3R1TZEvieBM-__ZXwXlBS34kUticUN_eSbwvQGTymbmtd7sHT5U9O_v9HePyVn7jnUD9IBdoZZYSQ1CrgxXS1sz9wjAd5pKHIddoKj8", "data": {"sync": "false", "sync_device_count": "2"}, "fcm_options": {"analytics_label": "wenote_analytics_label"}}}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...