返回

无需凭据订阅 Firebase 项目事件:公共事件流指南

python

如何在无需凭据的情况下订阅 Firebase 项目事件

引言

在构建分布式系统时,监控和及时响应事件至关重要。Firebase 提供了一种强大的事件系统,但前提是必须通过身份验证。对于没有登录凭据的情况,例如监控公共事件或在没有用户交互的情况下自动处理任务,本文提供了一种替代方法。本文将探讨如何使用公共事件流在无需凭据的情况下订阅 Firebase 项目事件。

公共事件流:无需身份验证的 Firebase 订阅

公共事件流是 Firebase 提供的一种公开事件集合,无需身份验证即可访问。这使得订阅公开事件成为可能,例如:

  • 文档创建、更新或删除
  • 集合中的查询结果变更
  • 用户身份验证状态变更

步骤:

1. 获取公共事件流 URL

事件流 URL 如下所示:

https://firestore.googleapis.com/v1/projects/{project_id}/databases/(default)/documents

{project_id} 替换为您的 Firebase 项目 ID。

2. 创建请求正文

{
  "addTarget": {
    "query": {
      "all": true
    }
  }
}

此请求正文指定订阅所有文档事件。

3. 发送请求并获取订阅

使用 HTTP POST 请求发送请求并获取订阅 ID:

response = requests.post(event_stream_url, json=request_body)
if response.status_code == 200:
    subscription_id = response.headers["Location"].split("/")[-1]
    print("Subscription created: ", subscription_id)
else:
    raise Exception("Error creating subscription")

4. 处理事件流

使用 WebSocket 处理事件流:

def on_message(ws, message):
    print("Received message: ", message)

def on_error(ws, error):
    print("Received error: ", error)

def on_close(ws):
    print("Closed websocket")

websocket.enableTrace(True)
ws = websocket.WebSocketApp(f"{event_stream_url}/listen?subscription={subscription_id}",
                            on_message=on_message,
                            on_error=on_error,
                            on_close=on_close)
ws.run_forever()

示例代码

import requests
import websocket

def main():
    # Get project ID
    project_id = input("Enter Firebase project ID: ")

    # Get public event stream URL
    event_stream_url = f"https://firestore.googleapis.com/v1/projects/{project_id}/databases/(default)/documents"

    # Create request body
    request_body = {"addTarget": {"query": {"all": True}}}

    # Send request and get subscription
    response = requests.post(event_stream_url, json=request_body)
    if response.status_code == 200:
        subscription_id = response.headers["Location"].split("/")[-1]
        print("Subscription created: ", subscription_id)
    else:
        raise Exception("Error creating subscription")

    # Handle event stream
    def on_message(ws, message):
        print("Received message: ", message)

    def on_error(ws, error):
        print("Received error: ", error)

    def on_close(ws):
        print("Closed websocket")

    websocket.enableTrace(True)
    ws = websocket.WebSocketApp(f"{event_stream_url}/listen?subscription={subscription_id}",
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close)
    ws.run_forever()

if __name__ == "__main__":
    main()

注意事项:

  • 公共事件流仅限于公开事件。
  • 公共事件流可能受速率限制。
  • 确保 Firebase 项目启用了公共事件流。

结论

本指南提供了一种无需凭据即可订阅 Firebase 项目事件的方法。使用公共事件流可以监控公开事件,并构建无状态的应用程序来处理它们。这种方法非常适合需要在没有用户交互的情况下自动执行任务的场景。

常见问题解答

  1. 什么是公共事件流?
    公共事件流是 Firebase 提供的无需身份验证即可访问的公开事件集合。
  2. 如何订阅公共事件流?
    通过发送 POST 请求并使用 WebSocket 处理响应流。
  3. 有哪些限制?
    公共事件流仅限于公开事件,并可能受速率限制。
  4. 有什么用途?
    监控公开事件,并构建无状态应用程序来自动处理任务。
  5. 需要身份验证吗?
    不,公共事件流无需身份验证。