代码备份

阿里云盘上传的脚本

 

简介:这大概是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

}
`

  

 

posted @ 2021-04-17 19:48  即得  阅读(427)  评论(0)    收藏  举报