package api //爬虫的参数组装,返回结构体解析,存入数据库的方法有关的包 import ( "crypto/md5" "encoding/hex" "encoding/json" "errors" ctxLogger "github.com/luizsuper/ctxLoggers" "github.com/spf13/cast" "go.uber.org/zap" "gorm.io/driver/mysql" "gorm.io/gorm" "io" "io/ioutil" "net/http" "strings" "time" ) //针对http访问,checkSum计算的抽象 var ( M = make(map[string]string) DB = new(gorm.DB) ) const o = `$&*#$%YSGHsghdfg256456857ughdgfEYTHFDBNF5678hncg~!@#$%&$&Uxvcbdfget2577ifhnxgfart$%^&@#$%@%&ghsdft256WRETsgsr623$%TStw45` //todo:配置文件 //初始化DB,以及请求的 func init() { err := errors.New("") dsn := "root:123456qwe@tcp(127.0.0.1:3306)/mijuan?charset=utf8mb4&parseTime=True&loc=Local" DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { ctxLogger.Error(nil, "DB connect err", zap.String("reason", err.Error())) } M["Content-Type"] = "application/json" M["version"] = "1.1.9" //todo: nonce 提取出来 M["nonce"] = "0.5794467510454496" M["curTime"] = cast.ToString(TimeToUnix(time.Now())) M["clientVersion"] = "3.0.0" M["userToken"] = "" M["clientType"] = "2" M["cityCode"] = "310000" M["mobileType"] = "2" } // TimeToUnix 转化为13位时间戳 func TimeToUnix(e time.Time) int64 { timeUnix, _ := time.Parse("2006-01-02 15:04:05", e.Format("2006-01-02 15:04:05")) return timeUnix.UnixNano() / 1e6 } func GetCheckSum(u string) string { a := 0.5794467510454496 toString := cast.ToString(a) s := toString + u + o bytes := []byte(s) h := md5.New() h.Write(bytes) k := hex.EncodeToString(h.Sum(nil)) return k } func Attach(url, getCheckSum string, sbody interface{}, headers map[string]string, marshalFunc func(req, body []byte) (interface{}, error)) (interface{}, error) { M["checkSum"] = getCheckSum body, err := PostHeader(url, sbody, headers, marshalFunc) if err != nil { return nil, err } return body, nil } func PostHeader(url string, sbody interface{}, headers map[string]string, marshalFunc func(req, body []byte) (resp interface{}, err error)) (interface{}, error) { client := &http.Client{} marshal, err := json.Marshal(sbody) if err != nil { return nil, err } req, err := http.NewRequest("POST", url, strings.NewReader(cast.ToString(marshal))) if err != nil { return nil, err } for key, header := range headers { req.Header.Set(key, header) } resp, err := client.Do(req) defer func(Body io.ReadCloser) { err := Body.Close() if err != nil { ctxLogger.Error(nil, "net body close error", zap.String("errReason", err.Error())) } }(resp.Body) body, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } return marshalFunc(marshal, body) }