WebPush发布库
项目描述
Python的Webpush数据加密库
此库在 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的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 03ccc3e975b60374b7634c495595616be523bf2c7da0d976e84fda9ac8c63301 |
|
MD5 | 6c528ee7d284c90c0c4459dfaa7a59a6 |
|
BLAKE2b-256 | a4ba79f4e52db8ab4d885712cb9a4b25bb036a90220e7d53b85ad6ebe6eb60d3 |