infoGetter/api/public.go

102 lines
2.7 KiB
Go
Raw Normal View History

2021-12-02 13:19:43 +08:00
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)
}