Files
wechat_ipad_pro/api/utils/utils.go
2026-02-17 13:06:23 +08:00

281 lines
12 KiB
Go
Raw Permalink 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 utils
import (
"crypto/md5"
"encoding/hex"
"errors"
"fmt"
"io/ioutil"
"math/rand"
"net/http"
"net/url"
"regexp"
"strconv"
"strings"
"time"
"unsafe"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/protobuf/wechat"
"github.com/lunny/log"
)
func GenDefaultIpadUA() string {
var IPadVersion = int(baseinfo.ClientVersion)
code := IPadVersion
major := 0x0f & (code >> 24)
minor := 0xff & (code >> 16)
patch := 0xff & (code >> 8)
//build := 0xff & (code >> 0)
wxVersion := strconv.Itoa(major) + "." + strconv.Itoa(minor) + "." + strconv.Itoa(patch)
iPadOsVersionS := strings.Replace(baseinfo.IPadOsVersion, ".", "_", -1)
wechatUserAgent := fmt.Sprintf("Mozilla/5.0 (iPad; CPU iPad iPhone OS %s like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/%s(%s) NetType/WIFI Language/zh_CN", iPadOsVersionS, wxVersion, strconv.Itoa(code))
// 打印
log.Info("wechatUserAgent: ", wechatUserAgent)
return wechatUserAgent
}
func ScanIntoGrouppost(URL string) (string, error) {
var err error
postValue := url.Values{
"forBlackberry": {"forceToUsePost"},
}
req, err := http.PostForm(URL, postValue)
if err != nil {
return "", err
}
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
req.Header.Add("Referer", URL)
req.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
req.Header.Add("User-Agent", "MMozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B176 MicroMessenger/4.3.2")
defer req.Body.Close()
body, err := ioutil.ReadAll(req.Body)
if err != nil {
return "", err
}
return string(body), nil
}
var (
DeviceLenError = errors.New("设备长度错误!")
)
func GenerateWxDat(device string) (string, error) {
if len(device) < 32 {
return "", DeviceLenError
}
datByte := []byte(device)
datHex := hex.EncodeToString(datByte)
str := "62706c6973743030d4010203040506090a582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a2070855246e756c6c5f1020" + datHex + "5f100f4e534b657965644172636869766572d10b0c54726f6f74800108111a232d32373a406375787d0000000000000101000000000000000d0000000000000000000000000000007f"
return str, nil
}
func Md5V(str string) string {
h := md5.New()
h.Write([]byte(str))
return hex.EncodeToString(h.Sum(nil))
}
// 识别手机号码
func IsMobile(mobile string) bool {
result, _ := regexp.MatchString(`^(1[3|4|5|8][0-9]\d{4,8})$`, mobile)
if result {
return true
} else {
return false
}
}
/*
**
获取微信html页面
*/
func GetHTML(url string, headList []*wechat.GetA8KeyRespHeader) (string, []string) {
client := &http.Client{}
reqest, _ := http.NewRequest("GET", url, nil)
reqest.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
reqest.Header.Set("Accept-Charset", "utf-8;q=0.7,*;q=0.3")
//reqest.Header.Set("Accept-Encoding", "gzip, default")//这个有乱码,估计是没有解密,或解压缩
reqest.Header.Set("Accept-Encoding", "utf-8") //这就没有乱码了
reqest.Header.Set("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3")
reqest.Header.Set("Cache-Control", "max-age=0")
reqest.Header.Set("Connection", "keep-alive")
reqest.Header.Set("Host", url)
reqest.Header.Set("User-Agent", "MMozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B176 MicroMessenger/8.3.2")
for _, head := range headList {
reqest.Header.Add(head.GetName(), head.GetKey())
}
response, _ := client.Do(reqest)
if response.StatusCode == 200 {
defer response.Body.Close()
body, _ := ioutil.ReadAll(response.Body)
bodystr := string(body)
v := response.Header
b := v["Set-Cookie"]
return bodystr, b //response.Header..Get("Set-Cookie")
}
return "", nil
}
func HttpPost(urls string, data url.Values, cookie []string) string {
client := &http.Client{}
retest, err := http.NewRequest("POST", urls, strings.NewReader(data.Encode()))
if err != nil {
log.Error("Http Post NewRequest出错!")
}
str := strings.Replace(strings.Trim(fmt.Sprint(cookie), "[]"), "HttpOnly", "", -1)
retest.Header.Add("Cookie", str)
retest.Header.Add("Content-Type", "application/x-www-form-urlencoded")
ua := GenDefaultIpadUA()
// retest.Header.Add("User-Agent", "Mozilla/5.0 (iPad; CPU OS 12_4_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.15(0x17000f31) NetType/WIFI Language/zh_CN")
retest.Header.Add("User-Agent", ua)
resp, err := client.Do(retest)
if err != nil {
log.Error("Http Post请求出错!")
return ""
}
// defer resp.Body.Close()
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Error("Http Post请求出错!")
}
return string(body)
}
func HttpGet(urls string, headList []*wechat.GetA8KeyRespHeader) string {
client := &http.Client{}
retest, err := http.NewRequest("GET", urls, nil)
if err != nil {
log.Error("Http Get NewRequest出错!")
}
for _, head := range headList {
retest.Header.Add(head.GetName(), head.GetKey())
}
retest.Header.Add("Accept", "*/*")
retest.Header.Add("Content-Type", "application/octet-stream")
// retest.Header.Add("ResultType", "Byte")
retest.Header.Add("Keep-Alive", "true")
ua := GenDefaultIpadUA()
// retest.Header.Add("User-Agent", "Mozilla/5.0 (iPad; CPU OS 12_4_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.15(0x17000f31) NetType/WIFI Language/zh_CN")
retest.Header.Add("User-Agent", ua)
resp, err := client.Do(retest)
if err != nil {
log.Error("Http Get请求出错!")
return ""
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Error("Http Get请求出错!")
}
return string(body)
}
func BytesString(b []byte) string {
return *(*string)(unsafe.Pointer(&b))
}
// 获取传入的时间所在月份的第一天即某月第一天的0点。如传入time.Now(), 返回当前月份的第一天0点时间。
func GetFirstDateOfMonth(d time.Time) time.Time {
d = d.AddDate(0, 0, -d.Day()+1)
return GetZeroTime(d)
}
// 获取传入的时间所在月份的最后一天即某月最后一天的0点。如传入time.Now(), 返回当前月份的最后一天0点时间。
func GetLastDateOfMonth(d time.Time) time.Time {
return GetFirstDateOfMonth(d).AddDate(0, 1, -1)
}
// 获取某一天的0点时间
func GetZeroTime(d time.Time) time.Time {
return time.Date(d.Year(), d.Month(), d.Day(), 0, 0, 0, 0, d.Location())
}
// 生成随机设备姓名
var lastName = []string{
"赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋",
"沈", "韩", "杨", "朱", "秦", "尤", "许", "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏",
"陶", "姜", "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭",
"郎", "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "任", "袁", "柳", "鲍", "史", "唐", "费", "薛",
"雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "安", "常", "傅", "卞", "齐", "元", "顾", "孟",
"平", "黄", "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "狄", "米", "伏", "成", "戴", "谈",
"宋", "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "梁", "杜", "阮", "蓝", "闵", "季", "贾",
"路", "娄", "江", "童", "颜", "郭", "梅", "盛", "林", "钟", "徐", "邱", "骆", "高", "夏", "蔡", "田",
"樊", "胡", "凌", "霍", "虞", "万", "支", "柯", "管", "卢", "莫", "柯", "房", "裘", "缪", "解", "应",
"宗", "丁", "宣", "邓", "单", "杭", "洪", "包", "诸", "左", "石", "崔", "吉", "龚", "程", "嵇", "邢",
"裴", "陆", "荣", "翁", "荀", "于", "惠", "甄", "曲", "封", "储", "仲", "伊", "宁", "仇", "甘", "武",
"符", "刘", "景", "詹", "龙", "叶", "幸", "司", "黎", "溥", "印", "怀", "蒲", "邰", "从", "索", "赖",
"卓", "屠", "池", "乔", "胥", "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶", "堵",
"冉", "宰", "雍", "桑", "寿", "通", "燕", "浦", "尚", "农", "温", "别", "庄", "晏", "柴", "瞿", "阎",
"连", "习", "容", "向", "古", "易", "廖", "庾", "终", "步", "都", "耿", "满", "弘", "匡", "国", "文",
"寇", "广", "禄", "阙", "东", "欧", "利", "师", "巩", "聂", "关", "荆", "司马", "上官", "欧阳", "夏侯",
"诸葛", "闻人", "东方", "赫连", "皇甫", "尉迟", "公羊", "澹台", "公冶", "宗政", "濮阳", "淳于", "单于",
"太叔", "申屠", "公孙", "仲孙", "轩辕", "令狐", "徐离", "宇文", "长孙", "慕容", "司徒", "司空"}
var firstName = []string{
"伟", "刚", "勇", "毅", "俊", "峰", "强", "军", "平", "保", "东", "文", "辉", "力", "明", "永", "健", "世", "广", "志", "义",
"兴", "良", "海", "山", "仁", "波", "宁", "贵", "福", "生", "龙", "元", "全", "国", "胜", "学", "祥", "才", "发", "武", "新",
"利", "清", "飞", "彬", "富", "顺", "信", "子", "杰", "涛", "昌", "成", "康", "星", "光", "天", "达", "安", "岩", "中", "茂",
"进", "林", "有", "坚", "和", "彪", "博", "诚", "先", "敬", "震", "振", "壮", "会", "思", "群", "豪", "心", "邦", "承", "乐",
"绍", "功", "松", "善", "厚", "庆", "磊", "民", "友", "裕", "河", "哲", "江", "超", "浩", "亮", "政", "谦", "亨", "奇", "固",
"之", "轮", "翰", "朗", "伯", "宏", "言", "若", "鸣", "朋", "斌", "梁", "栋", "维", "启", "克", "伦", "翔", "旭", "鹏", "泽",
"晨", "辰", "士", "以", "建", "家", "致", "树", "炎", "德", "行", "时", "泰", "盛", "雄", "琛", "钧", "冠", "策", "腾", "楠",
"榕", "风", "航", "弘", "秀", "娟", "英", "华", "慧", "巧", "美", "娜", "静", "淑", "惠", "珠", "翠", "雅", "芝", "玉", "萍",
"红", "娥", "玲", "芬", "芳", "燕", "彩", "春", "菊", "兰", "凤", "洁", "梅", "琳", "素", "云", "莲", "真", "环", "雪", "荣",
"爱", "妹", "霞", "香", "月", "莺", "媛", "艳", "瑞", "凡", "佳", "嘉", "琼", "勤", "珍", "贞", "莉", "桂", "娣", "叶", "璧",
"璐", "娅", "琦", "晶", "妍", "茜", "秋", "珊", "莎", "锦", "黛", "青", "倩", "婷", "姣", "婉", "娴", "瑾", "颖", "露", "瑶",
"怡", "婵", "雁", "蓓", "纨", "仪", "荷", "丹", "蓉", "眉", "君", "琴", "蕊", "薇", "菁", "梦", "岚", "苑", "婕", "馨", "瑗",
"琰", "韵", "融", "园", "艺", "咏", "卿", "聪", "澜", "纯", "毓", "悦", "昭", "冰", "爽", "琬", "茗", "羽", "希", "欣", "飘",
"育", "滢", "馥", "筠", "柔", "竹", "霭", "凝", "晓", "欢", "霄", "枫", "芸", "菲", "寒", "伊", "亚", "宜", "可", "姬", "舒",
"影", "荔", "枝", "丽", "阳", "妮", "宝", "贝", "初", "程", "梵", "罡", "恒", "鸿", "桦", "骅", "剑", "娇", "纪", "宽", "苛",
"灵", "玛", "媚", "琪", "晴", "容", "睿", "烁", "堂", "唯", "威", "韦", "雯", "苇", "萱", "阅", "彦", "宇", "雨", "洋", "忠",
"宗", "曼", "紫", "逸", "贤", "蝶", "菡", "绿", "蓝", "儿", "翠", "烟", "小", "轩"}
var lastNameLen = len(lastName)
var firstNameLen = len(firstName)
func GetFullName() string {
rand.Seed(time.Now().UnixNano()) //设置随机数种子
var first string //名
for i := 0; i <= rand.Intn(1); i++ { //随机产生2位或者3位的名
first = fmt.Sprint(firstName[rand.Intn(firstNameLen-1)])
}
//返回姓名
return fmt.Sprintf("%s%s", fmt.Sprint(lastName[rand.Intn(lastNameLen-1)]), first)
}
// HttpPostJSON 发送 JSON POST 请求
func HttpPostJSON(urls string, jsonData string, cookie []string) string {
client := &http.Client{}
retest, err := http.NewRequest("POST", urls, strings.NewReader(jsonData))
if err != nil {
log.Error("Http Post JSON NewRequest出错!")
return ""
}
if cookie != nil && len(cookie) > 0 {
str := strings.Replace(strings.Trim(fmt.Sprint(cookie), "[]"), "HttpOnly", "", -1)
retest.Header.Add("Cookie", str)
}
retest.Header.Add("Content-Type", "application/json")
retest.Header.Add("Accept", "application/json, text/plain, */*")
retest.Header.Add("Origin", "https://channels.weixin.qq.com")
ua := GenDefaultIpadUA()
retest.Header.Add("User-Agent", ua)
resp, err := client.Do(retest)
if err != nil {
log.Error("Http Post JSON请求出错!")
return ""
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Error("Http Post JSON读取响应出错!")
return ""
}
return string(body)
}