WeChatFerry/clients/go_wcf_http/mian.go

230 lines
6.6 KiB
Go
Vendored
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
resty "github.com/go-resty/resty/v2"
"github.com/gorilla/websocket"
"go_wechatFerry/app"
"go_wechatFerry/wcf"
"log"
"net"
"net/http"
"os"
"os/signal"
"strings"
"time"
)
func init() {
// 运行sdk.dll中的函数
app.WechatFerryInit()
}
func httpInit() {
// 1.创建路由
r := gin.New()
gin.SetMode(gin.ReleaseMode)
// 2.绑定路由规则,执行的函数
// gin.Context封装了request和response
// 设置模板目录
r.LoadHTMLGlob("templates/*")
r.GET("/", func(c *gin.Context) {
c.HTML(http.StatusOK, "wechatFerryGoHttp.html", gin.H{})
})
r.POST("/testHttp", func(c *gin.Context) {
type RequestData struct {
Code int `json:"code"`
Message string `json:"message"`
Data struct {
IsGroup bool `json:"is_group"`
MessageId uint64 `json:"message_id"`
Type uint32 `json:"type"`
Ts uint32 `json:"ts"`
RoomId string `json:"room_id"`
Content string `json:"content"`
WxId string `json:"wx_id"`
Sign string `json:"sign"`
Xml string `json:"xml"`
} `json:"data"`
}
var requestData RequestData
c.BindJSON(&requestData)
fmt.Println(requestData)
})
// 设置消息回调地址
r.POST("/api/SetMessageCallbackUrl", app.SetMessageCallbackUrl)
// 获取登录的wx_id
r.GET("/api/GetSelfWXID", app.GetSelfWXID)
// 获取自己的信息
r.GET("/api/GetUserInfo", app.GetUserInfo)
// 获取消息类型列表
r.GET("/api/GetMsgTypes", app.GetMsgTypes)
// 获取通讯录成功
r.GET("/api/GetContacts", app.GetContacts)
// 获取全部群的群成员
r.GET("/api/GetRoomMembersAll", app.GetRoomMembersAll)
// 获取单个群成员列表
r.POST("/api/GetRoomMember", app.GetRoomMember)
// 获取数据库名
r.GET("/api/GetDBNames", app.GetDBNames)
// 获取表
r.POST("/api/GetDBTables", app.GetDBTables)
// 执行sql
r.POST("/api/ExecDBQuery", app.ExecDBQuery)
// 发送文本消息
r.POST("/api/SendTxt", app.SendTxt)
// 发送图片
r.POST("/api/SendIMG", app.SendIMG)
// 发送文件
r.POST("/api/SendFile", app.SendFile)
// 发送卡片消息
r.POST("/api/SendRichText", app.SendRichText)
// 发送拍一拍消息
r.POST("/api/SendPat", app.SendPat)
// 转发消息
r.POST("/api/ForwardMsg", app.ForwardMsg)
// 发送emoji消息
r.POST("/api/SendEmotion", app.SendEmotion)
// 接受好友请求
r.POST("/api/AcceptFriend", app.AcceptFriend)
// 添加群成员
r.POST("/api/AddChatroomMembers", app.AddChatroomMembers)
// 邀请群成员
r.POST("/api/InvChatRoomMembers", app.InvChatRoomMembers)
// 删除群成员
r.POST("/api/DelChatRoomMembers", app.DelChatRoomMembers)
// 刷新朋友圈
r.POST("/api/RefreshPyq", app.RefreshPyq)
// 下载附件
r.POST("/api/DownloadAttach", app.DownloadAttach)
r.Run("127.0.0.1:8000")
}
func OnMsg() {
err := app.WxClient.OnMSG(func(msg *wcf.WxMsg) {
var message app.Message
message.IsSelf = msg.IsSelf
message.IsGroup = msg.IsGroup
message.MessageId = msg.Id
message.Type = msg.Type
message.Ts = msg.Ts
message.RoomId = msg.Roomid
message.Content = msg.Content
message.Sign = msg.Sign
message.WxId = msg.Sender
message.Thumb = msg.Thumb
message.Extra = msg.Extra
message.Xml = msg.Xml
// 如果你设置了回调链接 那么他就是会传给你 如果你没设置 你可以在else中 添加你的代码 直接删掉 回调的判断即可
if app.WxClient.MessageCallbackUrl != "" {
var data = map[string]interface{}{
"code": 0,
"message": "微信消息",
"data": message,
}
jsonData, _ := json.Marshal(data)
if strings.Contains(app.WxClient.MessageCallbackUrl, "tcp://") {
conn, err := net.Dial("tcp", app.WxClient.MessageCallbackUrl)
defer conn.Close()
if err != nil {
fmt.Println("err :", err)
} else {
_, err := conn.Write(jsonData)
fmt.Println("err :", err)
}
}
if strings.Contains(app.WxClient.MessageCallbackUrl, "udp://") {
addr, err := net.ResolveUDPAddr("udp", app.WxClient.MessageCallbackUrl)
if err != nil {
fmt.Println("Error resolving address:", err)
return
}
// 创建 UDP 连接
conn, err := net.DialUDP("udp", nil, addr)
if err != nil {
fmt.Println("Error dialing:", err)
return
}
defer conn.Close()
// 发送消息
_, err = conn.Write(jsonData)
if err != nil {
fmt.Println("Error sending message:", err)
return
}
}
if strings.Contains(app.WxClient.MessageCallbackUrl, "ws://") {
// 创建 WebSocket 连接
conn, _, err := websocket.DefaultDialer.Dial(app.WxClient.MessageCallbackUrl, nil)
if err != nil {
log.Fatal("Dial error:", err)
}
defer conn.Close()
// 设置写入超时
conn.SetWriteDeadline(time.Now().Add(5 * time.Second))
// 发送消息
err = conn.WriteMessage(websocket.TextMessage, jsonData)
if err != nil {
log.Fatal("Write error:", err)
}
}
if strings.Contains(app.WxClient.MessageCallbackUrl, "http") {
_, err := resty.New().SetTimeout(5 * time.Second).R().SetBody(jsonData).Post(app.WxClient.MessageCallbackUrl)
if err != nil {
fmt.Println("http消息发送失败")
}
}
} else {
//fmt.Println("消息类型:", message.Type)
//fmt.Println("消息Thumb", message.Thumb) // 这个可以直接下载
//fmt.Println("消息Extra", message.Extra) // 这个要点一下才能下载(自行处理)
//fmt.Println("消息xml", message.Xml)
//if message.Type == 3 {
// resp, _ := resty.New().R().SetBody(map[string]interface{}{
// "id": message.MessageId,
// "thumb": "F:/c++/WeChatFerry/clients/go_wcf_http/", //下载到本地的哪里
// "extra": message.Thumb, // 看上面的
// }).Post("http://127.0.0.1:8001/api/DownloadAttach")
// fmt.Println(resp.String())
// fmt.Println(resp.Error())
// fmt.Println(resp.StatusCode())
//}
go app.MessageProcess(message)
}
})
if err != nil {
fmt.Println(err)
OnMsg()
} else {
fmt.Println("为正常接受消息状态")
}
}
// 入口
func main() {
// 注册Ctrl+C信号处理函数
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, os.Interrupt)
go func() {
<-signalChan
// 在收到Ctrl+C信号时执行清理操作
fmt.Println("\n感谢温柔的ctrl+c关闭下次可直接运行程序无需重启微信。")
app.WxClient.Close()
os.Exit(0)
}()
// 开启接收消息
_ = app.WxClient.EnableRecvTxt()
// 先启动http服务器 下面的会阻塞
go httpInit()
// 启动推送消息的地方
go OnMsg()
// 防止主goroutine退出
select {}
}