Skip to content

Commit

Permalink
update track request
Browse files Browse the repository at this point in the history
  • Loading branch information
wenweihu86 committed Oct 21, 2017
1 parent 82a749d commit 1bdcb6c
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 73 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,6 @@
.glide/
.idea
.DS_Store
data-test
log
ad_server
7 changes: 7 additions & 0 deletions conf/ad_server.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# ip字典
GeoBlockFileName = "./data/GeoLiteCity-Blocks.csv"
GeoLocationFileName = "./data/GeoLiteCity-Location.csv"

# 广告字典
AdFileName = "./data/ad_info.txt"

# 1:debug 2:info 3:warn 4:error 5:fatal
Expand All @@ -8,3 +11,7 @@ AdServerLogFileName = "./log/ad_server.log"
SearchLogFileName = "./log/ad_search.log"
ImpressionLogFileName = "./log/ad_impression.log"
ClickLogFileName = "./log/ad_click.log"

# track url
ImpressionTrackUrlPrefix = "http://localhost:8001/ad/impression"
ClickTrackUrlPrefix = "http://localhost:8001/ad/click"
112 changes: 62 additions & 50 deletions src/adhandler/click_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,73 +6,85 @@ import (
"adserver"
"encoding/base64"
"fmt"
"net/url"
)

