mywrok/wx.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)
}
}