goland刷新阿里云CDN工具
package main
import (
"bufio"
"encoding/json"
"errors"
"io/ioutil"
"log"
"os"
"path/filepath"
"strings"
"time"
cdn20180510 "github.com/alibabacloud-go/cdn-20180510/client"
openapi "github.com/alibabacloud-go/darabonba-openapi/client"
"github.com/alibabacloud-go/tea/tea"
"github.com/astaxie/beego/logs"
)
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
func CreateClient(accessKeyId *string, accessKeySecret *string) (_result *cdn20180510.Client, _err error) {
config := &openapi.Config{
// 您的AccessKey ID
AccessKeyId: accessKeyId,
// 您的AccessKey Secret
AccessKeySecret: accessKeySecret,
}
// 访问的域名
config.Endpoint = tea.String("cdn.aliyuncs.com")
// _result = &cdn20180510.Client{}
_result, _err = cdn20180510.NewClient(config)
return _result, _err
}
type MapPwd struct {
AccessKeyID string `json:"AccessKeyID"`
AccessKeySecret string `json:"AccessKeySecret"`
}
func readPwd() (d MapPwd) {
content, err := ioutil.ReadFile(CurrentFile() + "/pwd.json")
if err != nil {
logs.Error("readPwd err::", err)
return
}
json.Unmarshal(content, &d)
return
}
func CurrentFile() string {
dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
if err != nil {
log.Fatal(err)
}
//将\替换成/
return dir
}
func readUrls() (urls []string) {
file, err := os.Open(CurrentFile() + "/urls.txt")
if err != nil {
logs.Error("readUrls err::", err)
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
urls = append(urls, scanner.Text())
}
return
}
func refCdn(url string, client *cdn20180510.Client) (taskid string, _err error) {
url = strings.Trim(url, " ")
if url == "" {
_err = errors.New("url")
return
}
r := []rune(url)
lasrtr := string(r[len(r)-1:])
var alitype string
if lasrtr == "/" {
//目录
alitype = "Directory"
} else {
//文件
alitype = "File"
}
refreshObjectCachesRequest := &cdn20180510.RefreshObjectCachesRequest{
ObjectPath: tea.String(url),
ObjectType: tea.String(alitype),
}
res, _err := client.RefreshObjectCaches(refreshObjectCachesRequest)
if _err != nil {
logs.Error("CDN 发起刷新失败::", "client.RefreshDcdnObjectCaches:", _err, url)
return
}
retdata := make(map[string]interface{})
json.Unmarshal([]byte(res.String()), &retdata)
if retdata["body"] != nil && retdata["body"].(map[string]interface{})["RefreshTaskId"] != nil {
taskid = retdata["body"].(map[string]interface{})["RefreshTaskId"].(string)
logs.Error(url, "开始刷新::", retdata["body"].(map[string]interface{})["RefreshTaskId"])
return
} else {
_err = errors.New("failed")
logs.Error("CDN 发起刷新失败::", retdata)
return
}
}
func getTaskInfo(taskid string, client *cdn20180510.Client) (Status string) {
refreshObjectCachesRequest := &cdn20180510.DescribeRefreshTaskByIdRequest{
TaskId: tea.String(taskid),
}
res, _err := client.DescribeRefreshTaskById(refreshObjectCachesRequest)
if _err != nil {
logs.Error("CDN 获取刷新结果失败::", "client.getTaskInfo:", _err)
return
}
for _, v := range res.Body.Tasks {
Status = *v.Status
}
return
}
func main() {
logs.Error("")
pwd := readPwd()
if pwd.AccessKeyID == "" || pwd.AccessKeySecret == "" {
logs.Error("请先在pwd.json中配置秘钥")
time.Sleep(30 * time.Second)
return
}
urls := readUrls()
// logs.Error("pwd:", pwd.AccessKeyID)
// logs.Error("urls:", urls)
client, _err := CreateClient(tea.String(pwd.AccessKeyID), tea.String(pwd.AccessKeySecret))
if _err != nil {
logs.Error("pwd:", pwd.AccessKeyID, _err)
time.Sleep(30 * time.Second)
return
}
var oknums, errnums int
var taskids []string
for _, url := range urls {
taskid, err := refCdn(url, client)
if err == nil {
taskids = append(taskids, taskid)
oknums++
} else {
errnums++
}
}
if oknums < 1 {
return
}
logs.Error("")
logs.Error("CDN 发起刷新成功::", oknums, "条,失败::", errnums, "条")
logs.Error("")
logs.Error("CDN 开始获取刷新结果")
logs.Error("")
var ronums, rfnums int
for {
for _, taskid := range taskids {
status := getTaskInfo(taskid, client)
logs.Error(taskid + "::" + status)
if status == "Complete" {
ronums++
} else if status == "Failed" {
rfnums++
}
}
if ronums+rfnums >= oknums {
logs.Error("")
logs.Error("CDN 刷新完成,成功", ronums, "条,失败::", rfnums, "条")
break
}
time.Sleep(2 * time.Second)
}
time.Sleep(180 * time.Second)
}
pwd.json
{
"AccessKeyID": "",
"AccessKeySecret": ""
}