func ClickHandler(w http.ResponseWriter, r *http.Request) {
//获得编码后的查询字符串
queryStringEncoded := r.URL.RawQuery
//解码
queryStringDecodedBytes , err := base64.StdEncoding.DecodeString(queryStringEncoded)
if err != nil {
return
}
r.URL.RawQuery = string(queryStringDecodedBytes)

r.ParseForm()
req := new(adserver.Request)
// app_id
if len(r.Form["app_id"]) > 0 {
appId, _ := strconv.ParseUint(r.Form["app_id"][0], 10, 32)
req.AppId = uint32(appId)
if len(r.Form["i"]) == 0 {
w.Write([]byte("{\"status\": 1}"))
return
}
// slot_id
if len(r.Form["slot_id"]) > 0 {
slotId, _ := strconv.ParseUint(r.Form["slot_id"][0], 10, 32)
req.SlotId = uint32(slotId)
i := r.Form["i"][0]
queryStringBytes, err := base64.StdEncoding.DecodeString(i)
if err != nil {
w.Write([]byte("{\"status\": 1}"))
return
}
queryString := string(queryStringBytes)
paramMap, _ := url.ParseQuery(queryString)

// search_id
var searchId string
if searchIds, exist := paramMap["search_id"]; exist {
searchId = searchIds[0]
}
// ad_num
if len(r.Form["ad_num"]) > 0 {
adNum, _ := strconv.ParseUint(r.Form["ad_num"][0], 10, 32)
req.AdNum = uint32(adNum)

// slot_id
var slotId uint32
if slotIds, exist := paramMap["slot_id"]; exist {
tmpInt, _ := strconv.ParseUint(slotIds[0], 10, 32)
slotId = uint32(tmpInt)
}

// ip
if len(r.Form["ip"]) > 0 {
req.Ip = r.Form["ip"][0]
var ip string
if ips, exist := paramMap["ip"]; exist {
ip = ips[0]
}

// device_id
if len(r.Form["device_id"]) > 0 {
req.DeviceId = r.Form["device_id"][0]
var deviceId string
if deviceIds, exist := paramMap["device_id"]; exist {
deviceId = deviceIds[0]
}

// os
if len(r.Form["os"]) > 0 {
os, _ := strconv.ParseUint(r.Form["os"][0], 10, 32)
req.Os = uint32(os)
var os uint32
if osString, exist := paramMap["os"]; exist {
tmpInt, _ := strconv.ParseUint(osString[0], 10, 32)
os = uint32(tmpInt)
}
// os_version
if len(r.Form["os_version"]) > 0 {

req.OsVersion = r.Form["os_version"][0]
}
//unit_id
if len(r.Form["unit_id"]) > 0 {
unit, _ := strconv.ParseUint(r.Form["unit_id"][0], 10, 32)
req.UnitId = uint32(unit)
// os_version
var osVersion string
if osVersions, exist := paramMap["os_version"]; exist {
osVersion = osVersions[0]
}
//creative_id
if len(r.Form["creative_id"]) > 0 {
creativeId, _ := strconv.ParseUint(r.Form["creative_id"][0], 10, 32)
req.CreativeId = uint32(creativeId)

// unit_id
var unitId uint32
if unitIdString, exist := paramMap["unit_id"]; exist {
tmpInt, _ := strconv.ParseUint(unitIdString[0], 10, 32)
unitId = uint32(tmpInt)
}
//search_id
if len(r.Form["search_id"]) > 0 {
req.SearchId = r.Form["search_id"][0]

// creative_id
var creativeId uint32
if creativeIdString, exist := paramMap["creative_id"]; exist {
tmp, _ := strconv.ParseUint(creativeIdString[0], 10, 32)
creativeId = uint32(tmp)
}
//click_url
if len(r.Form["click_url"]) > 0 {
req.ClickUrl = r.Form["click_url"][0]

// click_url
var clickUrl string
if clickUrls, exist := paramMap["click_url"]; exist {
clickUrl = clickUrls[0]
}
adserver.AdServerLog.Debug(fmt.Sprintf("ClickHandler click_url=%s", clickUrl))

adserver.ClickLog.Info(fmt.Sprintf(
"searchId=%s slotId=%d ip=%s os=%d unit_id=%d creativeId=%d",
req.SearchId, req.SlotId, req.Ip, req.Os, req.UnitId, req.CreativeId))
// TODO: 302跳转到click url
"searchId=%s slotId=%d ip=%s deviceId=%s os=%d osVersion=%s unit_id=%d creativeId=%d",
searchId, slotId, ip, deviceId, os, osVersion, unitId, creativeId))
http.Redirect(w, r, clickUrl, http.StatusFound)
}
54 changes: 37 additions & 17 deletions src/adhandler/search_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,12 @@ import (
"fmt"
"bytes"
"encoding/base64"
"github.com/satori/go.uuid"
)

func SearchHandler(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
req := new(adserver.Request)
// app_id
if len(r.Form["app_id"]) > 0 {
appId, _ := strconv.ParseUint(r.Form["app_id"][0], 10, 32)
req.AppId = uint32(appId)
}
// slot_id
if len(r.Form["slot_id"]) > 0 {
slotId, _ := strconv.ParseUint(r.Form["slot_id"][0], 10, 32)
Expand Down Expand Up @@ -49,6 +45,9 @@ func SearchHandler(w http.ResponseWriter, r *http.Request) {
req.OsVersion = r.Form["os_version"][0]
}

// searchId
req.SearchId = uuid.NewV4().String()

// search by request ip
adDict := adserver.AdDict
var unitIdList1 []uint32
Expand Down Expand Up @@ -102,21 +101,22 @@ func SearchHandler(w http.ResponseWriter, r *http.Request) {
ClickUrl: adCreative.ClickUrl,
}
adInfo.ImpressionTrackUrl = buildImpressionTrackUrl(req, adInfo)
adInfo.ClickTrackUrl = buildClickTrackUrl(req, adInfo)
adList := make([]adserver.AdInfo, 0, 1)
adList = append(adList, adInfo)
res.ResCode = 0
res.AdList = adList
adserver.SearchLog.Info(fmt.Sprintf(
"appId=%d slotId=%d adNum=%d iP=%s deviceId=%s oS=%d osVersion=%s " +
"unitId=%d creativeId=%d IconImageUrl=%s ClickUrl=%s\n",
req.AppId, req.SlotId, req.AdNum, req.Ip, req.DeviceId, req.Os, req.OsVersion,
adInfo.UnitId, adInfo.CreativeId, adInfo.IconImageUrl, adInfo.ClickUrl))
"searchId=%s slotId=%d adNum=%d iP=%s deviceId=%s oS=%d osVersion=%s " +
"unitId=%d creativeId=%d\n",
req.SearchId, req.SlotId, req.AdNum, req.Ip, req.DeviceId, req.Os, req.OsVersion,
adInfo.UnitId, adInfo.CreativeId))
} else {
res.ResCode = 0
res.AdList = make([]adserver.AdInfo, 0, 1)
adserver.SearchLog.Info(fmt.Sprintf(
"appId=%d slotId=%d adNum=%d iP=%s deviceId=%s oS=%d osVersion=%s resNum=0\n",
req.AppId, req.SlotId, req.AdNum, req.Ip, req.DeviceId, req.Os, req.OsVersion))
"searchId=%s slotId=%d adNum=%d iP=%s deviceId=%s oS=%d osVersion=%s resNum=0\n",
req.SearchId, req.SlotId, req.AdNum, req.Ip, req.DeviceId, req.Os, req.OsVersion))
}

resBytes, _ := json.Marshal(res)
Expand All @@ -125,14 +125,34 @@ func SearchHandler(w http.ResponseWriter, r *http.Request) {

func buildImpressionTrackUrl(req *adserver.Request, adInfo adserver.AdInfo) string {
var paramBuf bytes.Buffer
paramBuf.WriteString(fmt.Sprintf("slotId=%s", req.SlotId))
paramBuf.WriteString(fmt.Sprintf("ip=%s", req.Ip))
paramBuf.WriteString(fmt.Sprintf("os=%d", req.Os))
paramBuf.WriteString(fmt.Sprintf("unitId=%s", adInfo.UnitId))
paramBuf.WriteString(fmt.Sprintf("creativeId=%s", adInfo.CreativeId))
paramBuf.WriteString(fmt.Sprintf("search_id=%s", req.SearchId))
paramBuf.WriteString(fmt.Sprintf("&slot_id=%d", req.SlotId))
paramBuf.WriteString(fmt.Sprintf("&ip=%s", req.Ip))
paramBuf.WriteString(fmt.Sprintf("&device_id=%s", req.DeviceId))
paramBuf.WriteString(fmt.Sprintf("&os=%d", req.Os))
paramBuf.WriteString(fmt.Sprintf("&os_version=%s", req.OsVersion))
paramBuf.WriteString(fmt.Sprintf("&unit_id=%d", adInfo.UnitId))
paramBuf.WriteString(fmt.Sprintf("&creative_id=%d", adInfo.CreativeId))
paramEncoded := base64.StdEncoding.EncodeToString(paramBuf.Bytes())
impressionTrackUrl := fmt.Sprintf("%s?i=%s",
adserver.GlobalConfObject.ImpressionTrackUrlPrefix, paramEncoded)
return impressionTrackUrl
}

func buildClickTrackUrl(req *adserver.Request, adInfo adserver.AdInfo) string {
var paramBuf bytes.Buffer
paramBuf.WriteString(fmt.Sprintf("search_id=%s", req.SearchId))
paramBuf.WriteString(fmt.Sprintf("&slot_id=%d", req.SlotId))
paramBuf.WriteString(fmt.Sprintf("&ip=%s", req.Ip))
paramBuf.WriteString(fmt.Sprintf("&device_id=%s", req.DeviceId))
paramBuf.WriteString(fmt.Sprintf("&os=%d", req.Os))
paramBuf.WriteString(fmt.Sprintf("&os_version=%s", req.OsVersion))
paramBuf.WriteString(fmt.Sprintf("&unit_id=%d", adInfo.UnitId))
paramBuf.WriteString(fmt.Sprintf("&creative_id=%d", adInfo.CreativeId))
paramBuf.WriteString(fmt.Sprintf("&click_url=%s", adInfo.ClickUrl))
paramEncoded := base64.StdEncoding.EncodeToString(paramBuf.Bytes())
impressionTrackUrl := fmt.Sprintf("%s?i=%s",
"http://localhost:8001/ad/impression", paramEncoded)
adserver.GlobalConfObject.ClickTrackUrlPrefix, paramEncoded)
return impressionTrackUrl
}

9 changes: 5 additions & 4 deletions src/adserver/ad_log.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ package adserver

import "github.com/ibbd-dev/go-async-log"

var AdServerLog *asyncLog.LogFile
var SearchLog *asyncLog.LogFile
var ImpressionLog *asyncLog.LogFile
var ClickLog *asyncLog.LogFile
var AdServerLog *asyncLog.LogFile // 除了检索、展现、点击监控外,所以日志都用这个log打印
var SearchLog *asyncLog.LogFile // 每个检索请求打印一行日志
var ImpressionLog *asyncLog.LogFile // 每条展现请求打印一行日志
var ClickLog *asyncLog.LogFile // 每条点击请求打印一行日志

/*
* ibbd-dev/go-async-log 日志框架说明
Expand All @@ -14,6 +14,7 @@ var ClickLog *asyncLog.LogFile
* 3. 批量写入周期:默认每秒写入一次
* 4. 是否需要Flags:默认需要
*/
// TODO: 让日志支持format打印
func InitLog(globalConfObject *GlobalConf) {
AdServerLog = asyncLog.NewLevelLog(globalConfObject.AdServerLogFileName,
asyncLog.Priority(globalConfObject.LogLevel))
Expand Down
5 changes: 5 additions & 0 deletions src/adserver/global_conf.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ type GlobalConf struct {
SearchLogFileName string
ImpressionLogFileName string
ClickLogFileName string
// track url prefix
ImpressionTrackUrlPrefix string
ClickTrackUrlPrefix string
}

var GlobalConfObject *GlobalConf
Expand Down Expand Up @@ -43,4 +46,6 @@ func LoadGlobalConf(configPath, configFileName string) {
fmt.Printf("SearchLogFileName=%s\n", GlobalConfObject.SearchLogFileName)
fmt.Printf("ImpressionLogFileName=%s\n", GlobalConfObject.ImpressionLogFileName)
fmt.Printf("ClickLogFileName=%s\n", GlobalConfObject.ClickLogFileName)
fmt.Printf("ImpressionTrackUrlPrefix=%s\n", GlobalConfObject.ImpressionTrackUrlPrefix)
fmt.Printf("ClickTrackUrlPrefix=%s\n", GlobalConfObject.ClickTrackUrlPrefix)
}
3 changes: 1 addition & 2 deletions src/adserver/request.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package adserver

type Request struct {
AppId uint32
SearchId string
SlotId uint32
AdNum uint32
Ip string
Expand All @@ -10,6 +10,5 @@ type Request struct {
OsVersion string
UnitId uint32
CreativeId uint32
SearchId string
ClickUrl string
}

0 comments on commit 1bdcb6c

Please sign in to comment.