企業微信消息推送

前端管理頁面

後臺

項目框架

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

相關文章
相關標籤/搜索