-
Notifications
You must be signed in to change notification settings - Fork 0
/
qiniu.gradle
304 lines (252 loc) · 12.2 KB
/
qiniu.gradle
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
/**
* 七牛云 文件存储 上传脚本
* 请无视IDEA的爆红, 并不影响运行.
* 请不要随意导入其他包.
*
* 脚本`apply`之后, 会在gradle窗口中的: 工程->Tasks->angcyo 中出现 `_qiniuUpload` 任务. 双击即可运行.
*
* https://github.com/angcyo/gradle
*
* https://developer.qiniu.com/kodo/sdk/1239/java
*
* <p>
*
* 其中关于Region对象和机房的关系如下:
* https://developer.qiniu.com/kodo/1239/java#upload-config
*
* 机房 Region
* 华东 Region.region0(), Region.huadong()
* 华北 Region.region1(), Region.huabei()
* 华南 Region.region2(), Region.huanan()
* 北美 Region.regionNa0(), Region.beimei()
* 东南亚 Region.regionAs0(), Region.xinjiapo()
*
* Email:angcyo@126.com
* @author angcyo* @date 2019/08/09
* Copyright (c) 2019 ShenZhen O&M Cloud Co., Ltd. All rights reserved.
*/
/**
* 为了保证`Key`的安全:
* 可以在
* win: 'C:\Users\用户名\.gradle\gradle.properties'
* mac: '/Users/用户名/.gradle/gradle.properties'
* linux: '/root/.gradle/gradle.properties'
* 文件中加入配置:
* ```
* qiniu_ak=xxx
* qiniu_sk=xxx
* qiniu_bucket=xxx
* ```
* 也可以在以下配置.(优先读取`gradle.properties`文件中的配置)
* */
ext.qiniuConfig = [
//需要上传的APK路径(必须指定)
"qiniuApkPath" : "",
//是否要先执行删除文件
"qiniuDeleteBefore": "true",
//下载域名前缀, 需要'/'结尾(在七牛云上配置的外链域名)
"qiniuBaseUrl" : "",
"qiniu_ak" : "",
"qiniu_sk" : "",
"qiniu_bucket" : "",
//如果需要将url转成二维码, 参考以下链接, 注册app_id和app_secret
//https://github.com/MZCretin/RollToolsApi#%E8%A7%A3%E9%94%81%E6%96%B0%E6%96%B9%E5%BC%8F
"qr_api_app_id" : "",
"qr_api_app_secret": "",
//用来保存上传成功后, APK的下载地址
"downloadUrl" : "",
]
buildscript {
repositories {
//alliyun 镜像
maven() { url 'https://maven.aliyun.com/repository/public' }
mavenCentral()
}
dependencies {
//https://github.com/qiniu/java-sdk/releases
//https://jcenter.bintray.com/com/qiniu/qiniu-java-sdk/
//https://search.maven.org/search?q=g:com.qiniu%20AND%20a:qiniu-java-sdk
classpath 'com.qiniu:qiniu-java-sdk:7.8.0'
classpath 'com.squareup.okhttp3:okhttp:3.14.4'
//https://jcenter.bintray.com/com/google/code/gson/gson/
classpath "com.google.code.gson:gson:2.8.8"
}
}
/**
* 上传本地文件->七牛云->返回文件下载地址
* 拿到下载url->生成url二维码地址
* */
task _qiniuUpload(group: 'angcyo', description: '上传文件到七牛云') {
doFirst {
def ak = project.hasProperty("qiniu_ak") ? project.ext.qiniu_ak : qiniuConfig.qiniu_ak
def sk = project.hasProperty("qiniu_sk") ? project.ext.qiniu_sk : qiniuConfig.qiniu_sk
def bk = project.hasProperty("qiniu_bucket") ? project.ext.qiniu_bucket : qiniuConfig.qiniu_bucket
def baseUrl = project.hasProperty("qiniuBaseUrl") ? project.ext.qiniuBaseUrl : qiniuConfig.qiniuBaseUrl
def qiniuDeleteBefore = project.hasProperty("qiniuDeleteBefore") ? project.ext.qiniuDeleteBefore : qiniuConfig.qiniuDeleteBefore
def deleteBefore = qiniuDeleteBefore == "true"
def app_id = project.hasProperty("qr_api_app_id") ? project.ext.qr_api_app_id : qiniuConfig.qr_api_app_id
def app_secret = project.hasProperty("qr_api_app_secret") ? project.ext.qr_api_app_secret : qiniuConfig.qr_api_app_secret
def codeLogo = project.hasProperty("codeLogo") ? project.ext.codeLogo : null
def apkPath = project.hasProperty("qiniuApkPath") ? project.ext.qiniuApkPath : qiniuConfig.qiniuApkPath
if (apkPath == null || apkPath.isEmpty()) {
apkPath = findApkFile()
} else {
if (file(apkPath).isDirectory()) {
apkPath = findApkFile(apkPath)
}
}
if (apkPath == null || apkPath.isEmpty()) {
throw new IllegalStateException("请在[gradle.properties]文件中指定需要上传的文件路径[qiniuApkPath=xxx]")
}
def allPath = apkPath.split(";")
//创建上传凭证, 这是必须的.
def auth = com.qiniu.util.Auth.create(ak, sk)
def client = new okhttp3.OkHttpClient()
allPath.each { path ->
def apkFile = file(path)
if (!apkFile.exists()) {
if (allPath.size() > 1) {
System.err.println "跳过不存在的文件:" + apkFile.getAbsolutePath()
} else {
throw new IllegalStateException("需要上传的文件不存在:" + apkFile.getAbsolutePath())
}
} else {
def key = apkFile.name /*+ new Date().format("_yyyy-MM-dd_HH-mm-ss")*/
def putPolicy = new com.qiniu.util.StringMap()
putPolicy.put("returnBody", "{\"key\":\"" + key + "\", \"hash\":\"" + System.currentTimeMillis() + "\"}")
def expireSeconds = 3600L
String upToken = auth.uploadToken(bk, null, expireSeconds, putPolicy)
println "七牛云上传凭证:" + upToken
//UploadManager uploadManager = new UploadManager()
//Auth auth = Auth.create(accessKey, secretKey)
//String token = auth.uploadToken(bucketName)
//Response r = upManager.put("hello world".getBytes(), "yourkey", token)
def downloadUrl = baseUrl + key
System.err.println "\n开始上传->" + apkFile.getAbsolutePath() + "->" + downloadUrl
//上传配置参考 https://developer.qiniu.com/kodo/sdk/1239/java#upload-config
//华南地区
//def cfg = new com.qiniu.storage.Configuration(com.qiniu.storage.Region.huanan())
//自动判断
def cfg = new com.qiniu.storage.Configuration(com.qiniu.storage.Region.autoRegion())
if (deleteBefore) {
//删除文件
try {
def bucketManager = new com.qiniu.storage.BucketManager(auth, cfg)
println "删除文件:${bucketManager.delete(bk, key)}"
} catch (Exception ignored) {
//忽略异常
}
}
//上传本地文件
def uploadManager = new com.qiniu.storage.UploadManager(cfg)
def response = uploadManager.put(apkFile, key, upToken)
def putRet = new com.google.gson.Gson().fromJson(response.bodyString(),
com.qiniu.storage.model.DefaultPutRet.class)
println "上传完成->hash:${putRet.hash} key:${putRet.key}"
qiniuConfig.downloadUrl = downloadUrl
System.err.println "七牛云上传成功->" + qiniuConfig.downloadUrl
if (codeLogo == null || codeLogo.isEmpty()) {
codeLogo = getLogoPath(key)
}
if (!app_id.isEmpty() && !app_secret.isEmpty()) {
def qrCodeUrl = requestQrCodeUrl(app_id, app_secret, downloadUrl, codeLogo)
System.err.println ''
System.err.println "二维码地址->$qrCodeUrl"
//下载网站地址
def downloadTitle = project.hasProperty("downloadTitle") ? project.ext.downloadTitle : key
def downloadDes = project.hasProperty("downloadDes") ? project.ext.downloadDes : ""
//"1.修复已知问题<br>2.优化交互体验"
def t = URLEncoder.encode(downloadTitle, "UTF-8")
def d = URLEncoder.encode(downloadDes, "UTF-8")
def webUrl = "https://angcyo.gitee.io/download?r=${downloadUrl}&q=${qrCodeUrl}&t=${t}&d=${d}"
System.err.println ''
System.err.println "下载web地址->${webUrl}"
def webQrUrl = requestQrCodeUrl(app_id, app_secret, webUrl, codeLogo)
System.err.println "下载web地址[二维码]->${webQrUrl}"
System.err.println ''
def webQrCodeFile = file(".apk/二维码网站_${getBuildTime()}.png")
saveUrlToFile(client, webQrUrl, webQrCodeFile)
def qrCodeUrlBack
if (codeLogo == null || codeLogo.isEmpty()) {
qrCodeUrlBack = "http://qr.topscan.com/api.php?text=${downloadUrl}"
} else {
qrCodeUrlBack = "http://qr.topscan.com/api.php?text=${downloadUrl}&logo=${codeLogo}"
}
System.err.println "备用二维码地址->$qrCodeUrlBack"
//保存二维码图片到文件
def qrCodeFile = file(".apk/二维码_${getBuildTime()}.png")
saveUrlToFile(client, qrCodeUrl, qrCodeFile)
//保存备用二维码图片到文件
def qrCodeFileBack = file(".apk/二维码备用_${getBuildTime()}.png")
saveUrlToFile(client, qrCodeUrlBack, qrCodeFileBack)
//将二维码url存入文件, 方便在Jenkins中使用
def codeTextFile = file(".apk/二维码地址_${getBuildTime()}.txt")
codeTextFile.createNewFile()
codeTextFile.append("二维码地址↓\n")
codeTextFile.append(qrCodeUrl)
codeTextFile.append("\n网站二维码地址↓\n")
codeTextFile.append(webQrUrl)
codeTextFile.append("\n备用二维码地址↓\n")
codeTextFile.append(qrCodeUrlBack)
}
}
}
}
}
/**创建一个生成二维码的请求*/
def qrcodeRequest(content, logoPath, app_id, app_secret) {
def s = URLEncoder.encode(content, "UTF-8")
def url = ""
def request = null
if (logoPath == null || logoPath.isEmpty()) {
//无logo
url = "http://www.mxnzp.com/api/qrcode/create/single?content=${s}&size=400&type=0"
request = new okhttp3.Request.Builder()
.header("app_id", app_id)
.header("app_secret", app_secret)
.url(url)
.build()
} else {
//有logo
url = "https://www.mxnzp.com/api/qrcode/create/logo?content=${s}&size=400&type=0"
def logoBody = okhttp3.RequestBody.create(okhttp3.MediaType.parse("multipart/form-data"), file(logoPath))
okhttp3.RequestBody requestBody = new okhttp3.MultipartBody.Builder()
.setType(okhttp3.MultipartBody.FORM)
.addFormDataPart("logo_img", "codeLogo", logoBody)
.build()
request = new okhttp3.Request.Builder()
.post(requestBody)
.header("app_id", app_id)
.header("app_secret", app_secret)
.url(url)
.build()
}
return request
}
static def saveUrlToFile(client, url, file) {
def request = new okhttp3.Request.Builder()
.url(url)
.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64")
.get()
.build()
def rep = client.newCall(request).execute()
saveStream(rep.body().byteStream(), file)
}
static def saveStream(inputStream, file) {
def out = new FileOutputStream(file, false)
out.leftShift(inputStream)
out.flush()
out.close()
}
/**将内容打成二维码图片地址*/
def requestQrCodeUrl(app_id, app_secret, content, logoPath) {
def request = qrcodeRequest(content, logoPath, app_id, app_secret)
//生成url对应的二维码
//https://github.com/MZCretin/RollToolsApi#%E5%85%AB%E7%94%9F%E6%88%90%E4%BA%8C%E7%BB%B4%E7%A0%81
def client = new okhttp3.OkHttpClient()
def json = client.newCall(request).execute().body().string()
def map = new com.google.gson.Gson().fromJson(json, Map.class)
println "接口返回:${json}"
def qrCodeUrl = map["data"]["qrCodeUrl"]
return qrCodeUrl
}