bbernhard/signal-cli-rest-api

GitHub: bbernhard/signal-cli-rest-api

围绕 signal-cli 构建的 Docker 化 Signal 即时通讯 REST API,通过标准 HTTP 接口实现消息收发、号码注册与群组管理等功能。

Stars: 2642 | Forks: 294

# Dockerized Signal Messenger REST API 本项目围绕 [signal-cli](https://github.com/AsamK/signal-cli) 创建了一个小型的 Docker 化 REST API。 目前,通过 REST 暴露了以下功能: - 注册号码 - 使用通过短信接收到的验证码验证号码 - 向多个接收者(或群组)发送消息(及附件) - 接收消息 - 链接设备 - 创建/列出/删除群组 - 列出/提供/删除附件 - 更新个人资料 以及[更多功能](https://bbernhard.github.io/signal-cli-rest-api/) ## 新手入门 1. 为配置创建一个目录 这允许您通过简单地删除并重新创建容器来更新 `signal-cli-rest-api`,而无需重新注册您的 Signal 号码 ``` $ mkdir -p $HOME/.local/share/signal-api ``` 2. 启动容器 ``` $ sudo docker run -d --name signal-api --restart=always -p 8080:8080 \ -v $HOME/.local/share/signal-api:/home/.local/share/signal-cli \ -e 'MODE=native' bbernhard/signal-cli-rest-api ``` 3. 注册或链接您的 Signal 号码 在这种情况下,我们将把容器注册为辅助设备,假设您的主要号码已经在手机上运行/分配。 因此,在浏览器中打开 http://localhost:8080/v1/qrcodelink?device_name=signal-api ,在手机上打开 Signal,转到 _设置 > 已链接设备_,然后使用 _+_ 按钮扫描二维码。 4. 测试您的新 REST API 调用 REST API endpoint 并发送测试消息:将 `+4412345` 替换为国际号码格式的 Signal 号码,将 `+44987654` 替换为接收者的号码。 ``` $ curl -X POST -H "Content-Type: application/json" 'http://localhost:8080/v2/send' \ -d '{"message": "Test via Signal API!", "number": "+4412345", "recipients": [ "+44987654" ]}' ``` 您现在应该已经向 `+44987654` 发送了一条消息。 ## 执行模式 `signal-cli-rest-api` 支持三种不同的执行模式,可以通过设置 `MODE` 环境变量来控制。 * **`normal` 模式:(默认)** 每次发出 REST API 请求时都会调用 `signal-cli` 可执行文件。由于是 Java 应用程序,每次 REST 调用都需要重新启动 JVM (Java Virtual Machine),这增加了延迟,因此是最慢的操作模式。 * **`native` 模式:** 每次发出 REST API 请求时都使用预编译的二进制文件 `signal-cli-native`(使用 GraalVM)。这使得每次调用的延迟和内存占用大大降低。在 `armv7` 平台上,此模式不可用并会回退到 `normal` 模式。由于 GraalVM 编译器处于实验阶段,native 模式可能也不太稳定。 * `json-rpc` 模式:作为 daemon 进程生成单个基于 JVM 的 `signal-cli` 实例。这种模式通常最快,但由于 JVM 会一直运行,因此需要更多的内存。 * `json-rpc-native` 模式:使用 `signal-cli-native` 二进制文件并以 daemon 模式启动(此模式基本上结合了 `native` 模式和 `json-rpc` 模式的优点)。 | 模式 | 速度 | 常驻内存占用 | | ---------: | :------------------------------------------------------- | :-------------------- | | `normal` | :heavy_check_mark: | 正常 | | `native` | :heavy_check_mark: :heavy_check_mark: | 正常 | | `json-rpc` | :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: | 增加 | | `json-rpc-native` | :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: | 正常 | **以 `native` 模式运行 `signal-cli-rest` 的示例** ``` $ sudo docker run -d --name signal-api --restart=always -p 9922:8080 \ -v /home/user/signal-api:/home/.local/share/signal-cli \ -e 'MODE=native' bbernhard/signal-cli-rest-api ``` 这将启动一个可以通过 http://localhost:9922/v2/send 访问的 REST 服务实例。为了保留 Signal 号码注册(例如用于更新),`signal-cli` 配置的存储位置会作为 Docker Volume 映射到本地的 `/home/user/signal-api` 目录。 ## 自动接收计划 此 REST API 包装器基于的 [signal-cli](https://github.com/AsamK/signal-cli),建议定期调用 `receive`。因此,如果您还没有定期调用 `receive` endpoint,建议在 docker-compose.yml 文件中设置 `AUTO_RECEIVE_SCHEDULE` 参数。`AUTO_RECEIVE_SCHEDULE` 接受 cron 调度表达式,并在给定的时间自动调用 `receive` endpoint。例如:`0 22 * * *` 会在每天晚上 10 点调用 `receive`。如果您不熟悉 cron 调度表达式,可以使用这个[网站](https://crontab.guru)。 **警告** 调用 `receive` 将从 Signal Server 获取已注册 Signal 号码的所有消息!因此,如果您使用 REST API 来接收消息,使用 `AUTO_RECEIVE_SCHEDULE` 参数 _不是_ 一个好主意,因为您可能会因此丢失一些消息。 ## 示例 示例 `docker-compose.yml` 文件: ``` version: "3" services: signal-cli-rest-api: image: bbernhard/signal-cli-rest-api:latest environment: - MODE=normal #supported modes: json-rpc, native, normal #- AUTO_RECEIVE_SCHEDULE=0 22 * * * #enable this parameter on demand (see description below) ports: - "8080:8080" #map docker port 8080 to host port 8080. volumes: - "./signal-cli-config:/home/.local/share/signal-cli" #map "signal-cli-config" folder on host system into docker container. the folder contains the password and cryptographic keys when a new number is registered ``` ## 文档与用法 ### API 参考 Swagger API 文档可以在[这里](https://bbernhard.github.io/signal-cli-rest-api/)找到。如果您更喜欢简单的基于文本文件的 API 文档,请查看[这里](https://github.com/bbernhard/signal-cli-rest-api/blob/master/doc/EXAMPLES.md)。 ### 博客文章 - [在 Azure Web App for Containers 中运行 Signal Messenger REST API](https://stefanstranger.github.io/2021/06/01/RunningSignalRESTAPIinAppService/),作者 [@stefanstranger](https://github.com/stefanstranger) - [发送 Signal 消息](https://blog.aawadia.dev/2023/04/24/signal-api/),作者 [@asad-awadia](https://github.com/asad-awadia) ### 社区项目 | 名称 | 类型 | 语言 | 描述 | 维护者 | | ------------------------------------------------------------------------ | :-----: | :--------: | -------------------------------------- | :------------------------------------------------: | | [pysignalclirestapi](https://pypi.org/project/pysignalclirestapi/) | 库 | Python | 小型 Python 库 | [@bbernhard](https://github.com/bbernhard) | | [signalbot](https://pypi.org/project/signalbot/) | 库 | Python | 用于构建 Signal 机器人的框架 | [@signalbot-org](https://github.com/orgs/signalbot-org/people) | | [signal-cli-to-file](https://github.com/jneidel/signal-cli-to-file) | 脚本 | JavaScript | 将传入的 Signal 消息保存为文件 | [@jneidel](https://github.com/jneidel) | | [signal-rest-ts](https://www.npmjs.com/package/signal-rest-ts) | 库 | TypeScript | 用于构建 Signal 机器人的 TypeScript 模块 | [@pseudogeneric](https://github.com/pseudogeneric) | | [secured-signal-api](https://github.com/codeshelldev/secured-signal-api) | API 网关 | Go | 具有许多 QoL 功能的安全 Docker API 网关 | [@codeshelldev](https://github.com/codeshelldev) | 如果您需要更多功能,请**提交工单**或**创建 PR**。 ## 插件 插件机制允许您注册自定义 endpoint(具有不同的 payload),而无需 fork 本项目。详情请查看[这里](https://github.com/bbernhard/signal-cli-rest-api/tree/master/plugins)。 ## 高级设置 在 Docker 容器内部可以设置一系列环境变量,用于更改一些技术细节。这些设置面向开发者和高级用户。通常您 *不需要* 在这里更改任何内容 —— 默认值就已经完全没问题了! * `SIGNAL_CLI_CONFIG_DIR`:指定 Docker 容器内 `signal-cli` 配置目录的路径。默认为 `/home/.local/share/signal-cli/` * `SIGNAL_CLI_UID`:指定 Docker 容器内 `signal-api` 用户的 uid。默认为 `1000` * `SIGNAL_CLI_GID`:指定 Docker 容器内 `signal-api` 组的 gid。默认为 `1000` * `SIGNAL_CLI_CHOWN_ON_STARTUP`:如果设置为 `false`,将跳过启动时有时会很耗时的 chown 操作。默认为 `true` * `SWAGGER_HOST`:在 Swagger UI 中用于交互式示例的 host(在运行于反向代理后时很有用)。默认为 SWAGGER_IP:PORT。 * `SWAGGER_IP`:在 Swagger UI 中用于交互式示例的 IP。默认为容器 IP。 * `SWAGGER_USE_HTTPS_AS_PREFERRED_SCHEME`:在 Swagger UI 中将 HTTPS Scheme 作为首选 scheme。 * `PORT`:除非设置此环境变量另行指定,否则默认为端口 `8080`。 * `DEFAULT_SIGNAL_TEXT_MODE`:允许设置发送消息时应使用的默认文本模式(支持的值:`normal`,`styled`)。只有在 `send` 方法的 payload 中未明确设置 `text_mode` 时,才会使用此设置。 * `LOG_LEVEL`:允许设置日志级别。支持的值:`debug`,`info`,`warn`,`error`。如果未指定,默认为 `info`。 * `JSON_RPC_IGNORE_ATTACHMENTS`:设置为 `true` 时,在 json-rpc 模式下不会自动下载附件(默认:`false`) * `JSON_RPC_IGNORE_STORIES`:设置为 `true` 时,在 json-rpc 模式下不会自动下载快照(stories)(默认:`false`) * `JSON_RPC_IGNORE_AVATARS`:设置为 `true` 时,在 json-rpc 模式下不会自动下载头像(默认:`false`) * `JSON_RPC_IGNORE_STICKERS`:设置为 `true` 时,在 json-rpc 模式下不会自动下载贴纸包(默认:`false`) * `JSON_RPC_TRUST_NEW_IDENTITIES`:选择在 json-rpc 模式下如何信任新身份。支持的值:`on-first-use`,`always`,`never`。(默认:`on-first-use`)
标签:API封装, Docker, EVTX分析, JS文件枚举, REST API, Signal, 即时通讯, 安全防御评估, 请求拦截, 调试插件, 通讯工具