wechat_pusher : 基於Golang開發的微信訊息定時推送框架

HundredLee發表於2017-06-14

wechat_pusher

Github

  • https://github.com/hundredlee/wechat_pusher
  • 歡迎star && fork && watch
  • 學Golang不久,寫一個開源練練手。希望大家提提建議。謝謝

    功能列表

  • 訊息推送
    • 模板訊息推送
      • model -> message.go
      • task -> template_task.go
    • 圖片推送(TODO)
    • 文字推送(TODO)
    • 圖文推送(TODO)
  • 日誌儲存
  • 計劃任務

如何開始?

第一步:當然是go get

  • go get github.com/hundredlee/wechat_pusher.git

  • 專案結構如下:
├── README.md
├── config
│   └── config.go
├── config.conf
├── config.conf.example
├── enum
│   └── task_type.go
├── glide.lock
├── glide.yaml
├── hlog
│   ├── filelog.go
│   ├── filelog_test.go
│   └── hlog.go
├── main.go
├── main.go.example
├── models
│   ├── message.go
│   └── token.go
├── redis
│   ├── redis.go
│   └── redis_test.go
├── statics
│   └── global.go
├── task
│   ├── task.go
│   └── template_task.go
├── utils
│   ├── access_token.go
│   ├── crontab.go
│   └── push.go
└── vendor
    └── github.com

第二步:建立一個專案

建立配置檔案

  • 專案根目錄有一個config.conf.example,重新命名為config.conf即可
  • 內容如下:
[WeChat]
APPID=
SECRET=
TOKEN=

[Redis]
POOL_SIZE=
TIMEOUT=
HOST=
PASS=
DB=

[Log]
LOG_PATH=
  • WeChat部分
    • APPID && SECRET && TOKEN 這些是微信開發者必須瞭解的東西。不細講
  • Redis部分
    • POOL_SIZE 連線池大小 ,整型 int
    • TIMEOUT 連線超時時間 ,整型 int
    • HOST 連線的IP 字串 string
    • PASS 密碼 字串 string
    • DB 資料庫選擇 整型 int
  • Log部分

    • LOG_PATH 日誌存放資料夾,例如值為wechat_log,那麼完整的目錄應該是 GOPATH/wechat_log
  • 呼叫的時候這麼寫:

conf := config.Instance()
//例如wechat 的 appid
appId := conf.ConMap["WeChat.APPID"]

模板怎麼配置

  • 以模板訊息作為例子說明:
  • message.go 是模板訊息的結構
  • template_task.go 是將一個模板訊息封裝成任務(template_task.go 是實現了介面task.go的)
mess := models.Message{
        ToUser:     "openid",
        TemplateId: "templateid",
        Url:        "url",
        Data: models.Data{
            First:   models.Raw{"xxx", "#173177"},
            Subject: models.Raw{"xxx", "#173177"},
            Sender:  models.Raw{"xxx", "#173177"},
            Remark:  models.Raw{"xxx", "#173177"}}}

//封裝成一個任務,TemplateTask表示模板訊息任務
task := task.TemplateTask{}
task.SetTask(mess)
  • 以上程式碼是模板訊息的配置,這個微信開發者應該都能看懂。

如何建立一個任務

  • 例如我們要建立一個模板訊息定時推送任務
    • 第一步,封裝任務
    • 第二步,新增任務,並設定任務型別、併發執行的個數、失敗嘗試次數等。
    • 第三步,啟動任務
  • 我們用示例程式碼演示整個完整的過程
package main

import (
    "github.com/hundredlee/wechat_pusher/enum"
    "github.com/hundredlee/wechat_pusher/models"
    "github.com/hundredlee/wechat_pusher/task"
    "github.com/hundredlee/wechat_pusher/utils"
    "runtime"
)

func main() {

    runtime.GOMAXPROCS(runtime.NumCPU())
    var tasks []task.Task
    tasks = make([]task.Task, 100)
    mess := models.Message{
        ToUser:     "oBv9cuLU5zyI27CtzI4VhV6Xabms",
        TemplateId: "UXb6s5dahNC5Zt-xQIxbLJG1BdP8mP73LGLhNXl68J8",
        Url:        "http://baidu.com",
        Data: models.Data{
            First:   models.Raw{"xxx", "#173177"},
            Subject: models.Raw{"xxx", "#173177"},
            Sender:  models.Raw{"xxx", "#173177"},
            Remark:  models.Raw{"xxx", "#173177"}}}
    task := task.TemplateTask{}
    task.SetTask(mess)

    for i := 0; i < 100; i++ {
        tasks[i] = &task
    }

    utils.NewPush(tasks).SetTaskType(enum.TASK_TYPE_TEMPLATE).SetRetries(4).SetBufferNum(10).Add("45 * * * * *")
    utils.StartCron()

}

Run

  • 很簡單,當你組裝好所有的task以後,直接執行一句話就可以了。
  • utils.NewPush(tasks).SetTaskType(enum.TASK_TYPE_TEMPLATE).SetRetries(4).SetBufferNum(10).Add("45 * * * * *")

  • utils.StartCron()

Contributor

相關文章