Skip to content

zening0809/1111111

Repository files navigation

借螃蟹

项目介绍

本项目分为主项目与微信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构建镜像并部署。

Docker部署

目前使用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,分别连接了mongoredis两个数据库的容器。 微信bot容器不需要对外暴漏端口,但需要连接到jpx这个主服务容器。 为安全起见,请勿对外暴漏mongoDB的27017服务端口和Redis的6379服务端口。

配置中,mongoDB数据库存储于宿主服务器的/jiepx/datadir目录下。

配置中,注意jpxbot两个容器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参数指定配置文件完整路径)

微信bot子服务配置

  • 本地运行使用./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一项
  • 微信扫码通知配置 见主服务配置文件的useFtqqNotifybots[xxx].sckey
  • 微信公共平台、微信支付参数 见主服务配置文件的mp_devwx_pay。注意wx_pay.appidmp_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.mmhh即为几点(24小时制),mm为几分。其中分钟数可省略。
如:今天16点15分16点15分16:15等同。明天16点明天16也是等同的。
发布行程-位置信息 微信群内 在聊天窗口中点右下角的加号,发送位置
用于发布行程中补充行程的起点、终点。
如果已发过起点和终点的定位,又发了第三次位置,第三次位置会称为终点,原先的终点会变为起点。
发布行程 发布行程 微信群内 用于提交发布行程。
如果前面两个步骤的信息已经填写完整,则会真正的提交发布行程操作。
取消行程 取消行程 微信群/单聊 用于取消所有未关闭的行程,包括通过平台与微信群发布的行程。
完成行程 完成行程 微信群/单聊 用于完成所有未关闭的行程,包括通过平台与微信群发布的行程。
群内踢人 @用户 移出/ 微信群内 允许群管理员将指定的一个或多个用户从群内移出。(司机专属群内,司机也是管理员)
微信群加入群组 #群组 组织名 微信群内 白名单用户可在群内使用此指令,将当前群加入指定群组(目前仅用于汇总群行程时分组推送)。注意:白名单用户需要在微信bot子服务配置中进行配置
查询当前群组 #群组 微信群内 白名单用户可在群内使用此指令,查询当前群加入的群组。注意:白名单用户需要在微信bot子服务配置中进行配置
发布行程 发布发布行程
人找车车找人
微信群/单聊 在单聊中回复发布行程的链接地址,在群聊中回复查看提醒(如果不在群聊中发此指令则不回复查看提醒)。
【特殊】信息汇总 发布发布行程
人找车车找人xxx
微信群 在群聊中发的信息,如果前缀有关键词,且后边有其他内容,则会被记录进入群内行程信息汇总。
每天定时在群内发布当日的汇总结果。

日常指令说明:

关键词:发布发布行程人找车车找人


[空格]关键词 xxxxxx 前缀为关键词(关键词前可有空格),后边带有其他内容的,会被记录进入汇总

举例: 人找车 今天9点去xx 车找人下午去xx速度走了 人找车明天早上去xx有位置


[空格]关键词[任意、可空] 前缀为关键词(关键词前可有空格),无论后边是否有其他内容,会回复链接

举例: 人找车 车找人下午去xx速度走了

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published