-
Notifications
You must be signed in to change notification settings - Fork 5
/
client.go
170 lines (141 loc) · 3.93 KB
/
client.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
package oppo
import (
"fmt"
"net/url"
"strconv"
"time"
"github.com/go-resty/resty/v2"
)
// https://open.oppomobile.com/new/developmentDoc/info?id=10998
// 1300699476073808945
// 2ebf891579110cfdd7d1095adab056f716c1ecda029132f98bde73b00d220b31
type Client struct {
restyClient *resty.Client
accessToken string
clientSecret string
}
func (c *Client) Name() string {
return "oppo开放平台"
}
func NewClient(clientId, clientSecret string) (*Client, error) {
restyClient := resty.New()
restyClient.SetDebugBodyLimit(10000)
restyClient.SetBaseURL("https://oop-openapi-cn.heytapmobi.com")
restyClient.SetHeader("Content-Type", "application/json")
restyClient.SetDebug(false)
// 获取token
var result struct {
Errno int `json:"errno"`
Data struct {
AccessToken string `json:"access_token"`
ExpireIn int `json:"expire_in"`
} `json:"data"`
}
_, err := restyClient.R().SetResult(&result).SetQueryParams(map[string]string{
"client_id": clientId,
"client_secret": clientSecret,
}).Get("/developer/v1/token")
if err != nil {
return nil, err
}
token := result.Data.AccessToken
c := &Client{restyClient: restyClient, accessToken: token, clientSecret: clientSecret}
return c, nil
}
// 签名
func (c *Client) sign(data url.Values) url.Values {
// 公共参数
data.Set("access_token", c.accessToken)
data.Set("timestamp", strconv.FormatInt(time.Now().Unix(), 10))
// 计算签名
api_sign := calSign(c.clientSecret, data)
data.Set("api_sign", api_sign)
return data
}
// 查询普通包详情
func (c *Client) query(pkgName string) (*app, error) {
data := make(url.Values)
data.Set("pkg_name", pkgName)
var result struct {
Errno int `json:"errno"`
Data *app `json:"data"`
}
if _, err := c.restyClient.R().SetResult(&result).
SetQueryParamsFromValues(c.sign(data)).Get("/resource/v1/app/info"); err != nil {
return nil, err
}
if result.Errno != 0 {
return nil, fmt.Errorf("查询失败基础信息失败 code: %d", result.Errno)
}
return result.Data, nil
}
// 上传文件
func (c *Client) uploadAPK(file string) (*uploadResult, error) {
var result struct {
Errno int `json:"errno"`
Data struct {
UploadUrl string `json:"upload_url"`
Sign string `json:"sign"`
} `json:"data"`
}
// 1. 获取上传url
if _, err := c.restyClient.R().
SetResult(&result).
SetQueryParamsFromValues(c.sign(make(url.Values))).
Get("/resource/v1/upload/get-upload-url"); err != nil {
return nil, err
}
var uploadResult struct {
Errno int `json:"errno"`
Data uploadResult `json:"data"`
}
if _, err := c.restyClient.R().SetResult(&uploadResult).
SetFormData(map[string]string{
"sign": result.Data.Sign,
"type": "apk",
}).
SetFile("file", file).
Post(result.Data.UploadUrl); err != nil {
return nil, err
}
return &uploadResult.Data, nil
}
func (c *Client) publish(req publishRequestParameter) error {
var result struct {
Errno int `json:"errno"`
Data struct {
Success bool `json:"success"`
Message string `json:"message"`
LogId int `json:"logid"`
} `json:"data"`
}
if _, err := c.restyClient.R().
SetResult(&result).
SetFormDataFromValues(c.sign(req.toValues())).
Post("/resource/v1/app/upd"); err != nil {
return err
}
if result.Errno != 0 {
return fmt.Errorf("发布失败 message: %s logid: %d", result.Data.Message, result.Data.LogId)
}
return nil
}
// 获取任务状态
func (c *Client) taskState(packageName string, versionCode string) (*taskBody, error) {
data := make(url.Values)
data.Set("pkg_name", packageName)
data.Set("version_code", versionCode)
var result struct {
Errno int `json:"errno"`
Data *taskBody `json:"data"`
}
if _, err := c.restyClient.R().SetResult(&result).
SetFormDataFromValues(c.sign(data)).
Post("/resource/v1/app/task-state"); err != nil {
return nil, err
}
if result.Errno != 0 {
return nil, fmt.Errorf("查询任务状态失败 code: %d", result.Errno)
}
return result.Data, nil
}