纯
golang
版本的bilibili视频上传脚本,可以将指定目录下的视频依次上传到bilibili(需要对应账号的cookie)
主要分为4个步骤:预上传,获取推荐标签,通知上传完成,上传
一,视频预上传
获取上传视频所需的各项参数,并将视频切割 进行
分片
上传
1.1获取上传视频所需的各项参数
func GetPreupload(path string, name string, cookie string) (a, b, c, d, e, f string) {
file, _ := os.Stat(path + "/" + name)
//if err ==nil {
// fmt.Println("文件存在")
//}else if os.IsNotExist(err){
// fmt.Println("文件不存在")
//}else {
// fmt.Println(err)
//}
size := file.Size()
sizeStr := strconv.FormatInt(size, 10)
var lk bytes.Buffer
lk.WriteString("https://member.bilibili.com/preupload?name=")
lk.WriteString(url.QueryEscape(name))
lk.WriteString("&size=")
lk.WriteString(sizeStr)
lk.WriteString("&r=upos&profile=ugcupos/bup&ssl=0&version=2.7.1&build=2070100&upcdn=bda&probe_version=2020022")
request, _ := http.NewRequest("GET", lk.String(), nil)
request.Header.Add("cookie", cookie)
request.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36")
response, _ := http.DefaultClient.Do(request)
var result map[string]interface{}
body, err := ioutil.ReadAll(response.Body)
if err == nil {
json.Unmarshal([]byte(string(body)), &result)
}
defer response.Body.Close()
auth := result["auth"]
upoUri := strings.ReplaceAll(result["upos_uri"].(string), "upos://", "")
chunkSize := strconv.FormatFloat(result["chunk_size"].(float64), 'f', -1, 64)
bizId := strconv.FormatFloat(result["biz_id"].(float64), 'f', -1, 64)
chunks := strconv.FormatFloat(result["threads"].(float64), 'f', -1, 64)
return auth.(string), upoUri, chunkSize, bizId, sizeStr, chunks
}
1.2获取上传所需id
func ReadyUpdate(auth, upoUri, cookie string) (a string) {
println("------------------准备上传")
var lk bytes.Buffer
lk.WriteString("https://upos-sz-upcdnbda2.bilivideo.com/")
lk.WriteString(upoUri)
lk.WriteString("?uploads&output=json")
fmt.Println(lk.String())
data := "uploads&output=json"
request, _ := http.NewRequest("POST", lk.String(), strings.NewReader(data))
request.Header.Add("cookie", cookie)
request.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36")
request.Header.Add("x-upos-auth", auth)
response, _ := http.DefaultClient.Do(request)
var result map[string]interface{}
body, err := ioutil.ReadAll(response.Body)
if err == nil {
json.Unmarshal([]byte(string(body)), &result)
}
defer response.Body.Close()
fmt.Printf("body: %v\n", string(body))
uploadId := result["upload_id"]
return uploadId.(string)
}
1.3分片上传
func SliceUpdate(auth, chunkSize, sizeStr, cookie, path, name, upoUri, uploadId, chunksstr string) {
println("--------------切片上传")
chunkSizeInt, _ := strconv.Atoi(chunkSize)
//chunks := sizeInt / chunkSizeInt
chunks, _ := strconv.Atoi(chunksstr)
f, _ := os.Open(path + "/" + name)
for i := 1; i < chunks+1; i++ {
partnumber := 0 + i
chunk := i - 1
println("-------------------------")
starts := chunkSizeInt * chunk
println(starts)
buffer := make([]byte, chunkSizeInt)
size, err := f.ReadAt(buffer, int64(starts))
if err != nil {
println("err:" + err.Error())
}
fmt.Printf("n: %v\n", size)
ends := chunkSizeInt * i
if size != chunkSizeInt {
ends = chunkSizeInt*(i-1) + size
}
var lk bytes.Buffer
lk.WriteString("https://upos-sz-upcdnbda2.bilivideo.com/")
lk.WriteString(upoUri)
lk.WriteString("?partNumber=")
lk.WriteString(strconv.Itoa(partnumber))
lk.WriteString("&uploadId=")
lk.WriteString(uploadId)
lk.WriteString("&chunk=")
lk.WriteString(strconv.Itoa(chunk))
lk.WriteString("&chunks=")
lk.WriteString(strconv.Itoa(chunks))
lk.WriteString("&size=")
lk.WriteString(strconv.Itoa(size))
lk.WriteString("&start=")
lk.WriteString(strconv.Itoa(starts))
lk.WriteString("&end=")
lk.WriteString(strconv.Itoa(ends))
lk.WriteString("&total=")
lk.WriteString(sizeStr)
fmt.Println(lk.String())
request, _ := http.NewRequest("PUT", lk.String(), strings.NewReader(string(buffer)))
request.Header.Add("cookie", cookie)
request.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36")
request.Header.Add("x-upos-auth", auth)
request.Header.Add("content-type", "application/octet-stream")
response, _ := http.DefaultClient.Do(request)
var result map[string]interface{}
body, err := ioutil.ReadAll(response.Body)
if err == nil {
json.Unmarshal([]byte(string(body)), &result)
}
defer response.Body.Close()
fmt.Printf("code: %v\n", response.StatusCode)
}
f.Close()
}
1.4通知上传完毕
func GiveUpdate(bizId, upoUri, name, uploadId, cookie, auth, chunksstr string) {
println("------------------通知上传完毕")
var lk bytes.Buffer
lk.WriteString("https://upos-sz-upcdnbda2.bilivideo.com/")
lk.WriteString(upoUri)
lk.WriteString("?output=json&name=")
lk.WriteString(url.QueryEscape(name))
lk.WriteString("&profile=ugcupos%2Fbup&uploadId=")
lk.WriteString(uploadId)
lk.WriteString("&biz_id=")
lk.WriteString(bizId)
chunks, _ := strconv.Atoi(chunksstr)
var s Serverslice
for i := 1; i < chunks+1; i++ {
s.Servers = append(s.Servers, Server{i, "etag"})
}
b, err := json.Marshal(s)
if err != nil {
fmt.Println("JSON ERR:", err)
}
fmt.Println(string(b))
request, _ := http.NewRequest("POST", lk.String(), strings.NewReader(string(b)))
request.Header.Add("cookie", cookie)
request.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36")
request.Header.Add("x-upos-auth", auth)
response, _ := http.DefaultClient.Do(request)
var result map[string]interface{}
body, err := ioutil.ReadAll(response.Body)
if err == nil {
json.Unmarshal([]byte(string(body)), &result)
}
defer response.Body.Close()
fmt.Printf("body: %v\n", string(body))
fmt.Println(response.StatusCode)
}
二,获取推荐标签
获取bilibili给出的视频推荐标签,我这边是使用默认的前5个标签
func GetTags(name, cookie, upoUri string) (a []string) {
var lk bytes.Buffer
lk.WriteString("https://member.bilibili.com/x/vupre/web/archive/tags?typeid=&title=")
names := strings.ReplaceAll(name, ".mp4", "")
lk.WriteString(url.QueryEscape(names))
lk.WriteString("&filename=")
nam := strings.Split(upoUri, "/")
filename := strings.ReplaceAll(nam[len(nam)-1], ".mp4", "")
lk.WriteString(filename)
lk.WriteString("&desc=&cover=&groupid=0&vfea=")
fmt.Println(lk.String())
request, _ := http.NewRequest("GET", lk.String(), nil)
request.Header.Add("cookie", cookie)
response, _ := http.DefaultClient.Do(request)
var result map[string]interface{}
body, err := ioutil.ReadAll(response.Body)
defer response.Body.Close()
if err == nil {
json.Unmarshal([]byte(string(body)), &result)
}
tags := result["data"].([]interface{})
//reflect.ValueOf(tags)
result1 := []string{}
for i, v := range tags {
if i < 5 {
v1 := v.(map[string]interface{})
va := v1["tag"]
result1 = append(result1, va.(string))
}
}
return result1
}
三,预发布
func StartUpdate(cookie string) {
request, _ := http.NewRequest("GET", "https://member.bilibili.com/x/geetest/pre/add", nil)
request.Header.Add("cookie", cookie)
response, _ := http.DefaultClient.Do(request)
var result map[string]interface{}
body, err := ioutil.ReadAll(response.Body)
defer response.Body.Close()
if err == nil {
json.Unmarshal([]byte(string(body)), &result)
}
fmt.Println(response.StatusCode)
}
四,发布视频
func Update(upoUri, name, bizId, tags, cookie, biliJct, source string) {
nam := strings.Split(upoUri, "/")
filename := strings.ReplaceAll(nam[len(nam)-1], ".mp4", "")
names := strings.ReplaceAll(name, ".mp4", "")
data := "{\"copyright\":2,\"videos\":[{\"filename\":\"" + filename + "\",\"title\":\"" + names + "\",\"desc\":\"\",\"cid\":" + bizId + "}],\"source\":\"" + source + "\",\"tid\":174,\"cover\":\"\",\"title\":\"" + names + "\",\"tag\":\"" + tags + "\",\"desc_format_id\":0,\"desc\":\"\",\"dynamic\":\"\",\"subtitle\":{\"open\":0,\"lan\":\"\"},\"up_close_reply\":false,\"up_close_danmu\":false}"
request, _ := http.NewRequest("POST", "https://member.bilibili.com/x/vu/web/add?csrf="+biliJct, strings.NewReader(data))
request.Header.Add("content-type", "application/json;charset=UTF-8")
request.Header.Add("cookie", cookie)
request.Header.Add("origin", "https://member.bilibili.com")
request.Header.Add("pragma", "no-cache")
request.Header.Add("referer", "https://member.bilibili.com/video/upload.html")
request.Header.Add("sec-fetch-dest", "empty")
request.Header.Add("sec-fetch-mode", "cors")
request.Header.Add("sec-fetch-mode", "same-origin")
request.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36")
response, _ := http.DefaultClient.Do(request)
var result map[string]interface{}
body, err := ioutil.ReadAll(response.Body)
if err == nil {
json.Unmarshal([]byte(string(body)), &result)
}
defer response.Body.Close()
fmt.Printf("body: %v\n", string(body))
fmt.Printf("code: %v\n", response.StatusCode)
}