企业微信消息推送

前端管理页面

后台

项目框架

bitbucket_webhook————bitbucket钩子
koa-bitbucket-webhook-handler————koa中间件:bitbucket钩子
wechat_enterprise_api————企业微信API封装
controller————业务逻辑,对数据从新封装
provider————消息推送文件
route-decorators————自定义的路由装饰器
scheduler————定时器
service————细分controller层的业务逻辑,主要处理企业微信API相关逻辑
static
html

data————群信息json文件,用于持久化存储
config.js————企业微信appid、appsecret、address_secret、agentid
util.js————读写文件、判断是否跨域函数等前端

store————redis、企业微信api、消息钩子
node

redis.js————定义全局redis模块
webhookHandler————定义全局消息钩子仓库
WebchatAPI————定义企业微信消息模块
git

app.js————入口文件github

技术栈

  • WebHook消息钩子

https://confluence.atlassian.com/bitbucketserver/event-payload-938025882.html#Eventpayload-httpheadersHTTPheaders

当有一个带有事件的Webhook时,只要该事件发生,Bitbucket就会将事件请求发送到该Webhook的服务器URL。
复制代码

因此当配好要被发送到的服务器地址后,事件流如发起合并:pr:opened,push事件:repo:refs_changed,审核人merge操做:pr:merge,needs_work事件:pr:reviewer:needs_work等等都会有对应的json数据返回,而后就能够获取想要的有用信息。web

  • EventEmitter————发布订阅模式
ES5写法
var EventEmitter = require('events').EventEmitter
function create(options) {
  // 定义handler函数,指向EventEmitter的原型,继承EventEmitter的变量和方法
  handler.__proto__ = EventEmitter.prototype
  // 改变this指针指向handler函数
  EventEmitter.call(handler)

  return handler

  function handler(req, res, callback) {
    // ...do something
  }
}
复制代码
ES6写法
const _events = require('events');
class BitbucketWebhookHandler extends _events.EventEmitter {
  constructor(ops) {
    super();
    this.ops = ops;
  }
}
export default BitbucketWebhookHandler;
复制代码

EventEmitter 的核心就是事件触发与事件监听器功能的封装。
redis

  • addListener(event, listener) 为指定事件添加一个监听器到监听器数组的尾部。
  • on(event, listener) 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
  • once(event, listener) 为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后马上解除该监听器。
  • removeListener(event, listener) 移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。

它接受两个参数,第一个是事件名称,第二个是回调函数名称。json

  • removeAllListeners([event]) 移除全部事件的全部监听器, 若是指定事件,则移除指定事件的全部监听器。
  • emit(event, [arg1], [arg2], [...]) 按监听器的顺序执行执行每一个监听器,若是事件有注册监听返回 true,不然返回 false。
    在平时平常使用中emit和on就足够够用。
    为何要重写EventEmitter方法呢?
    其实EventEmitter只是Node中的一个很小的工具类,它并不知道你要使用它作什么,你须要什么样的事件发送和接收,这些都须要你本身去实现,它就完成分发派送的工做就好,就像咱们的快递员同样。 这就为它自己提供了很是大的功能延展性和可想象空间。
  • Redis
    Redis是一个很好的持久化存储工具,支持(key, value)的存储处理方式。在项目中具体使用场景是在代码审核时若是不一样意合并要给出评审意见,可是评审意见和不一样意操做分为两步进行,是两个事件,因此须要把评审意见暂时储存起来,当触发拒绝事件时把评审建议也展现出来。
    还有一个使用场景我并未实现,就是Redis的键空间机制,它使用的也是订阅、发布机制,经过一段时间监听某一个事件,而后返回一个回调函数。我主要是想若是未审核的代码在半小时内未被合并,就再次提醒审核人。
使用方法:
赋值:redis.multi() //开启多事务
    .set(key, value)
    .exec((err) => {
        return;
    })
取值:redis.get(key).then((res) => { ... } )
删除key: redis.del(key)
复制代码
  • 定时器
    定时器使用node很是有名的node_schedule包
const schedule  = require('node-schedule');
const rule = new schedule.RecurrenceRule(); // 设置定时器规则

rule.dayOfWeek = [1];
rule.hour = 2;
rule.minute = 0;
schedule.scheduleJob(rule, () => {
    // ...do something
}
复制代码

最后附上git地址,欢迎star啊 §[开心]§
Githubapi

相关文章
相关标签/搜索