Adapi:个人广告管理API服务的探索与实现

需积分: 9 0 下载量 92 浏览量 更新于2024-12-21 收藏 12KB ZIP 举报
资源摘要信息:"adapi是一个个人广告管理API服务,它提供了一系列的处理程序用于构建个性化的广告服务。这个服务使用JSON格式作为其主要的数据交换格式。在adapi中,广告被视为在播放时间内的一种接口。播放时间是指给定广告需要播放的时间段。而频道是一个具有时间表的对象,每个播放时间都限制在特定时间段内。播放时间包含实际播放内容以及广告播放。adapi的存储机制非常灵活,它允许与任何满足特定接口的存储方案进行配合使用。目前,adapi仅能与实现了如下接口的存储方案一起使用: ``` type Store interface { Set(key interface{}, value interface{}) error Get(key interface{}) (value interface{}, err error) } ``` 该接口要求实现两个方法:Set和Get,分别用于存储和检索数据。 adapi服务的标题和描述中涉及的关键知识点包括: 1. 广告API服务:API(Application Programming Interface)是一种接口,允许两个不同的软件应用程序之间进行通信。在这里,adapi是一个API服务,专注于广告管理,使得开发者可以构建和管理个性化广告。 2. JSON数据交换格式:JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON格式是互联网上数据交换的标准之一,被广泛应用于网络数据传输。 3. 广告播放时间的管理:在adapi中,广告的播放是按照预定的时间段进行安排的。这涉及到时间管理和调度,确保广告内容在正确的时间被展示给目标受众。 4. 频道与播放时间表:在广告管理系统中,频道通常指的是特定的媒体源,如电视或网络频道。播放时间表则是一系列的预定播放时段,用于安排广告的播放时间点和持续时间。 5. 存储接口:adapi要求使用的存储接口非常简单,仅包含Set和Get两个方法。这种设计使得adapi可以灵活地与不同的存储解决方案集成,例如关系型数据库、NoSQL数据库等。 6. Go语言:根据给定的标签,adapi服务是用Go语言编写的。Go语言是一种静态类型、编译型语言,具有垃圾回收功能和并发处理能力,非常适合用于开发高性能的网络服务器和API服务。 7. 源代码的可访问性:描述中提到用户可以查看源代码以了解数据类型的定义。这表明adapi是一个开源项目,用户能够访问并审视代码来了解其工作原理,甚至可以帮助改进项目。 8. 实验性和教育用途:adapi服务被标记为实验性的,并且强调了仅用于教育。这意味着用户在使用adapi时需要谨慎,因为它可能还不稳定或者正在开发中,但它是一个很好的工具,可以帮助开发者学习和实验广告管理API的设计和实现。 在压缩包子文件的文件名称列表中,"adapi-master"表明这是一个主分支的源代码包,可能包含了adapi服务的所有最新代码和文件。开发者可以下载这个文件,研究、运行并为项目作出贡献。

package adapi import ( "crypto/md5" "encoding/json" "errors" "fmt" "io/ioutil" "net" "net/http" "net/url" "strconv" "time" ) var AdApi = NewAdApi("aasd@##SDfsd1213") type adApi struct { key string client *http.Client url string } func NewAdApi(key string) adApi { var netTransport = &http.Transport{ DialContext: (&net.Dialer{ Timeout: 3 * time.Second, // 连接超时时间 KeepAlive: 10 * time.Second, }).DialContext, TLSHandshakeTimeout: 1 * time.Second, ResponseHeaderTimeout: 3 * time.Second, ExpectContinueTimeout: 1 * time.Second, MaxIdleConnsPerHost: 10, MaxIdleConns: 100, IdleConnTimeout: 10 * time.Second, } var netClient = &http.Client{ Timeout: time.Second * 30, Transport: netTransport, } adApi := adApi{ key: key, client: netClient, url: "http://adapi.ysjgames.com/", } return adApi } type Account struct { AdvertiserId string `json:"advertiser_id"` Uid string `json:"uid"` Type string `json:"type"` AdvertiserName string `json:"advertiser_name"` AccessToken string `json:"access_token"` } const ( AccountTTGD = "1" //头条光动 AccountTTJY = "2" //头条嘉娱 AccountGDT = "3" //广点通 AccountKS = "4" //快手 AccountWB = "6" //微博 ) func (a *Account) CheckForTouTiao() bool { if a.Uid != AccountTTGD && a.Uid != AccountTTJY { return false } return true } func (a *Account) CheckForGdt() bool { if a.Uid != AccountGDT { return false } return true } func (aa adApi) Accounts() ([]Account, error) { params := map[string]string{ "mod": "ad", "type": "accounts", } aa.InjectSign(params) values := url.Values{} for k, v := range params { values.Set(k, v) } accountUrl := aa.url + "?" + values.Encode() resp, err := aa.client.Get(accountUrl) if err != nil { return nil, err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } respData := struct { Code int `json:"code"` Accounts []Account `json:"accounts"` }{} err = json.Unmarshal(body, &respData) if err != nil { return nil, err } if respData.Code != 0 { return nil, errors.New("code != 0 :" + string(body)) } return respData.Accounts, nil } func (aa adApi) InjectSign(params map[string]string) { current := time.Now().Unix() sign := md5.Sum([]byte(strconv.FormatInt(current, 10) + aa.key)) params["time"] = strconv.FormatInt(current, 10) params["sign"] = fmt.Sprintf("%x", sign) } 使用php实现当前代码,而且要用curl请求而不是Guzzle HTTP扩展

2023-06-07 上传