214 lines
5.7 KiB
Go
Vendored
214 lines
5.7 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(":8000")
|
||
}
|
||
|
||
func OnMsg() {
|
||
err := app.WxClient.OnMSG(func(msg *wcf.WxMsg) {
|
||
var message app.Message
|
||
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.Xml = msg.Xml
|
||
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("请设置消息回调的url")
|
||
}
|
||
})
|
||
fmt.Println(err)
|
||
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 {}
|
||
}
|