342 lines
9.0 KiB
Go
342 lines
9.0 KiB
Go
// 过mac滑块
|
|
|
|
package service
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"net/url"
|
|
"xiawan/wx/api/req"
|
|
)
|
|
|
|
type PrecheckRequestSlide struct {
|
|
UUID string `json:"uuid"`
|
|
Precheck struct {
|
|
Ticket string `json:"ticket"`
|
|
} `json:"precheck"`
|
|
}
|
|
type VerifyMethodRequestSlide struct {
|
|
UUID string `json:"uuid"`
|
|
GetVerifyMethod struct {
|
|
Ticket string `json:"ticket"`
|
|
} `json:"get_verify_method"`
|
|
}
|
|
type SubmitPinRequestSlide struct {
|
|
Appid string `json:"appid"`
|
|
Ccdata string `json:"ccdata"`
|
|
RandStr string `json:"rand_str"`
|
|
Ticket string `json:"ticket"`
|
|
UUID string `json:"uuid"`
|
|
}
|
|
type VerificationcodeParamSlide struct {
|
|
Key string
|
|
Code string
|
|
}
|
|
|
|
type OuterResponseSlide struct {
|
|
Data string `json:"data"`
|
|
Status int `json:"status"`
|
|
UUID string `json:"uuid"` // 这里是个 JSON 字符串
|
|
}
|
|
|
|
// 定义结构体以匹配返回值
|
|
type ResponseData11Slide struct {
|
|
Data string `json:"data"`
|
|
Status int `json:"status"`
|
|
UUID string `json:"uuid"`
|
|
}
|
|
|
|
func getEncodedUUIDSlide(data string) (string, error) {
|
|
urlStr := "http://113.44.162.180:5001/get_uuid"
|
|
|
|
payload := map[string]string{"data": data}
|
|
payloadBytes, err := json.Marshal(payload)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
req, err := http.NewRequest("POST", urlStr, bytes.NewBuffer(payloadBytes))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
req.Header.Add("Authorization", "Bearer 4282f08a7f1743a06686f1d9dddfa213badb1406de7f6419e135761cca29a2aa")
|
|
req.Header.Add("Content-Type", "application/json")
|
|
|
|
client := &http.Client{}
|
|
res, err := client.Do(req)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
body, err := io.ReadAll(res.Body)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// 先反序列化外层响应
|
|
var outerResp OuterResponse
|
|
if err := json.Unmarshal(body, &outerResp); err != nil {
|
|
return "", fmt.Errorf("unmarshal outer response failed: %w", err)
|
|
}
|
|
|
|
if outerResp.UUID == "" {
|
|
return "", fmt.Errorf("outerResp.UUID is empty")
|
|
}
|
|
|
|
// 对 outerResp.UUID 字符串再做一次反序列化
|
|
var innerResp ResponseData11Slide
|
|
if err := json.Unmarshal([]byte(outerResp.UUID), &innerResp); err != nil {
|
|
return "", fmt.Errorf("unmarshal inner UUID json failed: %w", err)
|
|
}
|
|
|
|
if innerResp.UUID == "" {
|
|
return "", fmt.Errorf("innerResp.UUID is empty")
|
|
}
|
|
|
|
// URL编码真正的 uuid 字符串
|
|
encodedUUID := url.QueryEscape(innerResp.UUID)
|
|
return encodedUUID, nil
|
|
}
|
|
|
|
func precheckSlide(uuid, Ticket string) (string, error) {
|
|
url := "https://weixin110.qq.com/security/acct/extdevauthslavecgi?t=extdevsignin%2Fslaveverify&ticket=" + Ticket + "&step=precheck&wechat_real_lang=zh_CN"
|
|
requestData := PrecheckRequestSlide{
|
|
UUID: uuid,
|
|
Precheck: struct {
|
|
Ticket string `json:"ticket"`
|
|
}{
|
|
Ticket: Ticket, //3_2d512e8104f3992c5fa8bfa1047ab3bb ios 18.0.1 pc 3_76cdadf7b44f1e05ad8c140ba26dc044
|
|
},
|
|
}
|
|
fmt.Println("我是Ticket", Ticket)
|
|
jsonData, err := json.Marshal(requestData)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
payload := bytes.NewBuffer(jsonData)
|
|
|
|
req, err := http.NewRequest("POST", url, payload)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63090a13) XWEB/85551")
|
|
req.Header.Add("Content-Type", "application/json")
|
|
client := &http.Client{}
|
|
res, err := client.Do(req)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer res.Body.Close()
|
|
body, err := ioutil.ReadAll(res.Body)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
var data map[string]interface{}
|
|
err = json.Unmarshal(body, &data)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
ret, ok1 := data["ret"].(float64)
|
|
|
|
errMsg, ok2 := data["err_msg"].(string)
|
|
|
|
if ok1 && ok2 && ret == 0 && errMsg == "成功。" {
|
|
return res.Header.Get("Set-Cookie"), nil
|
|
} else {
|
|
return "", nil
|
|
}
|
|
}
|
|
|
|
func getVerifyIDSlide(uuid, cookie, Ticket string) (string, error) {
|
|
url := "https://weixin110.qq.com/security/acct/extdevauthslavecgi?t=extdevsignin/slaveverify&ticket=" + Ticket + "&step=get_verify_method&wechat_real_lang=zh_CN"
|
|
requestData := VerifyMethodRequest{
|
|
UUID: uuid,
|
|
GetVerifyMethod: struct {
|
|
Ticket string `json:"ticket"`
|
|
}{
|
|
Ticket: Ticket,
|
|
},
|
|
}
|
|
jsonData, err := json.Marshal(requestData)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
payload := bytes.NewBuffer(jsonData)
|
|
req, err := http.NewRequest("POST", url, payload)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
req.Header.Add("Cookie", cookie)
|
|
//req.Header.Add("Accept", "*/*")
|
|
//req.Header.Add("Accept-Encoding", "gzip, deflate, br")
|
|
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63090a13) XWEB/85551")
|
|
//req.Header.Add("Connection", "keep-alive")
|
|
req.Header.Add("Content-Type", "application/json")
|
|
client := &http.Client{}
|
|
res, err := client.Do(req)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer res.Body.Close()
|
|
body, err := ioutil.ReadAll(res.Body)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
var responseData struct {
|
|
Data struct {
|
|
VerifyID string `json:"verify_id"`
|
|
} `json:"data"`
|
|
}
|
|
err = json.Unmarshal(body, &responseData)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if responseData.Data.VerifyID != "" {
|
|
return responseData.Data.VerifyID, nil
|
|
|
|
}
|
|
|
|
return "", nil
|
|
}
|
|
|
|
func submitPinAndCheckSlide(secverifyid, uuid, slideTicket, randStr string) (bool, error) {
|
|
fmt.Println("--------------------------------\n", "secverifyid:", secverifyid, "\n", "uuid:", uuid, "\n", "slideTicket:", slideTicket, "\n", "randStr:", randStr, "\n--------------------------------")
|
|
|
|
url := "https://weixin110.qq.com/security/acct/commverifycodecgi?t=extdevsignin/slaveverify&step=verify_capt&secverifyid=" + secverifyid + "&wechat_real_lang=zh_CN&exportkey=&version=9"
|
|
requestData := SubmitPinRequestSlide{
|
|
UUID: uuid,
|
|
Appid: "2078688116",
|
|
Ccdata: "",
|
|
RandStr: randStr,
|
|
Ticket: slideTicket,
|
|
}
|
|
jsonData, err := json.Marshal(requestData)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
payload := bytes.NewBuffer(jsonData)
|
|
req, err := http.NewRequest("POST", url, payload)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
//req.Header.Add("Accept", "*/*")
|
|
//req.Header.Add("Accept-Encoding", "gzip, deflate, br")
|
|
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63090a13) XWEB/8555")
|
|
//req.Header.Add("Connection", "keep-alive")
|
|
req.Header.Add("Content-Type", "application/json")
|
|
client := &http.Client{}
|
|
res, err := client.Do(req)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
defer res.Body.Close()
|
|
body, err := ioutil.ReadAll(res.Body)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
var responseData struct {
|
|
Ret int `json:"ret"`
|
|
}
|
|
fmt.Println("我是body", string(body))
|
|
err = json.Unmarshal(body, &responseData)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
return responseData.Ret == 0, nil
|
|
}
|
|
|
|
func runAllStepsSlide(data, slideTicket, Ticket, randStr string) (req.ResponseResult, error) {
|
|
fmt.Println("data", data)
|
|
fmt.Println("slideTicket", slideTicket)
|
|
fmt.Println("Ticket", Ticket)
|
|
fmt.Println("randStr", randStr)
|
|
encodedUUID, err := getEncodedUUIDSlide(data)
|
|
if err != nil {
|
|
return req.ResponseResult{}, err
|
|
}
|
|
fmt.Println("我是encodedUUID", encodedUUID)
|
|
if encodedUUID == "" {
|
|
return req.ResponseResult{
|
|
Code: -1,
|
|
Success: false,
|
|
Message: "效验失败",
|
|
Data: nil,
|
|
}, nil
|
|
}
|
|
setCookie, err := precheckSlide(encodedUUID, Ticket)
|
|
if err != nil {
|
|
return req.ResponseResult{}, err
|
|
}
|
|
fmt.Println("我是setCookie", setCookie)
|
|
if setCookie == "" {
|
|
return req.ResponseResult{
|
|
Code: -2,
|
|
Success: false,
|
|
Message: "效验失败",
|
|
Data: nil,
|
|
}, nil
|
|
}
|
|
verifyID, err := getVerifyIDSlide(encodedUUID, setCookie, Ticket)
|
|
if err != nil {
|
|
return req.ResponseResult{}, err
|
|
}
|
|
fmt.Println("我是verifyID", verifyID)
|
|
if verifyID == "" {
|
|
return req.ResponseResult{
|
|
Code: -3,
|
|
Success: false,
|
|
Message: "效验失败",
|
|
Data: nil,
|
|
}, nil
|
|
}
|
|
success, err := submitPinAndCheckSlide(verifyID, encodedUUID, slideTicket, randStr)
|
|
if err != nil {
|
|
return req.ResponseResult{}, err
|
|
}
|
|
var message string
|
|
|
|
if success {
|
|
message = "验证成功,请调用检测二维码继续登录"
|
|
} else {
|
|
message = "验证失败"
|
|
}
|
|
|
|
return req.ResponseResult{
|
|
Code: 0,
|
|
Success: true,
|
|
Message: message,
|
|
Data: nil,
|
|
}, nil
|
|
|
|
}
|
|
|
|
func VerificationcodeSlide(Data req.SlideTicketModel) req.ResponseResult {
|
|
// connectMgr := WXServer.GetWXConnectMgr()
|
|
// iwxConnect := connectMgr.GetWXConnectByUserInfoUUID(queryKey)
|
|
// if iwxConnect == nil {
|
|
// return req.ResponseResult{
|
|
// Code: -8,
|
|
// Success: false,
|
|
// Message: "用户不存在",
|
|
// Data: nil,
|
|
// }
|
|
// }
|
|
// temp_userinfo := iwxConnect.GetWXAccount().GetUserInfo()
|
|
|
|
result, err := runAllStepsSlide(Data.Data62, Data.SlideTicket, Data.Ticket, Data.RandStr)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
// if result.Success {
|
|
// result.Data = temp_userinfo.Ticket
|
|
// }
|
|
return result
|
|
}
|