V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
hundredlee2017
V2EX  ›  Go 编程语言

wechat_pusher - 基于 Golang 开发的微信消息定时推送框架

  •  
  •   hundredlee2017 · 2017-06-15 17:17:06 +08:00 · 844 次点击
    这是一个创建于 2719 天前的主题,其中的信息可能已经有所发展或是发生改变。

    wechat_pusher

    Github

    功能列表

    • 消息推送
      • 模板消息推送
        • model -> message.go
        • task -> template_task.go
      • 图片推送(TODO)
      • 文字推送(TODO)
      • 图文推送(TODO)
    • 日志存储
    • 计划任务

    如何开始?

    第一步:当然是 go get

    ├── 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(&utils.Push{
        	Tasks:tasks,
        	TaskType:enum.TASK_TYPE_TEMPLATE,
        	Retries:4,
        	BufferNum:10,
        }).Add("45 * * * * *")
    
        utils.StartCron()
    
    }
    
    

    Run

    • 很简单,当你组装好所有的 task 以后,直接运行一句话就可以了。
        utils.NewPush(&utils.Push{
        	Tasks:tasks,
        	TaskType:enum.TASK_TYPE_TEMPLATE,
        	Retries:4,
        	BufferNum:10,
        }).Add("45 * * * * *")
    
        utils.StartCron()
    
    
    2 条回复    2017-07-04 20:27:19 +08:00
    chenqh
        1
    chenqh  
       2017-06-15 19:55:30 +08:00 via iPhone
    什么协议 图片推送能做到吗
    quella
        2
    quella  
       2017-07-04 20:27:19 +08:00
    @chenqh 看配置这个是没有使用协议的, 用到了 APPID、SECRET,微信公众平台。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2991 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 12:55 · PVG 20:55 · LAX 04:55 · JFK 07:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.