230 lines
6.6 KiB
Go
Vendored
230 lines
6.6 KiB
Go
Vendored
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 {}
|
||
}
|