代码备份
阿里云盘上传的脚本
简介:这大概是Oauth2.0吧,我也不知道是什么,通过Refresh_Token刷新access_token然后放在请求头authorization,好处是不用cookie验证
大致流程是登陆,然后得到一个code,这个code只能请求一次,完了就失效,通过这个code向服务器请求Refresh_Token(刷新令牌)和access_token
access_token会隔一段时间失效,这时候服务器会返回401,然后通过api和Refresh_Token重新获得一段access_token
然后再通过post提交一个表单,这个表单里面有文件的哈希值,然后阿里云会传给你一个ture,这时候就不用上传了因为已经秒传成功了。
在表单里有个
part_info_list":[{"part_number":1}]
代表你要传多少段,一般大文件都会请求多个,这里我已经没力搞了就只有一个,没秒传它会返回一个链接,这时候把数据put方式发过去,再post一段带该文件信息的表单给服务器就上传成功了。

`package main
import (
"crypto/sha1"
"encoding/json"
"fmt"
"io"
"time"
"io/ioutil"
"net/http"
"net/url"
"os"
"strings"
)
func main() {
//Refresh_Token("43b168c4671d4*******0820b39")
//文件路径-获取大小
//Get_Upload_Link(`G:\\Win10PEx64_10586_fish006.zip`)
}
type Return_value struct {
Access_token string `json:"access_token"`
Part_info_list []struct {
Upload_url string `json:"upload_url"`
} `json:"part_info_list"`
Upload_id string `json:"upload_id"`
File_id string `json:"file_id"`
}
func Refresh_Token(key string) string {
link := "https://websv.aliyundrive.com/token/refresh"
u := url.Values{}
u.Add("refresh_token", key)
code, _ := http.PostForm(link, u)
byte, _ := ioutil.ReadAll(code.Body)
token := Return_value{}
json.Unmarshal(byte, &token)
defer code.Body.Close()
return token.Access_token
}
func Get_Upload_Link(path string) {
a, b, c, d := Get_File_Size(path)
//println(a, b, c,d) //文件地址,文件大小,文件名字,哈希值
key := Refresh_Token("43b168c4671d4614a5b17257f0820b39")
url := "https://api.aliyundrive.com/v2/file/create"
data := `{"drive_id":"153680","part_info_list":[{"part_number":1}],"parent_file_id":"root","name":"` + c + `","type":"file","check_name_mode":"auto_rename","size":` + b + `,"content_hash": "` + d + `", "content_hash_name": "sha1"}`
//println(data)
client := &http.Client{}
reques, _ := http.NewRequest("POST", url, strings.NewReader(data))
//fmt.Println(key)
reques.Header.Set("authorization", key)
re, _ := client.Do(reques)
body, _ := ioutil.ReadAll(re.Body)
o := Return_value{}
json.Unmarshal(body, &o)
//fmt.Println(o.File_id)
//fmt.Println(o.Upload_id)
//fmt.Println(string(body))
if strings.Contains(string(body), "true") {
println(c, " 已通过哈希上传")
return
}
if o.Part_info_list != nil {
url = o.Part_info_list[0].Upload_url
num, _ := a.Seek(0, os.SEEK_CUR) //获取文件当前末尾指针偏移量(当前指针偏移量)因为前期计算哈希已经偏移到文件末尾了
go func() {
for {
res, _ := a.Seek(0, os.SEEK_CUR) //开一个线程每一秒获取当前文件指针
println(`[`+c+`]已上传:`, res, ` 总大小:`, num)
time.Sleep(time.Second * 2)
}
}()
a.Seek(0, os.SEEK_SET) //获取后将偏移量设置为0,并从0开始上传
reques, _ = http.NewRequest("PUT", url, a)
re, _ = client.Do(reques)
//println(re.StatusCode)
url = "https://api.aliyundrive.com/v2/file/complete"
data = `{"drive_id": "153680", "upload_id": "` + o.Upload_id + `", "file_id": "` + o.File_id + `"}`
reques, _ = http.NewRequest("POST", url, strings.NewReader(data))
reques.Header.Set("authorization", key)
re, _ = client.Do(reques)
//println(re.StatusCode)
body, _ := ioutil.ReadAll(re.Body)
if strings.Contains(string(body), "name") {
println(c, " 上传成功。")
return
} else {
fmt.Println(string(body))
}
} else {
fmt.Println("获取不到上传链接")
}
defer a.Close()
defer reques.Body.Close()
}
func Get_File_Size(f string) (file *os.File, size string, name_last string, hash string) {
fs, err := os.Stat(f)
if err != nil {
println(`文件读取失败,请检查目录!`, err)
return
}
size = fmt.Sprint(fs.Size())
file, err = os.Open(f)
if err != nil {
println(`文件打开失败!`, err)
return
}
name := strings.Split(file.Name(), "\\")
name_last = name[len(name)-1]
File_sha1 := sha1.New()
println(name_last, " 计算文件哈希值")
io.Copy(File_sha1, file)
hash = fmt.Sprintf("%x", File_sha1.Sum(nil))
return
}
`

浙公网安备 33010602011771号