bilibili自动上传视频脚本(纯go)

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)
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟才能学的更多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值