first commit

This commit is contained in:
2026-02-17 13:06:23 +08:00
commit 7cbd3d061d
349 changed files with 126558 additions and 0 deletions
+280
View File
@@ -0,0 +1,280 @@
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)
}