WeChatFerry/clients/go_wcf_http/mian.go

230 lines
6.6 KiB
Go
Raw Normal View History

2024-07-01 10:01:30 +08:00
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")
2024-07-01 10:01:30 +08:00
}
func OnMsg() {
err := app.WxClient.OnMSG(func(msg *wcf.WxMsg) {
var message app.Message
message.IsSelf = msg.IsSelf
2024-07-01 10:01:30 +08:00
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
2024-07-01 10:01:30 +08:00
message.Xml = msg.Xml
// 如果你设置了回调链接 那么他就是会传给你 如果你没设置 你可以在else中 添加你的代码 直接删掉 回调的判断即可
2024-07-01 10:01:30 +08:00
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)
2024-07-01 10:01:30 +08:00
}
})
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 {}
}