notify-bridge


Namenotify-bridge JSON
Version 0.2.0 PyPI version JSON
download
home_pageNone
SummaryA bridge for sending notifications to various platforms
upload_time2025-01-12 14:50:25
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT License Copyright (c) 2024 Long Hao Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords notification bridge feishu dingtalk wechat
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage
            # notify-bridge
A flexible notification bridge for sending messages to various platforms.

<div align="center">

[![Python Version](https://img.shields.io/pypi/pyversions/notify-bridge)](https://img.shields.io/pypi/pyversions/notify-bridge)
[![Nox](https://img.shields.io/badge/%F0%9F%A6%8A-Nox-D85E00.svg)](https://github.com/wntrblm/nox)
[![PyPI Version](https://img.shields.io/pypi/v/notify-bridge?color=green)](https://pypi.org/project/notify-bridge/)
[![Downloads](https://static.pepy.tech/badge/notify-bridge)](https://pepy.tech/project/notify-bridge)
[![Downloads](https://static.pepy.tech/badge/notify-bridge/month)](https://pepy.tech/project/notify-bridge)
[![Downloads](https://static.pepy.tech/badge/notify-bridge/week)](https://pepy.tech/project/notify-bridge)
[![License](https://img.shields.io/pypi/l/notify-bridge)](https://pypi.org/project/notify-bridge/)
[![PyPI Format](https://img.shields.io/pypi/format/notify-bridge)](https://pypi.org/project/notify-bridge/)
[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/loonghao/notify-bridge/graphs/commit-activity)
![Codecov](https://img.shields.io/codecov/c/github/loonghao/notify-bridge)
</div>

一个灵活的通知桥接器,用于向各种平台发送消息。

## 特性

- 🚀 简单直观的 API
- 🔌 插件系统,方便扩展
- 🔄 同时支持同步和异步操作
- 🛡️ 使用 Pydantic 模型进行类型安全验证
- 📝 丰富的消息格式(文本、Markdown 等)
- 🌐 支持多个平台

## 安装

```bash
pip install notify-bridge
```

## 快速开始

```python
from notify_bridge import NotifyBridge

# 创建桥接器实例
bridge = NotifyBridge()

# 同步发送通知
response = bridge.send(
    "feishu",
    webhook_url="YOUR_WEBHOOK_URL",
    title="测试消息",
    content="来自 notify-bridge 的问候!",
    msg_type="text"
)
print(response)


# 异步发送通知
async def send_async():
    response = await bridge.notify_async(
        "feishu",
        webhook_url="YOUR_WEBHOOK_URL",
        title="异步测试消息",
        content="# 来自 notify-bridge 的问候!\n\n这是一条 **Markdown** 消息。",
        msg_type="post"
    )
    print(response)
```

## 支持的平台

- [x] 飞书 (Feishu)
- [x] 企业微信 (WeCom)
- [ ] 钉钉 (DingTalk)
- [ ] 电子邮件 (Email)
- [ ] Slack
- [ ] Discord

## 使用示例

### 飞书 (Feishu)

```python
# 发送文本消息
bridge.send(
    "feishu",
    webhook_url="YOUR_WEBHOOK_URL",
    content="这是一条文本消息",
    msg_type="text"
)

# 发送富文本消息
bridge.send(
    "feishu",
    webhook_url="YOUR_WEBHOOK_URL",
    title="消息标题",
    content="这是一条富文本消息的内容",
    msg_type="post"
)

# 发送图片消息
bridge.send(
    "feishu",
    webhook_url="YOUR_WEBHOOK_URL",
    image_path="path/to/image.jpg",  # 或者使用 image_key
    msg_type="image"
)

# 发送文件消息
bridge.send(
    "feishu",
    webhook_url="YOUR_WEBHOOK_URL",
    file_path="path/to/document.pdf",  # 或者使用 file_key
    msg_type="file"
)
```

### 企业微信 (WeCom)

```python
# 发送文本消息
bridge.send(
    "wecom",
    webhook_url="YOUR_WEBHOOK_URL",
    content="这是一条文本消息",
    msg_type="text"
)

# 发送 Markdown 消息
bridge.send(
    "wecom",
    webhook_url="YOUR_WEBHOOK_URL",
    content="**粗体文本**\n> 引用\n[链接](https://example.com)",
    msg_type="markdown"
)

# 发送图文消息
bridge.send(
    "wecom",
    webhook_url="YOUR_WEBHOOK_URL",
    title="图文消息标题",
    content="图文消息描述",
    msg_type="news",
    articles=[{
        "title": "文章标题",
        "description": "文章描述",
        "url": "https://example.com",
        "picurl": "https://example.com/image.jpg"
    }]
)
```

## 创建插件

1. 创建通知器类:

```python
from notify_bridge.schema import BaseNotifier, NotificationSchema
from pydantic import Field


class MySchema(NotificationSchema):
    """自定义通知模式。"""
    webhook_url: str = Field(..., description="Webhook URL")
    title: str = Field(None, description="消息标题")
    content: str = Field(..., description="消息内容")
    msg_type: str = Field("text", description="消息类型")


class MyNotifier(BaseNotifier):
    """自定义通知器。"""
    name = "my_notifier"  # 通知器名称
    schema = MySchema  # 通知器模式

    def notify(self, notification: NotificationSchema) -> NotificationResponse:
        """同步发送通知。"""
        # 实现你的通知逻辑
        pass

    async def notify_async(self, notification: NotificationSchema) -> NotificationResponse:
        """异步发送通知。"""
        # 实现你的异步通知逻辑
        pass
```

2. 在 `pyproject.toml` 中注册你的插件:

```toml
[project.entry-points."notify_bridge.notifiers"]
my_notifier = "my_package.my_module:MyNotifier"
```

## 错误处理

```python
from notify_bridge.exceptions import NotificationError, ValidationError

try:
    response = bridge.send(
        "feishu",
        webhook_url="YOUR_WEBHOOK_URL",
        content="测试消息",
        msg_type="text"
    )
except ValidationError as e:
    print(f"验证错误:{e}")
except NotificationError as e:
    print(f"通知错误:{e}")
```

## 环境变量

你可以使用环境变量来存储敏感信息,比如 webhook URL:

```python
# .env
FEISHU_WEBHOOK_URL = https: // open.feishu.cn / open - apis / bot / v2 / hook / xxx
WECOM_WEBHOOK_URL = https: // qyapi.weixin.qq.com / cgi - bin / webhook / send?key = xxx

# Python 代码
import os
from dotenv import load_dotenv

load_dotenv()

bridge.send(
    "feishu",
    webhook_url=os.getenv("FEISHU_WEBHOOK_URL"),
    content="测试消息",
    msg_type="text"
)
```

## 开发指南

1. 克隆仓库:
```bash
git clone https://github.com/loonghao/notify-bridge.git
cd notify-bridge
```

2. 安装依赖:
```bash
pip install -e ".[dev]"
```

3. 运行测试:
```bash
pytest
```

4. 运行代码检查:
```bash
nox
```

## 贡献

欢迎贡献!请随时提交 Pull Request。

1. Fork 仓库
2. 创建你的功能分支:`git checkout -b feature/my-feature`
3. 提交你的更改:`git commit -am 'Add some feature'`
4. 推送到分支:`git push origin feature/my-feature`
5. 提交 Pull Request

## 许可证

本项目基于 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件。

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "notify-bridge",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "notification, bridge, feishu, dingtalk, wechat",
    "author": null,
    "author_email": "Long Hao <hal.long@outlook.com>",
    "download_url": "https://files.pythonhosted.org/packages/aa/0c/91453bfcd27b69b69fcc2311a6e0b7ec3283d6de56189b5da0003b691729/notify_bridge-0.2.0.tar.gz",
    "platform": null,
    "description": "# notify-bridge\nA flexible notification bridge for sending messages to various platforms.\n\n<div align=\"center\">\n\n[![Python Version](https://img.shields.io/pypi/pyversions/notify-bridge)](https://img.shields.io/pypi/pyversions/notify-bridge)\n[![Nox](https://img.shields.io/badge/%F0%9F%A6%8A-Nox-D85E00.svg)](https://github.com/wntrblm/nox)\n[![PyPI Version](https://img.shields.io/pypi/v/notify-bridge?color=green)](https://pypi.org/project/notify-bridge/)\n[![Downloads](https://static.pepy.tech/badge/notify-bridge)](https://pepy.tech/project/notify-bridge)\n[![Downloads](https://static.pepy.tech/badge/notify-bridge/month)](https://pepy.tech/project/notify-bridge)\n[![Downloads](https://static.pepy.tech/badge/notify-bridge/week)](https://pepy.tech/project/notify-bridge)\n[![License](https://img.shields.io/pypi/l/notify-bridge)](https://pypi.org/project/notify-bridge/)\n[![PyPI Format](https://img.shields.io/pypi/format/notify-bridge)](https://pypi.org/project/notify-bridge/)\n[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/loonghao/notify-bridge/graphs/commit-activity)\n![Codecov](https://img.shields.io/codecov/c/github/loonghao/notify-bridge)\n</div>\n\n\u4e00\u4e2a\u7075\u6d3b\u7684\u901a\u77e5\u6865\u63a5\u5668\uff0c\u7528\u4e8e\u5411\u5404\u79cd\u5e73\u53f0\u53d1\u9001\u6d88\u606f\u3002\n\n## \u7279\u6027\n\n- \ud83d\ude80 \u7b80\u5355\u76f4\u89c2\u7684 API\n- \ud83d\udd0c \u63d2\u4ef6\u7cfb\u7edf\uff0c\u65b9\u4fbf\u6269\u5c55\n- \ud83d\udd04 \u540c\u65f6\u652f\u6301\u540c\u6b65\u548c\u5f02\u6b65\u64cd\u4f5c\n- \ud83d\udee1\ufe0f \u4f7f\u7528 Pydantic \u6a21\u578b\u8fdb\u884c\u7c7b\u578b\u5b89\u5168\u9a8c\u8bc1\n- \ud83d\udcdd \u4e30\u5bcc\u7684\u6d88\u606f\u683c\u5f0f\uff08\u6587\u672c\u3001Markdown \u7b49\uff09\n- \ud83c\udf10 \u652f\u6301\u591a\u4e2a\u5e73\u53f0\n\n## \u5b89\u88c5\n\n```bash\npip install notify-bridge\n```\n\n## \u5feb\u901f\u5f00\u59cb\n\n```python\nfrom notify_bridge import NotifyBridge\n\n# \u521b\u5efa\u6865\u63a5\u5668\u5b9e\u4f8b\nbridge = NotifyBridge()\n\n# \u540c\u6b65\u53d1\u9001\u901a\u77e5\nresponse = bridge.send(\n    \"feishu\",\n    webhook_url=\"YOUR_WEBHOOK_URL\",\n    title=\"\u6d4b\u8bd5\u6d88\u606f\",\n    content=\"\u6765\u81ea notify-bridge \u7684\u95ee\u5019\uff01\",\n    msg_type=\"text\"\n)\nprint(response)\n\n\n# \u5f02\u6b65\u53d1\u9001\u901a\u77e5\nasync def send_async():\n    response = await bridge.notify_async(\n        \"feishu\",\n        webhook_url=\"YOUR_WEBHOOK_URL\",\n        title=\"\u5f02\u6b65\u6d4b\u8bd5\u6d88\u606f\",\n        content=\"# \u6765\u81ea notify-bridge \u7684\u95ee\u5019\uff01\\n\\n\u8fd9\u662f\u4e00\u6761 **Markdown** \u6d88\u606f\u3002\",\n        msg_type=\"post\"\n    )\n    print(response)\n```\n\n## \u652f\u6301\u7684\u5e73\u53f0\n\n- [x] \u98de\u4e66 (Feishu)\n- [x] \u4f01\u4e1a\u5fae\u4fe1 (WeCom)\n- [ ] \u9489\u9489 (DingTalk)\n- [ ] \u7535\u5b50\u90ae\u4ef6 (Email)\n- [ ] Slack\n- [ ] Discord\n\n## \u4f7f\u7528\u793a\u4f8b\n\n### \u98de\u4e66 (Feishu)\n\n```python\n# \u53d1\u9001\u6587\u672c\u6d88\u606f\nbridge.send(\n    \"feishu\",\n    webhook_url=\"YOUR_WEBHOOK_URL\",\n    content=\"\u8fd9\u662f\u4e00\u6761\u6587\u672c\u6d88\u606f\",\n    msg_type=\"text\"\n)\n\n# \u53d1\u9001\u5bcc\u6587\u672c\u6d88\u606f\nbridge.send(\n    \"feishu\",\n    webhook_url=\"YOUR_WEBHOOK_URL\",\n    title=\"\u6d88\u606f\u6807\u9898\",\n    content=\"\u8fd9\u662f\u4e00\u6761\u5bcc\u6587\u672c\u6d88\u606f\u7684\u5185\u5bb9\",\n    msg_type=\"post\"\n)\n\n# \u53d1\u9001\u56fe\u7247\u6d88\u606f\nbridge.send(\n    \"feishu\",\n    webhook_url=\"YOUR_WEBHOOK_URL\",\n    image_path=\"path/to/image.jpg\",  # \u6216\u8005\u4f7f\u7528 image_key\n    msg_type=\"image\"\n)\n\n# \u53d1\u9001\u6587\u4ef6\u6d88\u606f\nbridge.send(\n    \"feishu\",\n    webhook_url=\"YOUR_WEBHOOK_URL\",\n    file_path=\"path/to/document.pdf\",  # \u6216\u8005\u4f7f\u7528 file_key\n    msg_type=\"file\"\n)\n```\n\n### \u4f01\u4e1a\u5fae\u4fe1 (WeCom)\n\n```python\n# \u53d1\u9001\u6587\u672c\u6d88\u606f\nbridge.send(\n    \"wecom\",\n    webhook_url=\"YOUR_WEBHOOK_URL\",\n    content=\"\u8fd9\u662f\u4e00\u6761\u6587\u672c\u6d88\u606f\",\n    msg_type=\"text\"\n)\n\n# \u53d1\u9001 Markdown \u6d88\u606f\nbridge.send(\n    \"wecom\",\n    webhook_url=\"YOUR_WEBHOOK_URL\",\n    content=\"**\u7c97\u4f53\u6587\u672c**\\n> \u5f15\u7528\\n[\u94fe\u63a5](https://example.com)\",\n    msg_type=\"markdown\"\n)\n\n# \u53d1\u9001\u56fe\u6587\u6d88\u606f\nbridge.send(\n    \"wecom\",\n    webhook_url=\"YOUR_WEBHOOK_URL\",\n    title=\"\u56fe\u6587\u6d88\u606f\u6807\u9898\",\n    content=\"\u56fe\u6587\u6d88\u606f\u63cf\u8ff0\",\n    msg_type=\"news\",\n    articles=[{\n        \"title\": \"\u6587\u7ae0\u6807\u9898\",\n        \"description\": \"\u6587\u7ae0\u63cf\u8ff0\",\n        \"url\": \"https://example.com\",\n        \"picurl\": \"https://example.com/image.jpg\"\n    }]\n)\n```\n\n## \u521b\u5efa\u63d2\u4ef6\n\n1. \u521b\u5efa\u901a\u77e5\u5668\u7c7b\uff1a\n\n```python\nfrom notify_bridge.schema import BaseNotifier, NotificationSchema\nfrom pydantic import Field\n\n\nclass MySchema(NotificationSchema):\n    \"\"\"\u81ea\u5b9a\u4e49\u901a\u77e5\u6a21\u5f0f\u3002\"\"\"\n    webhook_url: str = Field(..., description=\"Webhook URL\")\n    title: str = Field(None, description=\"\u6d88\u606f\u6807\u9898\")\n    content: str = Field(..., description=\"\u6d88\u606f\u5185\u5bb9\")\n    msg_type: str = Field(\"text\", description=\"\u6d88\u606f\u7c7b\u578b\")\n\n\nclass MyNotifier(BaseNotifier):\n    \"\"\"\u81ea\u5b9a\u4e49\u901a\u77e5\u5668\u3002\"\"\"\n    name = \"my_notifier\"  # \u901a\u77e5\u5668\u540d\u79f0\n    schema = MySchema  # \u901a\u77e5\u5668\u6a21\u5f0f\n\n    def notify(self, notification: NotificationSchema) -> NotificationResponse:\n        \"\"\"\u540c\u6b65\u53d1\u9001\u901a\u77e5\u3002\"\"\"\n        # \u5b9e\u73b0\u4f60\u7684\u901a\u77e5\u903b\u8f91\n        pass\n\n    async def notify_async(self, notification: NotificationSchema) -> NotificationResponse:\n        \"\"\"\u5f02\u6b65\u53d1\u9001\u901a\u77e5\u3002\"\"\"\n        # \u5b9e\u73b0\u4f60\u7684\u5f02\u6b65\u901a\u77e5\u903b\u8f91\n        pass\n```\n\n2. \u5728 `pyproject.toml` \u4e2d\u6ce8\u518c\u4f60\u7684\u63d2\u4ef6\uff1a\n\n```toml\n[project.entry-points.\"notify_bridge.notifiers\"]\nmy_notifier = \"my_package.my_module:MyNotifier\"\n```\n\n## \u9519\u8bef\u5904\u7406\n\n```python\nfrom notify_bridge.exceptions import NotificationError, ValidationError\n\ntry:\n    response = bridge.send(\n        \"feishu\",\n        webhook_url=\"YOUR_WEBHOOK_URL\",\n        content=\"\u6d4b\u8bd5\u6d88\u606f\",\n        msg_type=\"text\"\n    )\nexcept ValidationError as e:\n    print(f\"\u9a8c\u8bc1\u9519\u8bef\uff1a{e}\")\nexcept NotificationError as e:\n    print(f\"\u901a\u77e5\u9519\u8bef\uff1a{e}\")\n```\n\n## \u73af\u5883\u53d8\u91cf\n\n\u4f60\u53ef\u4ee5\u4f7f\u7528\u73af\u5883\u53d8\u91cf\u6765\u5b58\u50a8\u654f\u611f\u4fe1\u606f\uff0c\u6bd4\u5982 webhook URL\uff1a\n\n```python\n# .env\nFEISHU_WEBHOOK_URL = https: // open.feishu.cn / open - apis / bot / v2 / hook / xxx\nWECOM_WEBHOOK_URL = https: // qyapi.weixin.qq.com / cgi - bin / webhook / send?key = xxx\n\n# Python \u4ee3\u7801\nimport os\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\nbridge.send(\n    \"feishu\",\n    webhook_url=os.getenv(\"FEISHU_WEBHOOK_URL\"),\n    content=\"\u6d4b\u8bd5\u6d88\u606f\",\n    msg_type=\"text\"\n)\n```\n\n## \u5f00\u53d1\u6307\u5357\n\n1. \u514b\u9686\u4ed3\u5e93\uff1a\n```bash\ngit clone https://github.com/loonghao/notify-bridge.git\ncd notify-bridge\n```\n\n2. \u5b89\u88c5\u4f9d\u8d56\uff1a\n```bash\npip install -e \".[dev]\"\n```\n\n3. \u8fd0\u884c\u6d4b\u8bd5\uff1a\n```bash\npytest\n```\n\n4. \u8fd0\u884c\u4ee3\u7801\u68c0\u67e5\uff1a\n```bash\nnox\n```\n\n## \u8d21\u732e\n\n\u6b22\u8fce\u8d21\u732e\uff01\u8bf7\u968f\u65f6\u63d0\u4ea4 Pull Request\u3002\n\n1. Fork \u4ed3\u5e93\n2. \u521b\u5efa\u4f60\u7684\u529f\u80fd\u5206\u652f\uff1a`git checkout -b feature/my-feature`\n3. \u63d0\u4ea4\u4f60\u7684\u66f4\u6539\uff1a`git commit -am 'Add some feature'`\n4. \u63a8\u9001\u5230\u5206\u652f\uff1a`git push origin feature/my-feature`\n5. \u63d0\u4ea4 Pull Request\n\n## \u8bb8\u53ef\u8bc1\n\n\u672c\u9879\u76ee\u57fa\u4e8e MIT \u8bb8\u53ef\u8bc1 - \u8be6\u89c1 [LICENSE](LICENSE) \u6587\u4ef6\u3002\n",
    "bugtrack_url": null,
    "license": "MIT License  Copyright (c) 2024 Long Hao  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ",
    "summary": "A bridge for sending notifications to various platforms",
    "version": "0.2.0",
    "project_urls": {
        "Documentation": "https://github.com/loonghao/notify-bridge#readme",
        "Homepage": "https://github.com/loonghao/notify-bridge",
        "Issues": "https://github.com/loonghao/notify-bridge/issues",
        "Repository": "https://github.com/loonghao/notify-bridge.git"
    },
    "split_keywords": [
        "notification",
        " bridge",
        " feishu",
        " dingtalk",
        " wechat"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "227894350ec50ab5d5e8a3180006c34742dddda5d428eb544c29722d001dc659",
                "md5": "c16df38cfd1c12b271e2bbfdca6d5e31",
                "sha256": "e3cdc52dd88cdd6e80b480ebaaa87fa49885fac1e17fb3d673a70ffb326b7546"
            },
            "downloads": -1,
            "filename": "notify_bridge-0.2.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "c16df38cfd1c12b271e2bbfdca6d5e31",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 24780,
            "upload_time": "2025-01-12T14:50:16",
            "upload_time_iso_8601": "2025-01-12T14:50:16.085525Z",
            "url": "https://files.pythonhosted.org/packages/22/78/94350ec50ab5d5e8a3180006c34742dddda5d428eb544c29722d001dc659/notify_bridge-0.2.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "aa0c91453bfcd27b69b69fcc2311a6e0b7ec3283d6de56189b5da0003b691729",
                "md5": "1e6be205004829f6fa735b197e52cb7c",
                "sha256": "f7207051f4309951b5a6bb4825d25824beaac999411c61b38701d16c88b962c8"
            },
            "downloads": -1,
            "filename": "notify_bridge-0.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "1e6be205004829f6fa735b197e52cb7c",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 29652,
            "upload_time": "2025-01-12T14:50:25",
            "upload_time_iso_8601": "2025-01-12T14:50:25.576072Z",
            "url": "https://files.pythonhosted.org/packages/aa/0c/91453bfcd27b69b69fcc2311a6e0b7ec3283d6de56189b5da0003b691729/notify_bridge-0.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-01-12 14:50:25",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "loonghao",
    "github_project": "notify-bridge#readme",
    "travis_ci": false,
    "coveralls": true,
    "github_actions": true,
    "lcname": "notify-bridge"
}
        
Elapsed time: 0.45306s