/* * url functions */ package network import ( "crypto/md5" "encoding/hex" "errors" "io/ioutil" "net" "net/http" "net/url" "strconv" "strings" "time" "git.tetele.net/tgo/crypter" ) /** * post 请求 */ func FnPost(url, param string) ([]byte, error) { httpClient := &http.Client{} req, err := http.NewRequest("POST", url, strings.NewReader(param)) if err != nil { return []byte(""), err } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") //"application/x-www-form-urlencoded" resp, err := httpClient.Do(req) if err != nil { return []byte(""), err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return []byte(""), err } return body, nil } /** * 取本地IP */ func GetLocalIp() string { addrs, err := net.InterfaceAddrs() if err != nil { return "" } for _, address := range addrs { // 检查ip地址判断是否回环地址 if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { if ipnet.IP.To4() != nil && !ipnet.IP.IsLinkLocalUnicast() { return ipnet.IP.String() } } } return "" } /** * 生成一个token */ func CreateTokenWithTime(sToken string) string { now := time.Now() iNow := now.Format("20060102150405") sToken += iNow h := md5.New() h.Write([]byte(sToken)) // 需要加密的字符串 cipher2Str := h.Sum(nil) return hex.EncodeToString(cipher2Str) // 输出加密结果 } /** * 生成一个token */ // func CreateToken(sToken string) string { // now := time.Now() // iNow := now.Format("20060102150405") // sToken += iNow // h := md5.New() // h.Write([]byte(sToken)) // 需要加密的字符串 // cipher2Str := h.Sum(nil) // sMd5 := hex.EncodeToString(cipher2Str) // 输出加密结果 // tokenEn := crypter.DesEn(sToken, "gzyc8642") // return sMd5 + "|" + ToString(now.Unix()) + "|" + tokenEn // } /** * 验证token */ func CheckToken(token string) (bool, string) { arr := strings.Split(token, "|") if len(arr) != 3 { return false, "" } tokenDes := crypter.DesDe(arr[2], "gzyc8642") tokenTime := tokenDes[len(tokenDes)-14:] timeInt, err := strconv.ParseInt(arr[1], 10, 64) if err != nil { return false, "" } currentTime := time.Unix(timeInt, 0).Format("20060102150405") if currentTime != tokenTime { return false, "" } h := md5.New() h.Write([]byte(tokenDes)) // 需要加密的字符串 cipher2Str := h.Sum(nil) sMd5 := hex.EncodeToString(cipher2Str) // 输出加密结果 if sMd5 == arr[0] { return true, tokenDes[0 : len(tokenDes)-14] } return false, "" } /** * 给参数签名 */ func QuerySign(mQuery map[string]string) string { sParam := "" for k, v := range mQuery { sParam += k + "=" + v + "&" } query, Err := url.ParseQuery(sParam) if Err != nil { return "" } else { return crypter.Md5Password(query.Encode(), "guzeng1") } } /** * 从url中取域名,端口 * 2019/05/20 */ func GetIpPortFromUrl(sUrl string) (string, string, error) { if sUrl == "" { return "", "", errors.New("param error") } if !strings.Contains(sUrl, "http://") && !strings.Contains(sUrl, "https://") { sUrl = "http://" + sUrl } u, err := url.Parse(sUrl) if err != nil { return "", "", err } return u.Hostname(), u.Port(), nil }