{"id":13454826,"url":"https://github.com/engigu/Message-Push-Nest","last_synced_at":"2025-03-24T07:32:10.201Z","repository":{"id":215282567,"uuid":"731528374","full_name":"engigu/Message-Push-Nest","owner":"engigu","description":"🕊️ Message Nest - 打造个性化消息推送平台，整合邮件、钉钉、企业微信、自定义webhook等多种通知方式。定制你的消息，让通知方式更灵活多样。 🕊️ Message Nest - Craft your personalized message push hub, seamlessly integrating notifications from emails dtalk and so on. Tailor your messages for a flexible and diverse notification experience.","archived":false,"fork":false,"pushed_at":"2025-03-18T06:23:57.000Z","size":835,"stargazers_count":625,"open_issues_count":4,"forks_count":52,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-03-18T07:27:20.447Z","etag":null,"topics":["message","message-hosted","message-manager","message-push","message-site","push","push-message"],"latest_commit_sha":null,"homepage":"https://message-nest-demo-site.qwapi.eu.org","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/engigu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-14T09:33:00.000Z","updated_at":"2025-03-18T06:24:00.000Z","dependencies_parsed_at":"2024-03-01T04:23:11.857Z","dependency_job_id":"5cfb2e67-28ce-4646-afb2-149e0fce0ab9","html_url":"https://github.com/engigu/Message-Push-Nest","commit_stats":null,"previous_names":["engigu/message-nest","engigu/message-push-nest"],"tags_count":24,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/engigu%2FMessage-Push-Nest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/engigu%2FMessage-Push-Nest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/engigu%2FMessage-Push-Nest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/engigu%2FMessage-Push-Nest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/engigu","download_url":"https://codeload.github.com/engigu/Message-Push-Nest/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245227534,"owners_count":20580895,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["message","message-hosted","message-manager","message-push","message-site","push","push-message"],"created_at":"2024-07-31T08:00:58.259Z","updated_at":"2025-03-24T07:32:10.194Z","avatar_url":"https://github.com/engigu.png","language":"Go","funding_links":[],"categories":["Go","Vue"],"sub_categories":[],"readme":"# Message Nest 🕊️\n\nMessage Nest 是一个灵活而强大的消息推送整合平台，旨在简化并自定义多种消息通知方式。\n\n项目名叫信息巢，意思是一个拥有各种渠道信息方式的集合站点。\n\n如果你有很多消息推送方式，每次都需要调用各种接口去发送消息到各个渠道，或者不同的项目你都需要复制同样的发消息代码，这个项目可以帮你管理各种消息方式，并提供统一的发送api接入。你可以自由组合各种消息渠道，一个api推送到各种渠道，帮你省去接入的繁琐步骤。\n\n演示站点(演示站点的服务器比较烂，见谅) [demo](https://message-nest-demo-site.qwapi.eu.org/)\n\n[![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Fengigu%2FMessage-Push-Nest\u0026count_bg=%2379C83D\u0026title_bg=%23555555\u0026icon=\u0026icon_color=%23E7E7E7\u0026title=hits\u0026edge_flat=false)](https://hits.seeyoufarm.com)\n\n## 特色 ✨\n\n- 🔄 **整合性：** 提供了多种消息推送方式，包括邮件、钉钉、企业微信等，方便你集中管理和定制通知。\n- 🎨 **自定义性：** 可以根据需求定制消息推送策略，满足不同场景的个性化需求。\n- 🛠 **开放性：** 易于扩展和集成新的消息通知服务，以适应未来的变化。\n\n## 进度 🔨\n\n项目还在不断更新中，欢迎大家提出各种建议。\n\n关于日志，考虑到目前多数服务以收集控制台输出为主，暂时不支持写出日志文件。\n\n## 功能更新日志\n\n- **2025.01.01**\n    - 支持自托管消息，现在可以将站点作为消息的接受，登录站点查看消息\n- **2024.04.29**\n    - 支持 SQLite 部署\n    - 支持MySQL 5.x  8.x\n- **2024.04.11**\n    - 支持自定义的定时消息发送\n- **2024.03.05**\n    - 支持微信测试公众号模板消息发送\n- **2024.01.28**\n    - 支持 Docker 部署，从环境变量启动服务\n- **2024.01.24**\n    - 支持数据统计展示\n- **2024.01.20**\n    - 添加日志查看自动刷新\n- **2024.01.07**\n    - 支持站点信息自定义\n- **2024.01.03**\n    - 支持企业微信\n    - 单应用打包，直接运行，无需部署前端页面\n    - 支持邮件发送\n    - 用户密码设置\n    - 支持用户定时任务清理，更新定时时间\n    - 查看定时清理日志\n    - 单应用的 HTML 浏览器自动缓存\n    - Gin 的日志使用 Logrus\n    - 支持异步发送\n    - 支持邮件发送\n    - 支持钉钉\n    - 支持自定义的 Webhook 消息发送\n    - 企业微信支持\n  \n## 项目来由 💡\n\n自己常常写一些脚本需要消息推送，经常需要接入不同的消息发送，很不方便，于是就有了这个项目。\n\n## 效果图 📺\n\n![CPT2501011740-1492x733](https://github.com/user-attachments/assets/aa07ad2e-c44a-45c0-bc2b-a669a4adbb00)\n\n\n## 使用方法 🚀\n\n\u003cdetails\u003e\n  \u003csummary\u003e1. 直接运行最新的release打包的可执行文件（推荐，不用部署前端页面🍀🍀）\u003c/summary\u003e\n\n1. 下载最新的系统版本对应的release， 解压\n2. 新建一个数据库\n3. 重命名conf/app.example.ini为conf/app.ini\n4. 修改app.ini对应的配置\n5. 将配置中`EmbedHtml = disable`, 进行注释，以单应用方式运行，完整配置参考如下：\n\n```ini\n[app]\nJwtSecret = message-nest\nLogLevel = INFO\n\n[server]\nRunMode = release\nHttpPort = 8000\nReadTimeout = 60\nWriteTimeout = 60\n; 注释EmbedHtml，启用单应用模式\n; EmbedHtml = disable\n\n[database]\n; 关闭SQL打印\n; SqlDebug = enable\n\n; Type = sqlite\nType = mysql\nUser = root\nPassword = Aa123456\nHost = vm.server\nPort = 3308\nName = yourDbName\nTablePrefix = message_\n\n```\n\n6. 启动项目会自动创建表和账号\n\n```shell\n# INFO日志级别启动回出现如下日志\n\n[2024-01-13 13:40:09.075]  INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_auth\n[2024-01-13 13:40:11.778]  INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_send_tasks\n[2024-01-13 13:40:16.518]  INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_send_ways\n[2024-01-13 13:40:23.300]  INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_send_tasks_logs\n[2024-01-13 13:40:28.715]  INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_send_tasks_ins\n[2024-01-13 13:40:39.538]  INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_settings\n[2024-01-13 13:40:46.299]  INFO [migrate.go:74 Setup] [Init Data]: Init Account data...\n[2024-01-13 13:40:46.751]  INFO [migrate.go:77 Setup] [Init Data]: All table data init done.\n\n```\n\n7. 启动项目，访问8000端口，初始账号为admin，密码为123456\n\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n  \u003csummary\u003e2. 前后端分离部署（待更新）\u003c/summary\u003e\n\u003c/details\u003e\n\n\n[//]: # (1. 前端项目构建)\n\n[//]: # (```shell)\n\n[//]: # (cd web \u0026\u0026 npm i \u0026\u0026 npm run build)\n\n[//]: # (```)\n\n[//]: # (2. 配置配置文件，参考上面，需要注意将配置中`EmbedHtml = disable`取消注释)\n\n[//]: # (3. 启动go服务)\n\n[//]: # (```shell)\n\n[//]: # (go mod tidy)\n\n[//]: # (CGO_ENABLED=0 go build -o Message-Nest)\n\n[//]: # (./Message-Nest)\n\n[//]: # (```)\n\n[//]: # (4. 配置Nginx，将静态文件)\n\n[//]: # (5. 配置Nginx，将后端接口转发)\n\n\u003cdetails\u003e\n  \u003csummary\u003e 3. 开发调试运行\u003c/summary\u003e\n\n1. 重命名conf/app.example.ini为conf/app.ini， 关键配置如下\n\n```ini\n[app]\nJwtSecret = message-nest\nLogLevel = INFO\n\n[server]\n; RunMode务必设置成debug，会自动添加跨域\nRunMode = debug\nHttpPort = 8000\nReadTimeout = 60\nWriteTimeout = 60\n; 取消EmbedHtml的注释（启用前后端分离），然后到web目录下面，npm run dev启动前端页面\nEmbedHtml = disable\n\n[database]\n; 开启SQL打印\nSqlDebug = enable\n\n; Type = sqlite\nType = mysql\nUser = root\nPassword = Aa123456\nHost = vm.server\nPort = 3308\nName = yourDbName\nTablePrefix = message_\n\n```\n\n2. 运行main.go，服务启动后会运行在8000端口\n\n```shell\ngo mod tidy\ngo run main.go\n```\n\n3. 启动前端页面，页面启动后会提示访问url，一般是`http://127.0.0.1:5173`\n\n```shell\ncd web\nnpm i\nnpm run dev\n```\n\n4. 访问`http://127.0.0.1:5173`，进行调试开发，接口会自动转发到go服务`http://localhost:8000`\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e4. docker/docker-compose部署（推荐指数🍀🍀🍀🍀🍀）\u003c/summary\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003edocker挂载app.ini部署\u003c/summary\u003e\n\n1. 新建一个数据库，准备一个conf文件夹\n2. 新增conf/app.ini\n3. 修改app.ini对应的配置\n4. 将配置中`EmbedHtml = disable`, 进行注释，以单应用方式运行，完整配置参考如下：\n\n```ini\n[app]\nJwtSecret = message-nest\nLogLevel = INFO\n\n[server]\nRunMode = release\n; docker模式下端口配置文件中只能为8000\nHttpPort = 8000\nReadTimeout = 60\nWriteTimeout = 60\n; 注释EmbedHtml，启用单应用模式\n; EmbedHtml = disable\n\n[database]\n; 关闭SQL打印\n; SqlDebug = enable\n\n; Type = sqlite\nType = mysql\nUser = root\nPassword = Aa123456\nHost = vm.server\nPort = 3308\nName = yourDbName\nTablePrefix = message_\n\n```\n\n6. 使用命令启动，端口使用`-p`自定义\n\n```shell\ndocker pull engigu/message-nest:latest\n# 测试运行\ndocker run --rm -ti \\\n  -p 8000:8000 \\\n  -v /your/path/conf:/app/conf \\\n  engigu/message-nest:latest \n  \n# 正式运行\ndocker run -d \\\n  -p 8000:8000 \\\n  -v /your/path/conf:/app/conf \\\n  engigu/message-nest:latest \n```\n\n7. 启动项目，访问8000端口，初始账号为admin，密码为123456\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003edocker-compose挂载app.ini部署\u003c/summary\u003e\n\n1. 准备app.ini，文件内容如上docker部署\n2. 准备docker-compose.yml，内容如下：\n\n```yml\nversion: \"3.7\"\nservices:\n\n  message-nest:\n    image: engigu/message-nest:latest\n    container_name: message-nest\n    restart: always\n    volumes:\n      - ./conf:/app/conf\n    ports:\n      - \"8000:8000\"\n```\n\n3. 文件目录结构\n\n```shell\n.\n├── conf\n│   └── app.ini\n├── docker-compose.yml\n\n```\n\n4. 启动项目\n\n```shell\n# 测试运行\ndocker-compose up\n# 正式运行\ndocker-compose up -d\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003edocker/docker-compose环境变量部署（推荐指数🍀🍀🍀🍀🍀🍀🍀🍀🍀）\u003c/summary\u003e\n\n环境变量介绍\n\n| 变量                 | 说明                                                 | \n|--------------------|----------------------------------------------------|\n| JWT_SECRET         | jwt秘钥，可选，默认为message-nest                           |\n| LOG_LEVEL          | 日志等级，可选，默认为INFO，DEBUG/INFO/ERROR                   |\n| RUN_MODE           | 运行模式，可选，默认release，为debug将自动添加跨域                    |\n|                    |                                                    |\n| DB_TYPE            | 数据库类型，sqlite/mysql。默认为sqlite,存储路径为conf/database.db |\n|                    |                                                    |\n| MYSQL_HOST         | mysql-host，DB_TYPE=mysql必填                         |\n| MYSQL_PORT         | mysql端口，DB_TYPE=mysql必填                            |\n| MYSQL_USER         | mysql用户名，DB_TYPE=mysql必填                           |\n| MYSQL_PASSWORD     | mysql数据库密码，DB_TYPE=mysql必填                         |\n| MYSQL_DB           | mysql数据库名字，DB_TYPE=mysql必填                         |\n| MYSQL_TABLE_PREFIX | mysql数据表前缀，DB_TYPE=mysql必填                         |\n|                    |                                                    |\n| SQL_DEBUG          | 是否打印SQL，可选，默认关，设置enable为开启                         |\n\ndocker运行\n\n```shell\n\n# 正式运行（mysql）\ndocker run -d  \\\n  -p 8000:8000 \\\n  -e MYSQL_HOST=192.168.64.133  \\\n  -e MYSQL_PORT=3308 \\\n  -e MYSQL_USER=root \\\n  -e MYSQL_PASSWORD=Aa123456 \\\n  -e MYSQL_DB=test_11 \\\n  -e MYSQL_TABLE_PREFIX=message_ \\\n  --name message-nest  \\\n  engigu/message-nest:latest \n\n# 正式运行（sqlite）\ndocker run -d  \\\n  -p 8000:8000 \\\n  -v you/path/database.db=conf/database.db  \\\n  --name message-nest  \\\n  engigu/message-nest:latest \n```\n\ndocker-compose运行(mysql)\n\n```yml\nversion: \"3.7\"\nservices:\n\n  message-nest:\n    image: engigu/message-nest:latest\n    container_name: message-nest\n    restart: always\n    ports:\n      - \"8000:8000\"\n    environment:\n      - MYSQL_HOST=192.168.64.133\n      - MYSQL_PORT=3308\n      - MYSQL_USER=root\n      - MYSQL_PASSWORD=Aa123456\n      - MYSQL_DB=test_11\n      - MYSQL_TABLE_PREFIX=message_\n```\n\ndocker-compose运行(sqlite)\n\n```yml\nversion: \"3.7\"\nservices:\n\n  message-nest:\n    image: engigu/message-nest:latest\n    container_name: message-nest\n    restart: always\n    ports:\n      - \"8000:8000\"\n    volumes:\n      - you/path/database.db:conf/database.db\n```\n\n```shell\n# 正式运行\ndocker-compose -up -d\n```\n\n\u003c/details\u003e\n\n\u003c/details\u003e\n\n#### 关于EmbedHtml配置的说明\n\n\u003e 这个配置可以理解为单应用模式（或者前后端分离）的开关\n\u003e  1. 打开这个配置，表示前后端分离，表示go服务启动的时候只会有api服务，需要到web目录下，npm run\n      dev启动前端项目。然后访问前端项目提示的端口服务，一般是127.0.0.1:5173。\n      或者使用npm run build，用Nginx部署前端。\n\u003e\n\u003e  2. 注释这个配置，表示单应用，启动go服务，会把web/dist目录下文件作为前端静态资源。\n     如果目录下没有静态资源文件，需要到web目录下，npm run build构建生成。\n\u003e\n\u003e 两种方式各有优缺点，综合考虑下来，推荐直接使用release的打包执行文件（或者docker环境变量进行部署），其中已经内置了页面静态资源，只用运行一个服务。\n\n## 完整配置说明 ⚙️\n\n\u003cdetails\u003e\n  \u003csummary\u003e点击展开\u003c/summary\u003e\n\n```ini\n[app]\nJwtSecret = message-nest\n; 暂时无用\nRuntimeRootPath = runtime/\nLogLevel = INFO\n\n[server]\n; debug or release\n; debug模式下会自动添加跨域headers\nRunMode = release\nHttpPort = 8000\nReadTimeout = 60\nWriteTimeout = 60\n; use embed html static file\n; 是否使用embed打包的静态资源\n; 如果运行release打包后的应用，请注释这个设置。\n; 如果取消这个注释，只会单独运行api服务，前端页面需要到web目录手动npm run dev, 运行前端服务\n; EmbedHtml = disable   \n\n[database]\n; 配置使用sqlite\n;Type = sqlite\n\n; 配置使用mysql\nType = mysql\nUser = root\nPassword = password\nHost = 123.1.1.1\nName = db_name\nPort = 3306\n\n; 其他配置\n; 表前缀\nTablePrefix = message_\n; 是否打开sql打印\n; SqlDebug = enable\n\n```\n\n\u003c/details\u003e\n\n## 客户端调用示例 💻️\n\n\u003cdetails\u003e\n  \u003csummary\u003eCURL\u003c/summary\u003e\n\n```shell\ncurl -X POST --location 'http://127.0.0.1:5173/api/v1/message/send' \\\n        --header 'Content-Type: application/json' \\\n        --data '{\n    \"task_id\": \"T-JiXpO8EO7u\",\n    \"title\": \"message title\",\n    \"text\": \"Hello World!\"\n}'\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003ePython\u003c/summary\u003e\n\n```python\nimport requests\n\nheaders = {\n    'Content-Type': 'application/json',\n}\njson_data = {\n    \"task_id\": \"T-JiXpO8EO7u\",\n    \"title\": \"message title\",\n    \"text\": \"Hello World!\"\n}\nresponse = requests.post('http://127.0.0.1:5173/api/v1/message/send', headers=headers, json=json_data)\n\nprint(\"response:\", response.json())\n\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eGo\u003c/summary\u003e\n\n```golang\npackage main\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"net/http\"\n\t\"strings\"\n)\n\nfunc main() {\n\tclient := \u0026http.Client{}\n\tvar data = strings.NewReader(`{\n    \"task_id\": \"T-JiXpO8EO7u\",\n    \"title\": \"message title\",\n    \"text\": \"Hello World!\"\n}`)\n\treq, err := http.NewRequest(\"POST\", \"http://127.0.0.1:5173/api/v1/message/send\", data)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\treq.Header.Set(\"Content-Type\", \"application/json\")\n\tresp, err := client.Do(req)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer resp.Body.Close()\n\tbodyText, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Printf(\"%s\\n\", bodyText)\n}\n\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eJava\u003c/summary\u003e\n\n```java\nimport java.io.IOException;\nimport java.net.URI;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpRequest.BodyPublishers;\nimport java.net.http.HttpResponse;\n\nHttpClient client = HttpClient.newBuilder()\n    .followRedirects(HttpClient.Redirect.NORMAL)\n    .build();\n\nHttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"http://127.0.0.1:5173/api/v1/message/send\"))\n    .POST(BodyPublishers.ofString(\"{\\n    \\\"task_id\\\": \\\"T-JiXpO8EO7u\\\",\\n    \\\"title\\\": \\\"message title\\\",\\n    \\\"text\\\": \\\"Hello World!\\\"\\n}\"))\n    .setHeader(\"Content-Type\", \"application/json\")\n    .build();\n\nHttpResponse\u003cString\u003e response = client.send(request, HttpResponse.BodyHandlers.ofString());\n\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eNode\u003c/summary\u003e\n\n```JavaScript\nvar request = require('request');\n\nvar headers = {\n    'Content-Type': 'application/json'\n};\n\nvar dataString = \"{\\n    \\\"task_id\\\": \\\"T-JiXpO8EO7u\\\",\\n    \\\"title\\\": \\\"message title\\\",\\n    \\\"text\\\": \\\"Hello World!\\\"\\n}\";\n\nvar options = {\n    url: 'http://127.0.0.1:5173/api/v1/message/send',\n    method: 'POST',\n    headers: headers,\n    body: dataString\n};\n\nfunction callback(error, response, body) {\n    if (!error \u0026\u0026 response.statusCode == 200) {\n        console.log(body);\n    }\n}\n\nrequest(options, callback);\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003ePHP\u003c/summary\u003e\n\n```php\n\u003c?php\n$ch = curl_init();\ncurl_setopt($ch, CURLOPT_URL, 'http://127.0.0.1:5173/api/v1/message/send');\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\ncurl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');\ncurl_setopt($ch, CURLOPT_HTTPHEADER, [\n    'Content-Type: application/json',\n]);\ncurl_setopt($ch, CURLOPT_POSTFIELDS, \"{\\n    \\\"task_id\\\": \\\"T-JiXpO8EO7u\\\",\\n    \\\"title\\\": \\\"message title\\\",\\n    \\\"text\\\": \\\"Hello World!\\\"\\n}\");\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);\n\n$response = curl_exec($ch);\n\ncurl_close($ch);\n        \n```\n\u003c/details\u003e\n\n\n## 页面操作指引 🎞️\n\n关于消息的添加，发送的整个步骤，是以顶部菜单栏从右向左进行操作。\n\n\u003cdetails\u003e\n  \u003csummary\u003e1. 新增发信渠道（添加消息的具体渠道）\u003c/summary\u003e\n\n![image](screenshots/1-add-message-ways.png)\n\n参考各个渠道tab的说明进行设置保存\n\n注意现在的自定义webhook形式，只支持`POST`请求，采用的是替换配置的消息体中的占位符`TEXT`，进行发送消息\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e2. 新增发信任务\u003c/summary\u003e\n\n![image](screenshots/2-add-message-task.png)\n\n1. 点击渠道输入框会弹出所有渠道选项\n2. 选择一个渠道会出现渠道的明细信息，并选择一种消息类型，进行暂存成为实例，点击确定才会进行最终的保存\n3. 添加任务的页面实际上，会分别添加任务，以及任务关联的渠道实例\n4. 关于任务与实例的说明：\n\n\u003e 一个任务可以关联创建多个实例\n\u003e\n\u003e  选择不同的渠道，填写的实例信息也不一样\n\u003e\n\u003e  一个任务可以绑定一个实例，也可以绑定多个实例，多个实例意味着一个消息可以推送给多个消息渠道\n\n5. 关于实例的消息类型说明：\n\n\u003e 消息的类型大体上可以分为text、html、markdown三种类型。每种渠道消息现在支持的类型有不同的限制。\n\u003e\n\u003e  在实际发送的时候，会优先选择发送api中传过来对应类型的消息，如果api中没有对应的类型，会直接取api中text消息。\n\u003e\n\u003e  api中text消息在发送的时候必须要传\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e3. 消息发送\u003c/summary\u003e\n\n![image](screenshots/3-send-message.png)\n\n参考各种语言的接口进行调用\n\n\u003c/details\u003e\u003c/details\u003e\n\n## 贡献 🤝\n\n欢迎通过提交问题和提出改进建议。\n\n## 致谢 🙏\n\n该项目汲取了[go-gin-example](https://github.com/eddycjy/go-gin-example)项目的灵感，展示了 Go 和 Gin 在实际应用中的强大和多才多艺。\n\n## Star History ⭐\n\n[![Star History Chart](https://api.star-history.com/svg?repos=engigu/Message-Push-Nest\u0026type=Date)](https://star-history.com/#engigu/Message-Push-Nest\u0026Date)\n\n## 许可证 📝\n\n[LICENSE](LICENSE)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fengigu%2FMessage-Push-Nest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fengigu%2FMessage-Push-Nest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fengigu%2FMessage-Push-Nest/lists"}