Impl websocket and change all http-get to http-post
This commit is contained in:
@@ -37,5 +37,9 @@
|
||||
go get github.com/swaggo/swag/cmd/swag
|
||||
go install github.com/swaggo/swag/cmd/swag
|
||||
|
||||
swag init --parseDependency -g httpd/server.go -o public/swag -ot json
|
||||
swag init --parseDependency -g httpd/server.go -o public/swagger -ot json
|
||||
```
|
||||
|
||||
## 生成 OpenApi 客户端
|
||||
|
||||
将生成的 `swagger.json` 上传至 `https://editor.swagger.io` 生成对应的客户端
|
||||
|
||||
@@ -12,13 +12,15 @@ func ApiGuard(c *gin.Context) {
|
||||
|
||||
token := ""
|
||||
|
||||
// 取回 Token
|
||||
authcode := c.GetHeader("Authorization")
|
||||
parts := strings.SplitN(authcode, " ", 2)
|
||||
if len(parts) == 2 && parts[0] == "Bearer" {
|
||||
token = parts[1]
|
||||
}
|
||||
|
||||
if token != args.Httpd.Token {
|
||||
// 校验 Token
|
||||
if token != args.Web.Token {
|
||||
c.Set("Error", gin.H{"Code": 401, "Message": "操作未授权"})
|
||||
c.Set("ExitCode", 401)
|
||||
c.Abort()
|
||||
@@ -26,9 +28,9 @@ func ApiGuard(c *gin.Context) {
|
||||
|
||||
}
|
||||
|
||||
func SwagGuard(c *gin.Context) {
|
||||
func SwaggerGuard(c *gin.Context) {
|
||||
|
||||
if !args.Httpd.Swag && strings.HasPrefix(c.Request.URL.Path, "/swag") {
|
||||
if !args.Web.Swagger && strings.HasPrefix(c.Request.URL.Path, "/swagger") {
|
||||
c.Header("Content-Type", "text/html; charset=utf-8")
|
||||
c.String(200, "功能已禁用")
|
||||
c.Abort()
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
)
|
||||
|
||||
// @title WeChat Rest Api
|
||||
// @version v0.5.0
|
||||
// @version v0.10.0
|
||||
// @description 基于 WeChatFerry RPC 实现的微信接口,使用 Go 语言编写,无第三方运行时依赖,易于对接任意编程语言。
|
||||
// @contact.name WeChatRest
|
||||
// @contact.url https://github.com/opentdp/wechat-rest
|
||||
@@ -29,12 +29,12 @@ func Server() {
|
||||
wcfrest.Route(api)
|
||||
|
||||
// Swagger 守卫
|
||||
httpd.Use(midware.SwagGuard)
|
||||
httpd.Use(midware.SwaggerGuard)
|
||||
|
||||
// 前端文件路由
|
||||
httpd.StaticEmbed("/", "public", args.Efs)
|
||||
|
||||
// 启动 HTTP 服务
|
||||
httpd.Server(args.Httpd.Address)
|
||||
httpd.Server(args.Web.Address)
|
||||
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5,41 +5,48 @@ import (
|
||||
|
||||
"github.com/opentdp/go-helper/logman"
|
||||
"github.com/opentdp/go-helper/request"
|
||||
"golang.org/x/net/websocket"
|
||||
|
||||
"github.com/opentdp/wechat-rest/wcferry"
|
||||
)
|
||||
|
||||
var urlReceiverStat = false
|
||||
var urlReceiverKey = ""
|
||||
var urlReceiverList = map[string]bool{}
|
||||
|
||||
var socketReceiverKey = ""
|
||||
var socketReceiverList = map[*websocket.Conn]bool{}
|
||||
|
||||
func (wc *Controller) enableUrlReceiver(url string) error {
|
||||
|
||||
if !urlReceiverStat {
|
||||
err := wc.EnrollReceiver(true, func(msg *wcferry.WxMsg) {
|
||||
logman.Info("enable receiver", "url", url)
|
||||
|
||||
if urlReceiverKey == "" {
|
||||
key, err := wc.EnrollReceiver(true, func(msg *wcferry.WxMsg) {
|
||||
ret := wcferry.ParseWxMsg(msg)
|
||||
for url := range urlReceiverList {
|
||||
logman.Info("forward msg", "url", url, "Id", ret.Id)
|
||||
go request.JsonPost(url, ret, request.H{})
|
||||
for u := range urlReceiverList {
|
||||
logman.Info("call receiver", "url", u, "Id", ret.Id)
|
||||
go request.JsonPost(u, ret, request.H{})
|
||||
}
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
urlReceiverKey = key
|
||||
}
|
||||
|
||||
if _, ok := urlReceiverList[url]; ok {
|
||||
return errors.New("url already exists")
|
||||
}
|
||||
|
||||
urlReceiverStat = true
|
||||
urlReceiverList[url] = true
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func (wc *Controller) disableUrlReceiver(url string) error {
|
||||
|
||||
logman.Info("disable receiver", "url", url)
|
||||
|
||||
if _, ok := urlReceiverList[url]; !ok {
|
||||
return errors.New("url not exists")
|
||||
}
|
||||
@@ -47,10 +54,52 @@ func (wc *Controller) disableUrlReceiver(url string) error {
|
||||
delete(urlReceiverList, url)
|
||||
|
||||
if len(urlReceiverList) == 0 {
|
||||
if err := wc.DisableReceiver(false); err != nil {
|
||||
return err
|
||||
}
|
||||
urlReceiverStat = false
|
||||
return wc.DisableReceiver(urlReceiverKey)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func (wc *Controller) enableSocketReceiver(ws *websocket.Conn) error {
|
||||
|
||||
logman.Info("enable receiver", "socket", ws.RemoteAddr().String())
|
||||
|
||||
if len(socketReceiverList) == 0 {
|
||||
key, err := wc.EnrollReceiver(true, func(msg *wcferry.WxMsg) {
|
||||
ret := wcferry.ParseWxMsg(msg)
|
||||
for w := range socketReceiverList {
|
||||
logman.Info("call receiver", "socket", ws.RemoteAddr().String(), "Id", ret.Id)
|
||||
go websocket.JSON.Send(w, ret)
|
||||
}
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
socketReceiverKey = key
|
||||
}
|
||||
|
||||
if _, ok := socketReceiverList[ws]; ok {
|
||||
return errors.New("socket already exists")
|
||||
}
|
||||
|
||||
socketReceiverList[ws] = true
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func (wc *Controller) disableSocketReceiver(ws *websocket.Conn) error {
|
||||
|
||||
logman.Info("disable receiver", "socket", ws.RemoteAddr().String())
|
||||
|
||||
if _, ok := socketReceiverList[ws]; !ok {
|
||||
return errors.New("socket not exists")
|
||||
}
|
||||
|
||||
delete(socketReceiverList, ws)
|
||||
|
||||
if len(socketReceiverList) == 0 {
|
||||
return wc.DisableReceiver(socketReceiverKey)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -2,50 +2,53 @@ package wcfrest
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
|
||||
"github.com/opentdp/wechat-rest/wclient"
|
||||
)
|
||||
|
||||
func Route(rg *gin.RouterGroup) {
|
||||
|
||||
ctrl := Controller{wclient.Register()}
|
||||
ctrl := &Controller{wclient.Register()}
|
||||
|
||||
rg.GET("is_login", ctrl.isLogin)
|
||||
rg.GET("self_wxid", ctrl.getSelfWxid)
|
||||
rg.GET("user_info", ctrl.getUserInfo)
|
||||
rg.GET("contacts", ctrl.getContacts)
|
||||
rg.GET("friends", ctrl.getFriends)
|
||||
rg.GET("user_info/:wxid", ctrl.getUserInfoByWxid)
|
||||
rg.POST("is_login", ctrl.isLogin)
|
||||
rg.POST("self_wxid", ctrl.getSelfWxid)
|
||||
rg.POST("self_info", ctrl.getSelfInfo)
|
||||
rg.POST("msg_types", ctrl.getMsgTypes)
|
||||
|
||||
rg.GET("db_names", ctrl.getDbNames)
|
||||
rg.GET("db_tables/:db", ctrl.getDbTables)
|
||||
rg.POST("db_names", ctrl.getDbNames)
|
||||
rg.POST("db_tables", ctrl.getDbTables)
|
||||
rg.POST("db_query_sql", ctrl.dbSqlQuery)
|
||||
|
||||
rg.GET("msg_types", ctrl.getMsgTypes)
|
||||
rg.GET("refresh_pyq/:id", ctrl.refreshPyq)
|
||||
|
||||
rg.GET("chatrooms", ctrl.getChatRooms)
|
||||
rg.GET("chatroom_members/:roomid", ctrl.getChatRoomMembers)
|
||||
rg.GET("alias_in_chatroom/:wxid/:roomid", ctrl.getAliasInChatRoom)
|
||||
rg.POST("chatrooms", ctrl.getChatRooms)
|
||||
rg.POST("chatroom_members", ctrl.getChatRoomMembers)
|
||||
rg.POST("alias_in_chatroom", ctrl.getAliasInChatRoom)
|
||||
rg.POST("invite_chatroom_members", ctrl.inviteChatroomMembers)
|
||||
rg.POST("add_chatroom_members", ctrl.addChatRoomMembers)
|
||||
rg.POST("del_chatroom_members", ctrl.delChatRoomMembers)
|
||||
|
||||
rg.GET("revoke_msg/:msgid", ctrl.revokeMsg)
|
||||
rg.POST("revoke_msg", ctrl.revokeMsg)
|
||||
rg.POST("forward_msg", ctrl.forwardMsg)
|
||||
rg.POST("send_txt", ctrl.sendTxt)
|
||||
rg.POST("send_img", ctrl.sendImg)
|
||||
rg.POST("send_file", ctrl.sendFile)
|
||||
rg.POST("send_rich_text", ctrl.sendRichText)
|
||||
rg.POST("send_pat_msg", ctrl.sendPatMsg)
|
||||
rg.POST("get_audio_msg", ctrl.getAudioMsg)
|
||||
rg.POST("get_ocr_result", ctrl.getOcrResult)
|
||||
rg.POST("audio_msg", ctrl.getAudioMsg)
|
||||
rg.POST("ocr_result", ctrl.getOcrResult)
|
||||
rg.POST("download_image", ctrl.downloadImage)
|
||||
rg.POST("download_attach", ctrl.downloadAttach)
|
||||
|
||||
rg.POST("avatars", ctrl.getAvatars)
|
||||
rg.POST("contacts", ctrl.getContacts)
|
||||
rg.POST("friends", ctrl.getFriends)
|
||||
rg.POST("user_info", ctrl.getInfoByWxid)
|
||||
rg.POST("refresh_pyq", ctrl.refreshPyq)
|
||||
rg.POST("accept_new_friend", ctrl.acceptNewFriend)
|
||||
rg.POST("receive_transfer", ctrl.receiveTransfer)
|
||||
|
||||
rg.POST("enable_receiver", ctrl.enabledReceiver)
|
||||
rg.POST("disable_receiver", ctrl.disableReceiver)
|
||||
|
||||
rg.GET("socket_receiver", ctrl.socketReceiver)
|
||||
|
||||
}
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
package wcfrest
|
||||
|
||||
// 执行结果
|
||||
type RespPayload struct {
|
||||
Success bool `json:"success,omitempty"`
|
||||
Result string `json:"result,omitempty"`
|
||||
Error error `json:"error,omitempty"`
|
||||
}
|
||||
|
||||
// 数据库查询参数
|
||||
type DbSqlQueryRequest struct {
|
||||
Db string `json:"db"`
|
||||
Sql string `json:"sql"`
|
||||
}
|
||||
|
||||
// 消息转发参数
|
||||
type ReceiverRequest struct {
|
||||
Url string `json:"url"`
|
||||
}
|
||||
|
||||
// 获取音频消息参数
|
||||
type GetAudioMsgRequest struct {
|
||||
Msgid uint64 `json:"msgid"`
|
||||
Dir string `json:"path"`
|
||||
Timeout int `json:"timeout"`
|
||||
}
|
||||
|
||||
// 获取OCR识别参数
|
||||
type GetOcrRequest struct {
|
||||
Extra string `json:"extra"`
|
||||
Timeout int `json:"timeout"`
|
||||
}
|
||||
|
||||
// 下载图片参数
|
||||
type DownloadImageRequest struct {
|
||||
Msgid uint64 `json:"msgid"`
|
||||
Extra string `json:"extra"`
|
||||
Dir string `json:"dir"`
|
||||
Timeout int `json:"timeout"`
|
||||
}
|
||||
|
||||
// 下载附件参数
|
||||
type DownloadAttachRequest struct {
|
||||
Msgid uint64 `json:"msgid"`
|
||||
Thumb string `json:"thumb"`
|
||||
Extra string `json:"extra"`
|
||||
}
|
||||
Reference in New Issue
Block a user