141 lines
3.9 KiB
Go
141 lines
3.9 KiB
Go
package main
|
|
import (
|
|
"database/sql"
|
|
"encoding/json"
|
|
"fmt"
|
|
_ "github.com/go-sql-driver/mysql"
|
|
"io/ioutil"
|
|
"log"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
)
|
|
type AdDataAll struct {
|
|
BaseResp struct {
|
|
ErrMsg string `json:"err_msg"`
|
|
Ret int `json:"ret"`
|
|
} `json:"base_resp"`
|
|
List []struct {
|
|
AdSlot string `json:"ad_slot"`
|
|
ClickCount int `json:"click_count"`
|
|
ClickRate float64 `json:"click_rate"`
|
|
Date string `json:"date"`
|
|
Ecpm float64 `json:"ecpm"`
|
|
ExposureCount int `json:"exposure_count"`
|
|
ExposureRate float64 `json:"exposure_rate"`
|
|
Income int `json:"income"`
|
|
ReqSuccCount int `json:"req_succ_count"`
|
|
SlotID int64 `json:"slot_id"`
|
|
SlotStr string `json:"slot_str"`
|
|
} `json:"list"`
|
|
Summary struct {
|
|
ClickCount int `json:"click_count"`
|
|
ClickRate float64 `json:"click_rate"`
|
|
Ecpm float64 `json:"ecpm"`
|
|
ExposureCount int `json:"exposure_count"`
|
|
ExposureRate float64 `json:"exposure_rate"`
|
|
Income int `json:"income"`
|
|
ReqSuccCount int `json:"req_succ_count"`
|
|
} `json:"summary"`
|
|
TotalNum int `json:"total_num"`
|
|
}
|
|
|
|
func main() {
|
|
appID := "wx3742274d720f7aa2"
|
|
appSecret := "99898fe4b9e05bea29466933568ad8cc"
|
|
// 获取Access Token
|
|
tokenURL := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", appID, appSecret)
|
|
resp, err := http.Get(tokenURL)
|
|
if err != nil {
|
|
fmt.Println("Failed to get access token.")
|
|
return
|
|
}
|
|
defer resp.Body.Close()
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
fmt.Println("Failed to read response body.")
|
|
return
|
|
}
|
|
|
|
var result map[string]interface{}
|
|
if err := json.Unmarshal(body, &result); err != nil {
|
|
fmt.Println("Failed to parse access token response.")
|
|
return
|
|
}
|
|
accessToken := result["access_token"].(string)
|
|
//---注意替换日期
|
|
adURL := fmt.Sprintf("https://api.weixin.qq.com/publisher/stat?action=publisher_adpos_general&access_token=%s&start_date=2024-04-01&end_date=2024-04-22&page_size=30&page=1",accessToken)
|
|
adResp, err := http.Get(adURL)
|
|
if err != nil {
|
|
fmt.Println("Failed to get ad data.")
|
|
return
|
|
}
|
|
defer adResp.Body.Close()
|
|
con, err := ioutil.ReadAll(adResp.Body)
|
|
if err != nil {
|
|
fmt.Println("Failed to read ad data response body.")
|
|
return
|
|
}
|
|
var adData AdDataAll
|
|
err = json.Unmarshal(con, &adData)
|
|
if err != nil {
|
|
fmt.Println("Error JSON:", err)
|
|
return
|
|
}
|
|
// 连接数据库
|
|
db, err := sql.Open("mysql", "root:123456@tcp(localhost:3306)/wxcj")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer db.Close()
|
|
|
|
err = db.Ping()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
for _,v:=range adData.List{
|
|
appId:=1111 //--切换成本地的app_id
|
|
date:=strings.Replace(v.Date,"-","",-1)
|
|
adSlot:=v.AdSlot
|
|
slotId:=v.SlotID
|
|
income:=v.Income
|
|
reqSuccCount:=v.ReqSuccCount
|
|
exposureCount:=v.ExposureCount
|
|
clickCount:=v.ClickCount
|
|
ecpm:=v.Ecpm
|
|
updatedAt:=time.Now().Unix()
|
|
// 查询某个应用某天某个广告位是否存在
|
|
var id int
|
|
row := db.QueryRow("SELECT id FROM wx_app_advertisement WHERE app_id = ? and date=? and ad_slot=?", appId,date,adSlot)
|
|
err = row.Scan(&id)
|
|
if err != nil {
|
|
if err!=sql.ErrNoRows{
|
|
continue
|
|
}
|
|
}
|
|
if id>0{
|
|
fmt.Printf("appid=%d,日期=%s,广告位=%s 已存在 \n",appId,date,adSlot)
|
|
continue
|
|
}
|
|
// 插入数据到数据库
|
|
stmt, err := db.Prepare("INSERT INTO wx_app_advertisement(`app_id`,`date`,`ad_slot`,`slot_id`,`income`,`req_succ_count`,`exposure_count`,`click_count`,`ecpm`,`updated_at`) VALUES(?,?,?,?,?,?,?,?,?,?)")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer stmt.Close()
|
|
|
|
res, err:= stmt.Exec(appId, date,adSlot,slotId,income,reqSuccCount,exposureCount,clickCount,ecpm,updatedAt)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
continue
|
|
}
|
|
// 获取插入ID
|
|
newId, err := res.LastInsertId()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
continue
|
|
}
|
|
fmt.Printf("Inserted row ID: %d\n", newId)
|
|
}
|
|
}
|