# 企业微信推送 **Repository Path**: dongshengye/wecompany-push ## Basic Information - **Project Name**: 企业微信推送 - **Description**: 企业微信推送课表及其他 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 1 - **Created**: 2022-09-25 - **Last Updated**: 2023-10-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 企业微信推送课表 - 作者:**申也** - 个人网站:[申也个人网站](https://blog.csdn.net/qq_51490212/article/details/www.dongshengye.space)(www.dongshengye.space) - 个人公众号:**申也** - B站:**申也_** - 本项目交流群:**474570120** ## 示例 image-20220925104226137image-20220925104405563 image-20220925104443856image-20220925104505000 ## 文件结构 ``` powershell wxComMy ├── common //通用文件 │ ├── class.tips.js │ └── weather.city.js ├── config //配置文件 │ ├── class.config.js │ ├── weather.config.js │ └── yi.config.js ├── index.js //入口文件 ├── package-lock.json ├── package.json └── request //主要网络请求文件 ├── class.request.js ├── weather.request.js └── yi.request.js ``` ## 快速开始 ### 克隆仓库 请在公众号`申也`后台,发送`企业微信推送`,获取源码链接。 `https://gitee.com/dongshengye/wecompany-push.git` ### 生成依赖 `npm install` ### 企业微信准备 #### 企业微信注册 https://work.weixin.qq.com/ 直接注册即可 #### 创建应用 如下依次点击,之后会让你填写一些信息,按照自己需求填写即可 image-20220926081051190 #### 获取配置信息 ##### 配置说明 如果你想操作你创建的应用,那么需要去获取一些信息。 ![image-20220926081453573](http://myimg.resumeg.club/markdown_img/image-20220926081453573.png) + `corpid`:企业微信id + `corpsecret`:应用密码 + `agentid`:应用代码 ##### 如何获取 agentid和corpsecret按照如下方式获取 ![image-20220926081658100](http://myimg.resumeg.club/markdown_img/image-20220926081658100.png) corpid如下图所示 ![image-20220926081818298](http://myimg.resumeg.club/markdown_img/image-20220926081818298.png) #### 下载微信插件 想要将企业微信发送到微信客户端,需要加载企业微信插件,具体流程如下 ![image-20220926083655758](http://myimg.resumeg.club/markdown_img/image-20220926083655758.png) #### 测试 创建好应用之后,可以点进去应用,并点击发送消息,查看能否接收到消息。 如果可以,那我们接下来利用代码实现自动化。 ![image-20220926083833740](http://myimg.resumeg.club/markdown_img/image-20220926083833740.png) ### 修改配置 #### 配置文件说明 所有配置文件都在`config`文件夹中,大家从上文文件结构中可以看到有两个config.js文件。 + `weather.config.js`:推送天气的配置文件 + corpId:请看上文 + corpSecret:请看上文 + agentId:请看上文 + province:省份 + city:城市 + `class.config.js`:推送课表的配置文件 + corpId:请看上文 + corpSecret:请看上文 + agentId:请看上文 + classMo:我女朋友的课表 + classSheng:我的课表 #### 配置文件示例 ##### 天气示例 ![image-20220926082523719](http://myimg.resumeg.club/markdown_img/image-20220926082523719.png) ##### 课表示例 ![image-20220926082442197](http://myimg.resumeg.club/markdown_img/image-20220926082442197.png) > **注意**: > > 1. 我用了两个应用来分别发送我和我女朋友的课表,所以`corpSecret` 和 `agentId`都为一个*二维数组* > > 2. 课表是7x5的数组,代表的是一周七天,一天五节课,*从周日到周一* > > 3. 课表最小单元的存储为JavaScript中的对象,有三个属性名 > > + name:课程名称 > > + pos:上课地点 > > + time:从第几周开始,到第几周结束(连字符为 - ) ### 上传服务器 如果你有服务器,本地调试成功之后直接将项目文件打包,并传输到你的服务器。 需要环境 + node + npm 具体linux或window如何配置环境,可以在网上看一下其他的博客。 > **注意:** > > 1. 本项目入口文件为`index.js`,配置好环境之后,首先可以在服务器进行测试,`node index.js`,查看自己的微信能否接收。 > 2. 入口文件实现的原理为node中的`child_process`创建一个 shell,然后在 shell 里执行命令。*但是!*我在我本地运行和在服务器运行结果不一样,因为服务器环境和本地环境不同。最稳妥的方法是下文细讲 至于我的实现方法,是在linux系统上安装了宝塔面板,然后通过宝塔面板的计划任务进行的。 具体可以查看我的另一篇博客: https://blog.csdn.net/qq_51490212/article/details/126919785 其中有一些宝塔面板的操作方法,与此次几乎没有差别。 ### 结语 至此,你就实现了企业微信推送的所有功能。 很明显的可以看到,这里用到的逻辑很简单,就是 1. 将你当做企业微信中的一位员工 2. 用代码给员工发消息,实现自动化 3. 上传服务器实现定时推送 接下来我们详细说明一下各个文件的具体作用。 ## 详细说明 ### 所用工具包 + axios:异步网络请求 + moment.js:时间处理 ### 文件结构 ```powershell wxComMy ├── common //通用文件 │ ├── class.tips.js │ └── weather.city.js ├── config //配置文件 │ ├── class.config.js │ ├── weather.config.js │ └── yi.config.js ├── index.js //入口文件 ├── package-lock.json ├── package.json └── request //主要网络请求文件 ├── class.request.js ├── weather.request.js └── yi.request.js ``` ### config文件夹 很明显,这是一个配置文件夹,也是用户需要修改的一个文件,前文已经说得很多,这里不再赘述 ### common文件夹 一些通用的,对代码整体性没有影响的文件。 + `class.tips.js`:存放激励语录,用于发课表时附带 + `weather.city.js`:存放城市对应代码,通过代码获取天气。 ### request文件夹 主要文件,用于逻辑实现和发送请求。 #### 整体说明 1. class.request.js image-20220926090240034 2. weather.request.js image-20220926090253155 可以看到,两个文件的主要函数大差不差 1. 获取token 2. 获取信息 3. 将token和信息进行发送 #### 课表文件 class.request.js 这其实是整个逻辑中最复杂的地方,因为要对*课表进行处理* 主要功能如下: 1. 获取token 2. 判断本周是第几周 3. 根据本周周次获取*本周*的课表 4. 判断今天是本周第几天 5. 根据第几天获取明天的课表 6. 包装课表信息 7. 将信息携带token发送到微信服务器,微信自动发送信息 可以看到,其中最重要的是对时间的处理,所以我用到了`moment.js`这个包,这是一个很方便的处理时间的包。 他的中文官网为:http://momentjs.cn/ #### 天气文件 weather.request.js 这里和class.request.js文件差不多,只是将获取课表信息变成了获取天气信息。 获取天气信息更加简单 1. 获取token 2. 根据weather.config.js文件中的province与city获取城市代码 3. 将城市代码发送给外部api获取天气信息 4. 包装天气信息 5. 将信息携带token发送到微信服务器,微信自动发送信息 ### 入口文件index.js #### 作用 因为能每次运行文件的时候,都去node一遍request中的所有文件,所以我用代码替我node运行。 #### 代码逻辑 1. 读取request目录 2. 进入遍历,生成命令,并执行命令 #### 注意 由于实现方法是用node中的`child_process`模块,这个模块受运行环境影响比较大,最保险的方法,是直接从根目录出发,去运行文件。 将order命令改成如下即可 ```javascript let order = `/www/server/nodejs/v14.17.6/bin/node ${__dirname}/request/` ``` ## 总结 所有代码已上传本人gitee,特地给大家做了一个交流群,大家有什么问题可以在群里交流 **qq群号:474570120** 我也会不定期在群里回答大家问题。