{"id":16969173,"url":"https://github.com/js-banana/notify-server","last_synced_at":"2025-04-08T10:26:04.621Z","repository":{"id":37680324,"uuid":"438970504","full_name":"JS-banana/notify-server","owner":"JS-banana","description":"🍰微信消息通知","archived":false,"fork":false,"pushed_at":"2025-04-01T01:50:21.000Z","size":10306,"stargazers_count":278,"open_issues_count":5,"forks_count":243,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-01T09:21:14.092Z","etag":null,"topics":["api","github-actions","nodejs","typescript","wechat","weixin","weixinbot"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JS-banana.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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":"2021-12-16T11:48:54.000Z","updated_at":"2025-04-01T01:50:25.000Z","dependencies_parsed_at":"2024-10-26T21:19:53.812Z","dependency_job_id":"715efb78-4938-46e7-bec2-66ae59874959","html_url":"https://github.com/JS-banana/notify-server","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JS-banana%2Fnotify-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JS-banana%2Fnotify-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JS-banana%2Fnotify-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JS-banana%2Fnotify-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JS-banana","download_url":"https://codeload.github.com/JS-banana/notify-server/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247822181,"owners_count":21001802,"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":["api","github-actions","nodejs","typescript","wechat","weixin","weixinbot"],"created_at":"2024-10-14T00:24:16.970Z","updated_at":"2025-04-08T10:26:04.580Z","avatar_url":"https://github.com/JS-banana.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e微信消息通知\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\u003cimg width=\"340\" src=\"/images/weixin.jpg\" alt=\"weixin\"\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/JS-banana/notify-server\"\u003e\n    \u003cimg src=\"https://visitor-badge.glitch.me/badge?page_id=js-banana.notify-server\" alt=\"notify-server\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/JS-banana/notify-server/stargazers\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/stars/JS-banana/notify-server\" alt=\"stars\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://juejin.cn/post/7054013026801811470\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Juejin-掘金-blue\" alt=\"掘金\"\u003e\n  \u003c/a\u003e  \n  \u003ca href=\"https://github.com/JS-banana/notify-server/actions/workflows/goodMorning.yml\"\u003e\n    \u003cimg src=\"https://github.com/JS-banana/notify-server/actions/workflows/goodMorning.yml/badge.svg\" alt=\"goodMorning\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e微信通知，每天给女朋友发早安、情话、诗句、天气信息等\u003c/p\u003e\n\u003cp align=\"center\"\u003e微信通知能力的核心链路已完成，就消息内容而言不限，基于此，可以根据个人需求完成各种私人定制\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003csub\u003e\n    Support this project by starring and sharing it. \u003ca href=\"https://github.com/JS-banana\"\u003eFollow me\u003c/a\u003e to see what other cool projects I'm working on.\n  \u003c/sub\u003e\n\u003c/p\u003e\n\n\u003c!-- [![ci](https://github.com/JS-banana/notify-server/actions/workflows/goodMorning.yml/badge.svg)](https://github.com/JS-banana/notify-server/actions/workflows/goodMorning.yml) --\u003e\n\u003c!-- [![ci](https://github.com/JS-banana/notify-server/actions/workflows/goodAfternoon.yml/badge.svg)](https://github.com/JS-banana/notify-server/actions/workflows/goodAfternoon.yml)\n[![ci](https://github.com/JS-banana/notify-server/actions/workflows/goodEvening.yml/badge.svg)](https://github.com/JS-banana/notify-server/actions/workflows/goodEvening.yml) --\u003e\n\n## 已添加功能\n\n\u003e 建议直接查看 [config.yml](config.yml) 配置文件，里面有详细的配置功能说明~\n\n- [x] 每天给女友发早安和土味情话\n  \u003cdetails\u003e\u003csummary\u003e点击查看详细内容\u003c/summary\u003e\n  \n  - 个人定制化信息\n  - 天气信息\n  - 农历信息\n  - 黄历信息\n  - 节日信息\n  - 生日提醒\n  - 纪念日提醒\n  - 彩蛋消息\n  - 每日一言\n  - 最美宋词\n  - 雷人笑话\n  - 土味情话\n  - 每日英语\n  - 睡前故事\n  - 60s看世界\n  \u003c/details\u003e\n\n## 效果\n\n\u003c!-- ![wx_love-1](https://cdn.jsdelivr.net/gh/JS-banana/images/vuepress/wx_love-1.png) --\u003e\n\n\u003cp align=\"center\"\u003e\u003cimg width=\"500\" src=\"/images/weixin.jpg\" alt=\"weixin\"\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003cimg width=\"500\" src=\"/images/preview-1.jpg\" alt=\"preview-1\"\u003e\u003c/p\u003e\n\n```txt\n星河耿耿，不如你眼眸璀璨，晚风习习，不如你温柔绮丽。\n\n你闻到空气中有烧焦的味道吗？那是我的心在为你燃烧。\n\n『苏轼《水调歌头》』有悲欢离合，月有阴晴圆缺，此事古难全。\n\n『ONE杂志』爱情无非是年轻人一起喝酒做梦。\n\n『网易云音乐热评』你相信吗 也许在另一个平行时空 有一个跟你长得很像很像的人 正在热烈得爱着那个你爱不到的人——想见你想见你想见你\n\n『一言』你的眼中，明暗交杂，一笑生花。\n\n『每日英语（Jan 9, 2022』In case I don't see you… Good afternoon, good evening, and good night.\n```\n\n## 数据赋能API\n\n这里我们可以自己选择第三方开放API，或者自己定制\n\n目前接口数据能力主要由天行数据提供，随便注册一个账户会员即可，无门槛\n\n天行数据：\u003chttps://www.tianapi.com/\u003e\n\n- 会员免费接口数量：**15个**\n- 每日赠送次数：**100次**\n\n注：如果采取该接口，需要在 **添加环境变量**这一步中，再添加`Key`的变量值`TIAN_API_KEY`，作为天行数据接口使用时的必填参数\n\n\u003e 免费开源接口需要考虑服务稳定性！\n\u003e\n\u003e 本项目目前已使用到的天行数据接口见 [src/api/loveMsg](https://github.com/JS-banana/notify-server/src/api/loveMsg.ts)\n\n**提醒**：\n\n天气数据API接口：\u003chttps://www.tianqiapi.com/\u003e 不再免费提供使用了，为了测试，新用户注册可免费使用2000次\n\n非收费接口也有，不过目前看来功能有限（免费接口很容易这样用着用着就不行了😿）\n\n为了求稳，决定暂时先不用免费的接口了，该功能使用天行数据提供的接口API，\n\n简要说明：\n\n其他非天气接口，注册会员用户每天可免费调用100次，个人使用足够了，对于天气这种特殊接口采用独立计费模式，不过价格也足够便宜，1元10000次，且申请接口后立即赠送500次。\n\n## 如何使用\n\n**准备工作**：\n\n1. 安装[NodeJS](https://nodejs.org/zh-cn/)（14.x版本以上，安装最新的稳定版即可）\n2. 注册企业微信，并按照步骤提供要求的变量（[企业微信注册步骤](#需要的变量)）\n3. 注册[天行数据](https://www.tianapi.com/)，获取到用户`Key`\n\n\u003e 如果你需要使用到 Git的功能，你还需要[安装Git](https://git-scm.com/downloads)\n\n**配置文件**：\n\n项目依赖于2个核心配置文件:\n\n- [`.env`](.env)：用于配置环境变量值，如：企业ID、应用ID、天行key、发送消息类型为早中晚等\n  - 复制 `.env.example`文件重命名为 `.env`，并按照要求填写对应变量值\n  - 如果你使用的是服务器或者云函数，也可以通过直接设置环境变量进行配置\n\n  ```.env\n  # 鱼崽小铃铛：应用ID\n  WX_APP_ID=1000003\n\n  # 发送消息类型（不填默认为早晨）\n  MESSAGE_TYPE=goodMorning\n  ```\n\n- [`config.yml`](config.yml)：用于配置女朋友的各种信息，以及纪念日提醒等，功能都在该文件进行配置\n\n  ```yml\n  # 卡片标题信息（加粗显示）：今天是我们相恋的第 {day} 天，这里的 {day} 为固定替换相恋多久\n  start_stamp_message: 今天是我们相恋的第 {day} 天\n  # 女朋友所在城市（不要带‘市’），天气接口需要使用\n  city_name: 蚌埠\n  # 女朋友的爱称\n  girl_name: 鱼崽\n  ```\n\n\u003e yml语法比json更简洁易读，比较简单，[阮一峰 YAML 语言教程](https://www.ruanyifeng.com/blog/2016/07/yaml.htmls)\n\n**4种方式**：\n\n1. 使用本地电脑手动发送消息（[点我，看这里](#本地开发)）\n2. 使用`GitHub Action`免费实现自动发送消息（[点我，看这里](#github-action-部署)）\n3. 部署本地服务实现自动化运行发送消息（[点我，看这里](#部署本地服务)）\n4. 使用云函数部署，免服务器、操作简单、支持固定IP（**推荐**）（[点我，看这里](#云函数部署)）\n\n### 使用问题\n\n**需要指出的是，企业微信2022.6.20号的安全更新影响如下**：\n\n1. 如果你是在该日期之后注册的应用，那么在调用接口发送消息通知时，接口会提示IP错误，这里需要你在微信后台的应用管理中配置**可信IP**\n2. 目前根据一些同学的最新反馈，在设置可信IP之前，又发现了需要设置**可信域名**的问题\n\n\u003e 1. 对于2022.6.20之前注册过应用的同学暂时不受影响\n\u003e\n\u003e 2. 对于使用`GitHub Action`的用户来说，因为 Action的运行服务器IP是不固定的，会经常变动，目前没发现合适的解决方案\n\u003e\n\u003e 3. 对于本地调试发送消息的用户，你可以把报错的本地IP复制后填写到应用后台的可信IP内，便可以暂时解决这个问题，这个方式主要用于调试使用（电脑重启后IP可能会变），可信域名的问题会依然存在\n\n**对于上面的问题，对应的解决方案如下**：\n\n1. 可信IP问题，可采用云函数部署的解决方案，支持固定IP，见[使用方式四](#云函数部署)\n2. 可信域名的问题，见[seph1rex同学提供的解决方案（可信域名.docx）](docs/可信域名.docx)（文件位置：`docs/可信域名.docx`）\n\n总的来说，成本最低，效率最高的使用方式就是采用云函数部署方案。\n\n### 需要的变量\n\n```txt\nWX_COMPANY_ID= 企业ID\nWX_APP_ID= 应用ID\nWX_APP_SECRET= 应用 Secret\n\nTIAN_API_KEY= 天行数据 key\n```\n\n\u003cdetails\u003e\u003csummary\u003e点击查看企业微信的注册步骤的详细示例\u003c/summary\u003e\n\n#### 第一步，注册企业\n\n用电脑打开[企业微信官网](https://work.weixin.qq.com/)，注册一个企业。有手机号就可以注册，不用营业执照！不用营业执照！不用营业执照！\n\n#### 第二步，创建应用\n\n注册成功后，点「管理企业」进入管理界面，选择「应用管理」 → 「自建」 → 「创建应用」\n\n![创建应用-1](images/qiyewx-2.png)\n\n应用名称随意填，可见范围选择公司名（或指定组织、个人，建议选择全部，然后在代码里指定用户）。\n\n![创建应用-2](images/qiyewx-3.png)\n\n指定成员或组织\n\n![指定范围](images/qiyewx-3-2.png)\n\n创建完成后进入应用详情页，可以得到应用 ID( agentid )①，应用 Secret( secret )②。\n\n![创建应用-3](/images/qiyewx-3-1.png)\n\n#### 第三步，获取企业 ID\n\n进入「[我的企业](https://work.weixin.qq.com/wework_admin/frame#profile)」页面，拉到最下边，可以得到企业 ID③。\n\n![企业ID](images/qiyewx-6.png)\n\n#### 第四步，推送消息到微信\n\n进入「我的企业」 → 「[微信插件](https://work.weixin.qq.com/wework_admin/frame#profile/wxPlugin)」，拉到下边扫描二维码，关注以后即可收到推送的消息。\n\n![第四步](images/qiyewx-4.png)\n\n#### 无法接收到消息的异常情况处理\n\nPS：如果出现`接口请求正常，企业微信接受消息正常，个人微信无法收到消息`的情况：\n\n1. 进入「我的企业」 → 「微信插件」，拉到最下方，勾选 “允许成员在微信插件中接收和回复聊天消息”\n\n    ![异常情况-1](images/qiyewx-5.jpg)\n\n2. 在企业微信客户端 「我」 → 「设置」 → 「新消息通知」中关闭 “仅在企业微信中接受消息” 限制条件\n\n    ![异常情况-2](images/qiyewx-5-1.jpg)\n\n\u003c/details\u003e\n\n### 本地开发\n\n1. 可以先star本项目给个支持，然后直接fork本项目 =\u003e 克隆至本地\n2. 复制 `.env.example`文件重命名为 `.env`，并按照要求填写对应变量值\n3. 安装依赖\n\n   ```bash\n   # 推荐使用pnpm（如果未安装，可先全局安装`npm install -g pnpm`）\n   pnpm install\n   # or\n   npm install\n   ```\n\n4. 执行脚本\n\n   ```bash\n   # 推荐使用这种方式\n   pnpm start\n   # or\n   npm start\n   ```\n\n   或者\n\n   ```bash\n   # 先build构建再执行脚本\n   # 1. build构建生成js文件\n   pnpm build\n   # 2. node执行js文件\n   node dist/index.js\n   ```\n\n\u003e 注：本项目不作为包发布，因此暂不考虑build构建，直接通过脚本运行即可，github服务已配置有缓存，无需担心安装性能问题\n\n### GitHub Action 部署\n\n如果要通过 `GitHub Action`使用，需要在 `Secrets` 中一一添加变量,脚本会自动运行，当然，你也可以根据自身需求调整，见 [.github/workflows/goodMorning.yml](.github/workflows/goodMorning.yml)\n\n![secrets](/images/secrets.png)\n\nGitHub Action每天7:30自动执行，脚本配置如下：[ci.yml](https://github.com/JS-banana/notify-server/blob/master/.github/workflows/goodMorning.yml)\n\n```yml\nschedule:\n  # `分 时 天 月 周` 时按照标准时间 北京时间=标准时间+8 18表示北京时间早上2点\n  # 早上 7:30\n  - cron: '30 23 * * *'\n```\n\n### 部署本地服务\n\n使用 [pm2](https://pm2.fenxianglu.cn/) 实现对自动化脚本的本地化部署。当使用该方式后，你只需配置好[发送消息的时间](./scripts/schedule.js)，然后启动服务即可😎\n\n如果你是以下设备，请注意：\n\n1. **本地电脑**：不关机无影响，关机后，需要开机后开启本服务\n2. **服务器**：无影响，启动服务后会一直保持运行（服务器默认不关机、重启）\n\n\u003e 服务器部署服务的使用方式逻辑和本地开发一样，需要先clone本项目 =\u003e 安装依赖 =\u003e 执行脚本\n\n如何启动服务：\n\n```sh\nnpm run depoly:start\n```\n\n如何停止服务：\n\n```sh\nnpm run depoly:stop\n```\n\n如何查看服务：\n\n```sh\n# 查看服务状态\nnpm run depoly:status\n# 查看服务日志\nnpm run depoly:log\n```\n\n### 云函数部署\n\n直接使用按量付费的Serverless云函数，方便快捷，腾讯云函数、阿里云函数、华为云函数等等都可以~\n\n支持指定固定IP，可以有效解决**可信IP**的问题，目前提供了基于腾讯云和华为云的教程，如下：\n\n1. [deploy分支(作者基于腾讯云函数开发的)](https://github.com/JS-banana/notify-server/tree/deploy)：该分支可以帮助用户快速完成基于腾讯云函数的部署，`README.md`有操作步骤\n2. [docs/腾讯云函数deploy分支部署方法详解.docx](docs/腾讯云函数deploy分支部署方法详解.docx)：**MAO12366**同学提供的零基础图文操作教程，针对腾讯云的小白用户可以参考这个\n3. [docs/master分支华为云函数部署方法.docx](docs/master分支华为云函数部署方法.docx)：**MAO12366**同学提供的零基础图文操作教程，针对华为云的小白用户可以参考这个\n\n\u003c!-- ## 全局配置 --\u003e\n\n\u003c!-- ## 开发计划\n\n数据获取不仅仅依赖于开放接口API，本应用运行于NodeJS环境，一切可行的手段都可以实现，如：爬虫、RSS订阅源、自开发脚本等\n\n接下来探索更多数据获取的可能性，如有需要可考虑结合云服务和数据库\n\n思路：\n\n- [Everything is RSSible](https://docs.rsshub.app/)\n- 爬虫、数据分析\n\n计划：\n\n目前项目结构现在看来是有点混杂，接下来首要任务就是进行模块和功能的拆分、梳理，分层管理。\n\n- [x] 天气接口重构\n- [ ] 分层：核心能力模块与衍生功能点进行模块划分调整\n- [ ] 女友生日倒计时（一个月时开始计时通知，消息展现在卡片中）\n- [ ] 本地方式考虑支持定时任务以实现非手动执行（GitHub Action为线上服务方式）\n- [ ] 美丽短句的开头语句优化调整\n- [ ] 每周豆瓣热映电影\n- [ ] 随机照片 --\u003e\n\n## 更新记录\n\n- 2022-01-25：README文档更新、添加图示，免费天气接口稳定性及功能标注\n- 2022-01-26：天气接口调整、功能调整，见分支`feat/weather`\n- 2022-02-09：增加容错处理，增加独立配置文件方便用户定制\n- 2022-08-24：fix 美丽短句config配置问题[adf87fc](https://github.com/JS-banana/notify-server/commit/adf87fc04c78547fbd7070be01b1e147b6a4b856)，完善文档\n- 2022-08-30: 增加本地化部署自动化脚本服务的功能[PR](https://github.com/JS-banana/notify-server/pull/15)\n- 2022-09-05: 美化模板，添加表情\n- 2022-10-23：新增纪念日、生日提醒、自定义love message、彩蛋🎃\n- 2022-10-24：新增高温提醒、低温提醒、自定义内容\n- 2022-10-25：新增第二卡片：可以根据当前内容是否大于512字节自动启用，也支持手动启用，启用后纪念日、生日、彩蛋将只会在第二卡片中展示\n- 2022-10-26：新增黄历、第二卡片根据重要消息智能启用\n- 2022-12-07：整理了云函数部署的文档，以及专门针对腾讯云函数开发的deploy分支\n\n## 交流\n\n你可以关注我公众号（前端小帅），然后加我微信交流，或者直接添加交流群，一起沟通学习~\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n      \u003cimg height=\"160\" alt=\"公众号：前端小帅\" src=\"https://cdn.jsdelivr.net/gh/JS-banana/images/vuepress/4.png\" /\u003e\n    \u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n      \u003cimg height=\"160\" alt=\"交流群\" src=\"/images/wx-group.jpg\" /\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c!-- ![微信](/images/wx.jpg) --\u003e\n\n## 版权声明\n\n**[GPLv3](LICENSE) 协议**：凡使用本项目，其代码必须公开；如由此项目衍生的收费服务，必须提前告知终端用户此项目是可以免费获得及收费的理由；在本项目基础上 Fork、修改后的代码，必须采用 GPLv3 协议（**转载引用请注明作者和项目地址**）\n\n## 鸣谢\n\n感谢一直以来支持本项目的同学，并且为本项目的发展提供了很多思路和建议~❤\n\n- [MAO12366](https://github.com/MAO12366)：图标模板贡献、云函数部署贡献\n- [seph1rex](https://github.com/seph1rex)：可信域名解决方案提供\n\n## 请作者喝咖啡☕\n\n如果觉得这个项目还不错，或者这个项目对你有所帮助，可以选择请作者喝咖啡☕~\n\n打赏时您可以备注名称，我会将您添加至打赏列表中（如有遗漏请联系我添加）\n\n未备注的我会以咖啡命名😄，再次感谢各位的支持🧡~\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n      \u003cimg height=\"200\" alt=\"支付宝\" src=\"/images/alipay.jpg\" /\u003e\n    \u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n      \u003cimg height=\"200\" alt=\"微信\" src=\"/images/wechat.png\" /\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n| 捐赠者    |   捐赠金额 | 捐赠日期   |\n| --------- | -------- | ---------- |\n| 生椰拿铁    | 6.66 元   | 2022-11-15 |\n| 卡布奇诺    | 20 元     | 2022-10-31 |\n| A 🌸      | 5 元     | 2022-01-07 |\n\n## 感谢star\n\n你的 star 就是对我的最大支持🙏\n\n[![Stargazers over time](https://starchart.cc/JS-banana/notify-server.svg)](https://starchart.cc/JS-banana/notify-server)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjs-banana%2Fnotify-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjs-banana%2Fnotify-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjs-banana%2Fnotify-server/lists"}