# 企业微信推送
**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**
## 示例


## 文件结构
``` 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/
直接注册即可
#### 创建应用
如下依次点击,之后会让你填写一些信息,按照自己需求填写即可
#### 获取配置信息
##### 配置说明
如果你想操作你创建的应用,那么需要去获取一些信息。

+ `corpid`:企业微信id
+ `corpsecret`:应用密码
+ `agentid`:应用代码
##### 如何获取
agentid和corpsecret按照如下方式获取

corpid如下图所示

#### 下载微信插件
想要将企业微信发送到微信客户端,需要加载企业微信插件,具体流程如下

#### 测试
创建好应用之后,可以点进去应用,并点击发送消息,查看能否接收到消息。
如果可以,那我们接下来利用代码实现自动化。

### 修改配置
#### 配置文件说明
所有配置文件都在`config`文件夹中,大家从上文文件结构中可以看到有两个config.js文件。
+ `weather.config.js`:推送天气的配置文件
+ corpId:请看上文
+ corpSecret:请看上文
+ agentId:请看上文
+ province:省份
+ city:城市
+ `class.config.js`:推送课表的配置文件
+ corpId:请看上文
+ corpSecret:请看上文
+ agentId:请看上文
+ classMo:我女朋友的课表
+ classSheng:我的课表
#### 配置文件示例
##### 天气示例

##### 课表示例

> **注意**:
>
> 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
2. weather.request.js
可以看到,两个文件的主要函数大差不差
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**
我也会不定期在群里回答大家问题。