跳转到主要内容

WebPush发布库

项目描述

Python的Webpush数据加密库

Build Status Requirements Status

此库在 pypi 上可用,名称为 pywebpush。源代码可在 github 上找到。请注意:PyPi已将此库指定为 关键项目,目前由 单人 维护。我仍然接受PR和问题报告,但请自行判断。

安装

要在本地使用此仓库,您需要运行 python -m venv venv。然后 venv/bin/pip install --editable .

用法

在浏览器中,registration.pushManager.subscribe() 的承诺处理程序返回一个 PushSubscription 对象。此对象具有一个 .toJSON() 方法,该方法将返回一个包含所有我们需要加密和推送数据的JSON对象的JSON对象。

例如,一个 subscription_info 对象可能看起来像

{
  "endpoint": "https://updates.push.services.mozilla.com/push/v1/gAA...",
  "keys": { "auth": "k8J...", "p256dh": "BOr..." }
}

如何将 PushSubscription 数据发送到您的后端,将其存储为请求者的引用,并在有新的推送订阅更新时调用它,留作读者的练习。

使用 webpush() 发送数据一次调用

在许多情况下,您的代码将向多个接收者发送单个消息。有一个“一次调用”函数可以使事情变得更简单。

from pywebpush import webpush

webpush(subscription_info,
        data,
        vapid_private_key="Private Key or File Path[1]",
        vapid_claims={"sub": "mailto:YourEmailAddress"})

这将编码 data,如果需要,添加适当的 VAPID 认证头,并将其发送到 subscription_info 块中指定的推送服务器。

参数

subscription_info - 订阅信息的 dict(如上所述)。

data - 可以是任何序列化内容(字符串、位数组、序列化 JSON 等),但请确保您的接收应用程序能够解析和理解它。(例如 data = "Mary had a little lamb."

content_type - 指定要使用的加密形式,可以是 'aes128gcm' 或已弃用的 'aesgcm'。请注意,并非所有用户代理都能解密 'aesgcm',因此库默认使用 RFC 8188 标准形式。

vapid_claims - 包含用于授权所需的 VAPID 声明的 dict(有关更多详细信息,请参阅 py_vapid)。如果未指定 aud,pywebpush 将尝试从 endpoint 自动填充。如果未指定 exp 或设置为过去的日期,它将被设置为现在 12 小时之后。在这两种情况下,调用后传递的 dict 将被 修改

vapid_private_key - VAPID EC2 私钥 PEM 文件的路径,或包含 DER 表示的字符串。(有关更多详细信息,请参阅 py_vapid)。私钥可以是 base64 编码的 DER 格式的私钥,或 OpenSSL 导出的私钥文件的路径。

例如:

openssl ecparam -name prime256v1 -genkey -noout -out private_key.pem
示例
from pywebpush import webpush, WebPushException

try:
    webpush(
        subscription_info={
            "endpoint": "https://push.example.com/v1/12345",
            "keys": {
                "p256dh": "0123abcde...",
                "auth": "abc123..."
            }},
        data="Mary had a little lamb, with a nice mint jelly",
        vapid_private_key="path/to/vapid_private.pem",
        vapid_claims={
                "sub": "mailto:YourNameHere@example.org",
            }
    )
except WebPushException as ex:
    print("I'm sorry, Dave, but I can't do that: {}", repr(ex))
    # Mozilla returns additional information in the body of the response.
    if ex.response and ex.response.json():
        extra = ex.response.json()
        print("Remote service replied with a {}:{}, {}",
              extra.code,
              extra.errno,
              extra.message
              )

方法

如果您预计需要向同一接收者重发,或者需要比快速发送数据更多的功能,您只需传递 wp = WebPusher(subscription_info)。这将返回一个 WebPusher 对象。

以下方法可用

.send(data, headers={}, ttl=0, gcm_key="", reg_id="", content_encoding="aes128gcm", curl=False, timeout=None)

使用附加参数发送数据。出错时返回 WebPushException

参数

data - 要发送的二进制字符串数据

headers - 包含要发送的任何附加头的 dict

ttl - 消息在推送服务器上等待客户端重新连接的时间(以秒为单位)

gcm_key - 如果使用较旧的 GCM 推送系统,则为 Google Cloud Messaging 密钥。这是从 Google 开发者控制台获得的 API 密钥。

reg_id - Google Cloud Messaging 注册 ID(如果未指定,将从端点提取)

content_encoding - ECE 内容编码类型(默认为 "aes128gcm")

curl - 不执行 POST,而是返回为 curl 命令。这将加密内容并将其写入名为 encrypted.data 的本地文件。此命令主要用于调试目的。

timeout - POST 请求的超时时间。请参阅 requests 文档

示例

从 Chrome 使用旧的 GCM 模式发送:

WebPusher(subscription_info).send(data, headers, ttl, gcm_key)

.encode(data, content_encoding="aes128gcm")

data 进行编码以供将来使用。出错时返回 WebPushException

参数

data - 要发送的二进制字符串数据

content_encoding - ECE 内容编码类型(默认为 "aes128gcm")

注意 如果数据不存在或为空,将返回 NoData 异常。发送没有数据的 WebPush 通知是完全有效的,但在那种情况下编码是无操作的。如果没有数据,最好不要调用它。

示例
encoded_data = WebPush(subscription_info).encode(data)

独立 Webpush

如果您不是非常想编写自己的解决方案,./bin 目录中还有一个 "独立" 的 pywebpush 命令。

这使用了两个文件:

  • 包含要发送的消息的 data 文件,其形式可以是您喜欢的任何形式。
  • 包含订阅信息的 subscription info 文件,该文件包含以 JSON 编码的数据。这通常由 Push subscribe 方法返回,看起来像这样:
{
  "endpoint": "https://push...",
  "keys": {
    "auth": "ab01...",
    "p256dh": "aa02..."
  }
}

如果您只是对测试应用程序的 WebPush 接口感兴趣,您可以使用命令行:

./bin/pywebpush --data stuff_to_send.data --info subscription.info

它将加密并发送 stuff_to_send.data 的内容。

有关可用命令和选项,请参阅 ./bin/pywebpush --help

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

pywebpush-2.0.0.tar.gz (33.8 kB 查看哈希)

上传时间

支持