unknown 7 жил өмнө
parent
commit
6c045bec2e

+ 5 - 171
src/apiservice/oamanager/content.go

@@ -1,15 +1,12 @@
 package oamanager
 
 import (
-	"log"
-	"net"
-	"net/http"
+	"apiservice/tools"
 	"qfw/util"
 	elastic "qfw/util/elastic"
 	"qfw/util/redis"
 	"regexp"
 	"strings"
-	"sync"
 	"time"
 
 	"github.com/go-xweb/xweb"
@@ -22,29 +19,17 @@ type Content struct {
 
 var regex = regexp.MustCompile("(Android|Mobile)")
 
-//对map的同步
-var lock sync.Mutex
-
-//内存缓存日志数量,超过此数量存库
-var nc = 500
-
-//内存缓存日志map
-var arr = make([]map[string]interface{}, 0)
-var arrapi = make([]map[string]interface{}, 0)
-
 func init() {
 	xweb.AddAction(&Content{})
-	go func() {
-		time.Sleep(1 * time.Minute)
-		SaveLogTask()
-	}()
 }
+
+//
 func (c *Content) Article(id string) {
 	defer util.Catch()
 	client := c.Header("User-Agent")
-	c.Request.Proto = GetIp(c.Request) //ip
+	c.Request.Proto = tools.GetIp(c.Request) //ip
 	var data map[string]interface{}
-	go addLog(c.Request)
+	go tools.AddLog(c.Request, "", "", 0, 0)
 	bm := false //保存用户访问三级页日志
 	bm = regex.MatchString(client)
 	sid_openid := util.DecodeArticleId2ByCheck(id)[0] //解密id
@@ -68,154 +53,3 @@ func (c *Content) Article(id string) {
 		c.Render("/pc/pc.html", &c.T)
 	}
 }
-
-//定时保存日志
-func SaveLogTask() {
-	lock.Lock()
-	if len(arr) >= 1 {
-		tmp := arr
-		arr = make([]map[string]interface{}, 0)
-		go func() {
-			log.Println("timer..save..article..log", len(tmp))
-			mongodb.SaveBulk("log", tmp...)
-		}()
-	}
-	if len(arrapi) >= 1 {
-		tmp1 := arrapi
-		arrapi = make([]map[string]interface{}, 0)
-		go func() {
-			log.Println("timer..save..api..log", len(tmp1))
-			mongodb.SaveBulk("log", tmp1...)
-		}()
-	}
-	lock.Unlock()
-	time.AfterFunc(5*time.Minute, SaveLogTask)
-}
-func addLog(req *http.Request) {
-	timeNow := time.Now()
-	agent := req.Header.Get("user-agent")
-	ref := req.Referer()
-	s_url := req.RequestURI
-	date := timeNow.Unix()
-	logs := map[string]interface{}{
-		"l_date":     date,
-		"s_ip":       req.Proto,
-		"s_refer":    ref,
-		"i_year":     timeNow.Year(),
-		"i_month":    timeNow.Month(),
-		"i_day":      timeNow.Day(),
-		"i_hour":     timeNow.Hour(),
-		"i_minutes":  timeNow.Minute(),
-		"s_describe": req.Form,
-		"s_client":   agent,
-		"s_os":       GetOS(agent),
-		"s_browse":   GetBrowse(agent),
-		"s_method":   req.Method,
-		"s_url":      s_url,
-	}
-	lock.Lock()
-	arr = append(arr, logs)
-	if len(arr) >= nc {
-		tmp := arr
-		arr = make([]map[string]interface{}, 0)
-		go func() {
-			log.Println("save..article..log", len(tmp))
-			mongodb.SaveBulk("log", tmp...)
-		}()
-	}
-	lock.Unlock()
-}
-
-func APIlog(username, action, keyword, appid, rMsg, signature string, pagenum, timestamp, rCode, apicount int) {
-	defer util.Catch()
-	logs := map[string]interface{}{
-		"s_username":  username,
-		"s_keyword":   keyword,
-		"s_appid":     appid,
-		"s_rMsg":      rMsg,
-		"s_signature": signature,
-		"s_action":    action,
-		"i_pagenum":   pagenum,
-		"i_timestamp": timestamp,
-		"i_rCode":     rCode,
-		"i_apicount":  apicount,
-		"l_date":      time.Now().Unix(),
-	}
-	lock.Lock()
-	arrapi = append(arrapi, logs)
-	if len(arrapi) >= nc {
-		tmp := arrapi
-		arrapi = make([]map[string]interface{}, 0)
-		go func() {
-			log.Println("save..api..log", len(tmp))
-			mongodb.SaveBulk("apilog", tmp...)
-		}()
-	}
-	lock.Unlock()
-}
-
-//获取平台类型
-func GetOS(useros string) string {
-	osVersion := "其他"
-	if strings.Contains(useros, "NT 6.0") {
-		osVersion = "Windows Vista/Server 2008"
-	} else if strings.Contains(useros, "NT 5.2") {
-		osVersion = "Windows Server 2003"
-	} else if strings.Contains(useros, "NT 5.1") {
-		osVersion = "Windows XP"
-	} else if strings.Contains(useros, "NT 5") {
-		osVersion = "Windows 2000"
-	} else if strings.Contains(useros, "Mac") {
-		osVersion = "Mac"
-	} else if strings.Contains(useros, "Unix") {
-		osVersion = "UNIX"
-	} else if strings.Contains(useros, "Linux") {
-		osVersion = "Linux"
-	} else if strings.Contains(useros, "SunOS") {
-		osVersion = "SunOS"
-	} else if strings.Contains(useros, "NT 6.3") {
-		osVersion = "Window8"
-	} else if strings.Contains(useros, "NT 6.1") {
-		osVersion = "Window7"
-	} else if strings.Contains(useros, "NT 10.0") {
-		osVersion = "Window10"
-	}
-	return osVersion
-}
-
-//获取浏览器类型
-func GetBrowse(userbrowser string) string {
-	browserVersion := "其他"
-	if strings.Contains(userbrowser, "MSIE") {
-		browserVersion = "IE"
-	} else if strings.Contains(userbrowser, "Firefox") {
-		browserVersion = "Firefox"
-	} else if strings.Contains(userbrowser, "Chrome") {
-		browserVersion = "Chrome"
-	} else if strings.Contains(userbrowser, "Safari") {
-		browserVersion = "Safari"
-	} else if strings.Contains(userbrowser, "rv:11.0") {
-		browserVersion = "IE11"
-	}
-
-	return browserVersion
-}
-
-//获取请求ip
-func GetIp(req *http.Request) string {
-	ip_for := req.Header.Get("x-forwarded-for")
-	ip_client := req.Header.Get("http_client_ip")
-	ip_addr := req.Header.Get("Remote_addr")
-	un := "unknown"
-	if (ip_for != un) && (len(strings.TrimSpace(ip_for)) > 0) {
-		return ip_for
-	}
-	if (ip_client != un) && (len(strings.TrimSpace(ip_client)) > 0) {
-		return ip_client
-	}
-	if (ip_addr != un) && (len(strings.TrimSpace(ip_addr)) > 0) {
-		return ip_addr
-	}
-	ip, _, _ := net.SplitHostPort(req.RemoteAddr)
-	return ip
-}

+ 64 - 33
src/apiservice/oamanager/oamanager.go

@@ -22,6 +22,7 @@ import (
 	"sort"
 	"strconv"
 	"strings"
+	"sync"
 	"time"
 
 	"github.com/go-xweb/xweb"
@@ -60,13 +61,31 @@ const (
 	LIMIT_LIST_COUNT = 100
 )
 
-var APPID, SECRET string
+type User struct {
+	username  string
+	appid     string
+	ip_blimit bool
+	ip        map[string]bool
+	secret    string
+	ordernum  int
+	status    int
+}
+
+var UserLock = sync.Mutex{}
+var UserMap = map[string]*User{}
 
 //
 func (o *Oamanager) Index() error {
 	return o.Render("/pc/article.html")
 }
 
+func ClearUserMap(w http.ResponseWriter, r *http.Request) {
+	UserLock.Lock()
+	UserMap = map[string]*User{}
+	log.Println("清空操作:", UserMap)
+	UserLock.Unlock()
+}
+
 //
 func OpenAction(w http.ResponseWriter, r *http.Request) {
 	defer util.Catch()
@@ -97,47 +116,60 @@ func OpenAction(w http.ResponseWriter, r *http.Request) {
 				rMsg = MSG_E3
 			} else {
 				apicount = redis.GetInt(REDISDB, "jyoacount-"+appid+oaday)
-				log.Println("每天调用次数:", apicount)
 				if apicount >= LIMIT_COUNT { //调用接口上限判断
 					rCode = CODE_E4 //调用接口超过限制
 					rMsg = MSG_E4
 				} else {
-					res, ok := mongodb.FindOneByField("user", &map[string]interface{}{
-						"appid": appid,
-					}, nil)
-					if !ok {
-						rCode = CODE_E5 //内部错误
-						rMsg = MSG_E5
+					UserLock.Lock()
+					user := UserMap[appid]
+					if user == nil {
+						res, ok := mongodb.FindOneByField("user", &map[string]interface{}{
+							"appid": appid,
+						}, nil)
+						if ok && len(*res) > 0 {
+							user = &User{}
+							user.appid = appid
+							user.secret = util.ObjToString((*res)["secret"])
+							ip := util.ObjToString((*res)["userip"])
+							if ip == "*" {
+								user.ip_blimit = true
+							} else {
+								ips := strings.Split(ip, ",")
+								user.ip = map[string]bool{}
+								for _, k := range ips {
+									user.ip[k] = true
+								}
+							}
+							user.status = util.IntAll((*res)["status"])
+							user.ordernum = util.IntAll((*res)["ordernum"])
+							UserMap[appid] = user
+						}
+						if !ok {
+							rCode = CODE_E5 //内部错误
+							rMsg = MSG_E5
+						}
 					}
-					if len(*res) > 0 && (*res)["status"] == 1 { //查看用户是否存在
+					UserLock.Unlock()
+					if user != nil && user.status == 1 { //查看用户是否存在
 						userip := GetAPIIP(r)
-						log.Println(userip, "-ip--", (*res)["userip"])
 						var sign string
-						if (*res)["userip"] == userip { //验证用户ip
-							APPID = appid
-							SECRET = util.ObjToString((*res)["secret"])
+						log.Println(userip, "-ip--", user.ip)
+						if user.ip_blimit || user.ip[userip] { //验证用户ip
+							//SECRET = util.ObjToString((*res)["secret"])
+							params := [][]string{
+								[]string{"keyword", keyword},
+								[]string{"appid", appid},
+								[]string{"timestamp", strconv.Itoa(timestamp)}}
 							if r.FormValue("pagenum") == "" {
 								pagenum = 1
-								sign = GET(action, [][]string{
-									[]string{"keyword", keyword},
-									[]string{"appid", appid},
-									[]string{"timestamp", strconv.Itoa(timestamp)},
-									//[]string{"pagenum", strconv.Itoa(pagenum)},
-								})
 							} else {
-								sign = GET(action, [][]string{
-									[]string{"keyword", keyword},
-									[]string{"appid", appid},
-									[]string{"timestamp", strconv.Itoa(timestamp)},
-									[]string{"pagenum", strconv.Itoa(pagenum)},
-								})
+								params = append(params, []string{"pagenum", strconv.Itoa(pagenum)})
 							}
-							log.Println(signature, "签名串:", sign)
-							ordernum := (*res)["ordernum"].(int)
+							sign = Signature(action, params, user.secret)
 							if sign == signature { //签名串验证
-								username = util.ObjToString((*res)["username"])
+								username = user.username
 								if action == "getdata" {
-									rData["data"] = GetData(pagenum, keyword, ordernum)
+									rData["data"] = GetData(pagenum, keyword, user.ordernum)
 									redis.Put(REDISDB, "jyoacount-"+appid+oaday, apicount+1, 24*60*60)
 								} else {
 									rCode = CODE_E1 //签名错误
@@ -162,7 +194,7 @@ func OpenAction(w http.ResponseWriter, r *http.Request) {
 		rCode = CODE_E1 //签名错误
 		rMsg = MSG_E1
 	}
-	go APIlog(username, action, keyword, appid, rMsg, signature, pagenum, timestamp, rCode, apicount)
+	go tools.AddLog(r, username, rMsg, rCode, apicount)
 	if rCode == 0 {
 		w.Header().Set("Accept-Charset", "utf-8")
 		w.Header().Set("Content-Type", "application/json")
@@ -219,8 +251,7 @@ func GetAPIIP(req *http.Request) string {
 	return ip
 }
 
-//GET请求
-func GET(action string, param [][]string) (signedStr string) {
+func Signature(action string, param [][]string, secret string) (signedStr string) {
 	ps := &paramSorter{[]string{}, []string{}}
 	ps.Keys = append(ps.Keys, "action")
 	ps.Vals = append(ps.Vals, action)
@@ -234,7 +265,7 @@ func GET(action string, param [][]string) (signedStr string) {
 	reqStr := ps.String()
 	str := percentEncode(reqStr)
 	str = SP(str, "%3A", "%253A", -1)
-	h := hmac.New(func() hash.Hash { return sha1.New() }, []byte(SECRET+"&"))
+	h := hmac.New(func() hash.Hash { return sha1.New() }, []byte(secret+"&"))
 	io.WriteString(h, str)
 	signedStr = base64.StdEncoding.EncodeToString(h.Sum(nil))
 	return

+ 153 - 0
src/apiservice/tools/log.go

@@ -0,0 +1,153 @@
+package tools
+
+import (
+	"log"
+	"net"
+	"net/http"
+	"strings"
+	"sync"
+	"time"
+)
+
+//对map的同步
+var lock sync.Mutex
+
+//内存缓存日志数量,超过此数量存库
+var nc = 500
+
+//内存缓存日志map
+var arr = make([]map[string]interface{}, 0)
+
+func init() {
+	go func() {
+		time.Sleep(1 * time.Minute)
+		SaveLogTask()
+	}()
+}
+
+//定时保存日志
+func SaveLogTask() {
+	lock.Lock()
+	if len(arr) >= 1 {
+		tmp := arr
+		arr = make([]map[string]interface{}, 0)
+		go func() {
+			log.Println("timer..save..log", len(tmp))
+			MQFW.SaveBulk("log", tmp...)
+		}()
+	}
+	lock.Unlock()
+	time.AfterFunc(1*time.Minute, SaveLogTask)
+}
+
+//
+func AddLog(req *http.Request, username, msg string, code, apicount int) {
+	timeNow := time.Now()
+	agent := req.Header.Get("user-agent")
+	ref := req.Referer()
+	s_url := req.RequestURI
+	date := timeNow.Unix()
+	logs := map[string]interface{}{
+		"l_date":      date,
+		"s_ip":        req.Proto,
+		"s_refer":     ref,
+		"i_year":      timeNow.Year(),
+		"i_month":     timeNow.Month(),
+		"i_day":       timeNow.Day(),
+		"i_hour":      timeNow.Hour(),
+		"i_minutes":   timeNow.Minute(),
+		"s_describe":  req.Form,
+		"s_client":    agent,
+		"s_os":        GetOS(agent),
+		"s_browse":    GetBrowse(agent),
+		"s_method":    req.Method,
+		"s_url":       s_url,
+		"s_username":  username,
+		"s_keyword":   req.FormValue("keyword"),
+		"s_appid":     req.FormValue("appid"),
+		"s_rMsg":      msg,
+		"s_signature": req.FormValue("signature"),
+		"s_action":    req.FormValue("action"),
+		"s_pagenum":   req.FormValue("pagenum"),
+		"s_timestamp": req.FormValue("timestamp"),
+		"i_rCode":     code,
+		"i_apicount":  apicount,
+	}
+	lock.Lock()
+	arr = append(arr, logs)
+	if len(arr) >= nc {
+		tmp := arr
+		arr = make([]map[string]interface{}, 0)
+		go func() {
+			log.Println("save..article..log", len(tmp))
+			MQFW.SaveBulk("log", tmp...)
+		}()
+	}
+	lock.Unlock()
+}
+
+//获取平台类型
+func GetOS(useros string) string {
+	osVersion := "其他"
+	if strings.Contains(useros, "NT 6.0") {
+		osVersion = "Windows Vista/Server 2008"
+	} else if strings.Contains(useros, "NT 5.2") {
+		osVersion = "Windows Server 2003"
+	} else if strings.Contains(useros, "NT 5.1") {
+		osVersion = "Windows XP"
+	} else if strings.Contains(useros, "NT 5") {
+		osVersion = "Windows 2000"
+	} else if strings.Contains(useros, "Mac") {
+		osVersion = "Mac"
+	} else if strings.Contains(useros, "Unix") {
+		osVersion = "UNIX"
+	} else if strings.Contains(useros, "Linux") {
+		osVersion = "Linux"
+	} else if strings.Contains(useros, "SunOS") {
+		osVersion = "SunOS"
+	} else if strings.Contains(useros, "NT 6.3") {
+		osVersion = "Window8"
+	} else if strings.Contains(useros, "NT 6.1") {
+		osVersion = "Window7"
+	} else if strings.Contains(useros, "NT 10.0") {
+		osVersion = "Window10"
+	}
+	return osVersion
+}
+
+//获取浏览器类型
+func GetBrowse(userbrowser string) string {
+	browserVersion := "其他"
+	if strings.Contains(userbrowser, "MSIE") {
+		browserVersion = "IE"
+	} else if strings.Contains(userbrowser, "Firefox") {
+		browserVersion = "Firefox"
+	} else if strings.Contains(userbrowser, "Chrome") {
+		browserVersion = "Chrome"
+	} else if strings.Contains(userbrowser, "Safari") {
+		browserVersion = "Safari"
+	} else if strings.Contains(userbrowser, "rv:11.0") {
+		browserVersion = "IE11"
+	}
+
+	return browserVersion
+}
+
+//获取请求ip
+func GetIp(req *http.Request) string {
+	ip_for := req.Header.Get("x-forwarded-for")
+	ip_client := req.Header.Get("http_client_ip")
+	ip_addr := req.Header.Get("Remote_addr")
+	un := "unknown"
+	if (ip_for != un) && (len(strings.TrimSpace(ip_for)) > 0) {
+		return ip_for
+	}
+	if (ip_client != un) && (len(strings.TrimSpace(ip_client)) > 0) {
+		return ip_client
+	}
+	if (ip_addr != un) && (len(strings.TrimSpace(ip_addr)) > 0) {
+		return ip_addr
+	}
+	ip, _, _ := net.SplitHostPort(req.RemoteAddr)
+	return ip
+}

+ 1 - 0
src/main.go

@@ -23,6 +23,7 @@ func main() {
 		//
 		mux1 := http.NewServeMux()
 		mux1.HandleFunc("/open", OpenAction)
+		mux1.HandleFunc("/open/clear_u_m", ClearUserMap)
 		xweb.RunBase(":"+Sysconfig["webport"].(string), mux1)
 	}()
 	b := make(chan bool, 1)