本项目分为主项目与微信bot子项目两部分。
主项目使用node.js编写,使用egg.js作为后端框架,前端使用vue编写,在eggjs中使用nuxt.js作为vue的渲染框架。数据存储采用mongodb,缓存数据使用redis。
微信bot子项目使用typescript编写,使用wechaty作为微信开发框架。bot子项目与主项目服务间使用websocket协议通讯。
代码版本库使用git,部署采用docker容器。 测试22
$ npm i
$ npm run dev
$ open http://localhost:7001/
主项目可使用docker容器部署,也可直接使用npm start
命令运行。如需在后台运行,可使用npm server
命令启动,使用npm stop
命令停止运行。
使用docker部署使用Dockerfile构建镜像并部署。
目前使用daocloud作为docker服务平台,使用其Stack部署功能,一次性将主服务、微信bot子服务、mongoDB数据库、Redis数据库共4个容器进行部署,并可单独控制某个容器的启动与停止。
使用的YAML配置如下:
jpx:
image: daocloud.io/binsee/jiepangxie:latest
links:
- mongo:mongo
- redis:redis
ports:
- 80:7001
environment:
- NODE_ENV=production
- CONFIG_FILE=/app/prod/jpx_config.js
- CONFIG={}
volumes:
- /jiepx/logs:/root/logs
- /jiepx/config:/app/prod
- /jiepx/static:/app/resources/static
restart: always
bot:
image: daocloud.io/binsee/jiepx-bot:latest
links:
- jpx:jpx
environment:
- NODE_ENV=production
- WECHATY_LOG=info
- DEBUG=false
- CONFIG_FILE=/app/config/bot_config.js
volumes:
- /jiepx/config:/app/config
restart: always
mongo:
image: daocloud.io/library/mongo:3.4.0
volumes:
- /jiepx/datadir:/data/db
ports:
- 27017:27017
restart: always
redis:
image: daocloud.io/library/redis:4.0.0-alpine
ports:
- 6379:6379
restart: always
其中,主服务名称为jpx
,对外暴漏服务端口80
,分别连接了mongo
、redis
两个数据库的容器。
微信bot容器不需要对外暴漏端口,但需要连接到jpx
这个主服务容器。
为安全起见,请勿对外暴漏mongoDB的27017
服务端口和Redis的6379
服务端口。
配置中,mongoDB数据库存储于宿主服务器的/jiepx/datadir
目录下。
配置中,注意jpx
与bot
两个容器environment
环境参数的CONFIG_FILE
一项,请参考配置章节。
需要注意: 上述配置中的主服务项目和微信bot服务子项目的docker镜像地址是私有地址,根据情况可使用自己的daocloud或其他docker服务平台的镜像地址。注意商业项目请使用私有镜像仓库!
使用命令部署容器: 以上文件中已经包含了部署所需的配置、参数、挂载目录等信息。如需使用docker命令手动创建容器,请自行参考docker命令说明进行配置。
- 本地运行使用
./config/prod_config.js
文件对系统参数进行配置。 - 开发模式使用
./config/dev_config.js
文件对系统参数进行配置。 - Docker部署需要挂载包含
prod_config.js
文件的目录到/app/prod
目录,使用prod_config.js
文件配置参数。(注意: 可配置docker容器的CONFIG_FILE
参数指定配置文件完整路径)
- 本地运行使用
./src/config.ts
文件对系统参数修改 - Docker部署需要挂载包含
config.js
文件的目录到/app/config
目录,使用config.js
文件配置参数。(注意: 可配置docker容器的CONFIG_FILE
参数指定配置文件完整路径) - 加bot好友,自动通过后的回复内容,在配置中
newFriendRevMsg
配置。回复绑定页要显示绑定码,需要附加s
参数,如:新用户请点击链接获取绑定码,并发送给我:\n http://abc.com/bind?s=1
配置文件中的参数含义请参考配置文件中的备注。
注意事项:
- 配置文件中的
ws
一项,需要指定主服务的url为http://server:port/bot
。一定注意不要遗漏了url后边的/bot
- 配置文件中的
profile
一项,是微信bot登陆的cookie文件。如果是指定到/app/config
目录,且此目录挂载到了宿主服务器上,需要保证此目录拥有写入权限,否则微信bot将无法登陆。比如设置目录的拥有者为systemd-bus-proxy
,可参考mongoDb挂载到服务器上目录的权限。 -配置文件中的bot_name
一项,需要与主服务配置文件中的bots
一项下配置的bot名称一致,否则连接到主服务后将被禁止运行与对外服务。
- 服务域名 见主服务配置文件的
host
一项 - 微信建群基础好友 见主服务配置文件的
roomBaseAlias
一项 - 微信bot二维码 见主服务配置文件的
bot.imgUrl
一项 - 微信扫码通知配置 见主服务配置文件的
useFtqqNotify
和bots[xxx].sckey
- 微信公共平台、微信支付参数 见主服务配置文件的
mp_dev
和wx_pay
。注意wx_pay.appid
与mp_dev.appid
要一致 - 腾讯地图参数 见主服务配置文件的
mapConf
,服务平台地址: 腾讯位置服务 - 系统其它参数 见主服务配置文件的
trip
静态资源目录:
- 非docker部署时,静态资源目录为
./resources/static
- 使用Docker部署时,静态资源目录请挂载到
/app/resources/static
上
目录内结构:
静态资源目录即为域名的一级目录文件,目录下的一级文件可直接被访问。
但二级目录仅限于site
子目录,其他目录不能访问,这是基于路由安全进行的配置。
例如域名 为http://abc.com
static目录下的文件 | 访问url |
---|---|
./favicon.ico | http://abc.com/favicon.ico |
./site/qr.jpg | http://abc.com/site/qr.jpg |
./site/logo.jpg | http://abc.com/site/logo.jpg |
固定的静态资源:
名称 文件名及路径 说明 网站logo ./site/logo.jpg 首页、微信分享图标、赞赏页面需要引用 公众号二维码 ./site/qrcode.jpg 账户绑定、行程分享、邀请页面需要引用 微信bot二维码 ./site/qr.jpg 账户绑定页面需要引用。可在配置文件中修改路径
- 开发模式时,日志会输出到
./logs
目录下 - 非docker运行,日志会输出到
/root/logs
目录下 - 使用docker运行,将目录挂载到
/root/logs
目录下
配置文件中关于mongoDb和redis的服务器地址,根据情况不同进行修改。
- 当在本地运行时,可使用数据库的实际访问ip即可。
- 使用docker部署时,如果在同一台服务器部署,则需要使用docker的link功能,将mongoDB和redis的容器,暴漏给主服务容器。而且在配置文件中使用数据库容器的别名作为服务器名称。
微信bot账户登陆:
- 微信bot子服务启动后,需要微信扫码登陆,会由主服务调用第三方服务来推送登陆的二维码。
- 扫码登陆使用server酱或botorange的微信通知推送服务,请参阅相关使用说明。
- 推送的二维码,必须使用微信扫一扫功能(调用摄像头的)进行扫码,直接在网页上长按识别图中二维码是登陆不了的!
- 每个二维码是有有效期的,收到二维码后要及时的扫码登陆,否则过期了就需要扫新推送的二维码。
- 如果一直没有登陆,会持续收到新的二维码推送。
- 如果多次扫码登陆,手机端没有出现错误提示,而且微信首页面上方也没有提示登陆了微信网页版,请用电脑打开 wx.qq.com ,尝试是否能登陆。如果提示被限制登陆,则此微信号暂时不能作为bot服务。
- 更换bot使用的微信号,会无法识别微信好友与平台用户之间的关系。会导致无法通过bot向老用户推送信息。
微信bot信息延迟:
- 为了避免微信bot过于密集的发送信息导致被封号,对需要下发的信息进行队列化处理,每两条信息间都有发送间隔,以降低被识别封号的几率。
- 由于队列的延迟处理,有时会出现用户刚发送取消行程,但仍会收到一条匹配结果信息的推送,这是正常情况。因为用户发出取消的指令前,匹配结果信息已经进入了发送队列。
平台用户与微信好友的关系绑定:
- 由于微信bot是通过给微信好友设置备注的方式来识别用户身份,当更换了bot的微信账号,会丢失这种识别关系。
微信群改名:
- 由于微信bot无法有效追踪微信群改名,如果微信群在bot不在线的时候改名,那bot上线后很难再确定之前的群关系。
- 目前项目使用了一些策略来及时跟进微信群改名,但仍然无法避免的会出现丢失关联的情况。因此,建议提前沟通,不要随便更改群名称。
发布周期行程:
- 在web页面中发布行程时,可以选择勾选创建周期行程,则会在发布行程成功后创建一个周期任务,来定期重复发布本次行程。需要注意的是,发布行程是提前一定时间自动发布的,且发布时如果有未关闭的行程,则本次发布会跳过。
- 创建周期任务时,如果已存在未关闭的周期任务,则未关闭的周期任务会全部关闭。(即同一用户只允许存在一个有效的周期任务,与同一用户仅允许存在一个有效的未关闭行程一样。这是基础规则)
- 每天
06
点自动发布当天12点
至次日6点
出发的行程; - 每天
18
点自动发布次日0点
至次日18点
出发的行程。 - 完成周期行程不会关闭关联的周期任务;取消周期任务会关闭关联的周期任务。周期任务关闭后,则不会再次自动发布关联的周期行程。
- 在与bot聊天时,使用
取消行程
指令,如果此时存在未关闭的周期行程,则会关闭此周期行程关联的周期任务,即以后不再自动发布相关周期行程。
微信bot聊天指令:
指令名称 | 格式 | 适用场景 | 备注 |
---|---|---|---|
[人找车]时间 / [车找人]时间 |
微信群内 | 用于发布行程,需要结合后续步骤完成整个发布操作。 时间可使用格式: 哪天 + 时间 。哪天可使用 今天 /明天 /后天 三种,如果省略则默认为今天 。时间使用格式 hh点mm分 /hh:mm /hh.mm ,hh 即为几点(24小时制),mm 为几分。其中分钟数可省略。如: 今天16点15分 、16点15分 、16:15 等同。明天16点 、明天16 也是等同的。 |
|
微信群内 | 在聊天窗口中点右下角的加号,发送位置 用于发布行程中补充行程的起点、终点。 如果已发过起点和终点的定位,又发了第三次位置,第三次位置会称为终点,原先的终点会变为起点。 |
||
发布行程 | 微信群内 | 用于提交发布行程。 如果前面两个步骤的信息已经填写完整,则会真正的提交发布行程操作。 |
|
取消行程 | 取消行程 | 微信群/单聊 | 用于取消所有未关闭的行程,包括通过平台与微信群发布的行程。 |
完成行程 | 完成行程 | 微信群/单聊 | 用于完成所有未关闭的行程,包括通过平台与微信群发布的行程。 |
群内踢人 | @用户 移出 /踢 |
微信群内 | 允许群管理员将指定的一个或多个用户从群内移出。(司机专属群内,司机也是管理员) |
微信群加入群组 | #群组 组织名 | 微信群内 | 白名单用户 可在群内使用此指令,将当前群加入指定群组(目前仅用于汇总群行程时分组推送)。注意:白名单用户需要在微信bot子服务配置中进行配置 |
查询当前群组 | #群组 | 微信群内 | 白名单用户 可在群内使用此指令,查询当前群加入的群组。注意:白名单用户需要在微信bot子服务配置中进行配置 |
发布行程 | 发布 、发布行程 、人找车 、车找人 |
微信群/单聊 | 在单聊中回复发布行程的链接地址,在群聊中回复查看提醒(如果不在群聊中发此指令则不回复查看提醒)。 |
【特殊】信息汇总 | 发布 、发布行程 、人找车 、车找人 xxx |
微信群 | 在群聊中发的信息,如果前缀有关键词 ,且后边有其他内容 ,则会被记录进入群内行程信息汇总。每天定时在群内发布当日的汇总结果。 |
日常指令说明:
关键词:
发布
、发布行程
、人找车
、车找人
[空格]关键词 xxxxxx 前缀为关键词(关键词前可有空格),后边带有其他内容的,会被记录进入汇总
举例:
人找车 今天9点去xx
车找人下午去xx速度走了
人找车明天早上去xx有位置
[空格]关键词[任意、可空] 前缀为关键词(关键词前可有空格),无论后边是否有其他内容,会回复链接
举例:
人找车
车找人下午去xx速度走了