随记-探究 B站上传流程

主要流程如下

  • 预上传
  • 上传
    • 开始上传
    • 分片上传
    • 上传完成)
  • 标签
    • 分区预测
    • 获取标签
  • 发布

preupload 预上传

url


from urllib.parse import urlencode, quote, unquote

url_query = urlencode(url_query)

lk = f"https://member.bilibili.com/preupload"
lk = f"{lk}?{url_query}"
url_query = {
            "probe_version": "20221109",  # "20200224"
            "upcdn": "qn",
            "zone": "cs",
            "name": quote(self._name),
            "r": "upos",
            "profile": "ugcfx/bup",
            "ssl": "0",
            "version": "2.14.0.0", # "2.7.1"
            "build": "2140000", # "2070100"
            "size": self.size,
            # "webVersion": "2.14.0",
            
        }

result =  requests.get(lk, headers=self._headers, verify=False)

上传

upload 开始上传


url_query = {
    "uploads": None,  
    "output": "json",
    "profile": "ugcfx/bup",
    "filesize": self.size,
    "partsize": self.chunk_size, 
    "biz_id": self.biz_id,
    # "meta_upos_uri": self.upos_uri,
    # "webVersion": "2.14.0",
    
}
url_query = urlencode(url_query)

temp_path = self.upos_uri.replace("upos://","")

lk_base = f"https://upos-cs-upcdnqn.bilivideo.com/{temp_path}"
lk = f"{lk_base}?{url_query}"

data = "uploads&output=json"
self._headers.update({"x-upos-auth": self.auth})

result =  requests.post(lk, data=data, headers=self._headers, verify=False)

视频分片上传(视频片段)


start = (part_num-1) * self.chunk_size
url_query = {
    "partNumber": part_num,  # 当前视频片段 index(从1开始)
    "uploadId": self.upload_id,
    "chunk": part_num-1,    # 前一视频片段 index(从0开始)
    "chunks": part_number,      # 视频片段总数
    "partsize": self.chunk_size, 
    "start": start,     # 视频片段开始位置
    "end": part_num * self.chunk_size,      # 视频片段结束位置
    "total": self.size,     # 视频总大小
}
url_query = urlencode(url_query)

lk_base = f"https://upos-cs-upcdnqn.bilivideo.com/{temp_path}"
lk = f"{lk_base}?{url_query}"

open_file.seek(start)
content_data = open_file.read(self.chunk_size)

result =  requests.put(lk, data=content_data, headers=self._headers, verify=False)

视频上传完成


url_query = {
"partNumber": part_num,  
    "output": "json",
    "name": quote(self._name),
    "profile": "ugcfx/bup",
    "uploadId": self.upload_id,
    "biz_id": self.biz_id,
}
url_query = urlencode(url_query)

lk = f"{lk_base}?{url_query}"
payload_data = {
    "parts": parts_list
}
payload_data = json.dumps(payload_data)

result =  requests.post(lk, data=payload_data, headers=self._headers, verify=False)

标签

分区预测



    def archive_types_predict(self):
        """
            分区预测

            TODO self.filename,self.title,self.subtype_id
        """
    
        lk = "https://member.bilibili.com/x/vupre/web/archive/types/predict"

        t = int(time.time()* 1000)  # 毫秒时间戳
        url_query = {
            "t": t,
            "csrf": self._csrf,
        }
        url_query = urlencode(url_query)

        # 获取 filename title
        self.filename = re.split("[/\.]",self.upos_uri)[-2]
        self.title = self._name.replace(".mp4", "")

        lk = f"{lk}?{url_query}"
        payload_data = {
            "upload_id": self.upload_id,
            "title": self.title,    # "title": self._name[:self._name.find(".")],
            "filename": self.filename,
        }
        result =  requests.post(lk, data=payload_data, headers=self._headers, verify=False)

        result_dict = None
        if result.status_code == 200:
            result_dict = json.loads(result.text)

            # 获取 subtype_id
            self.subtype_id = result_dict["data"][0]["id"]
        else:
            print("="*20)
            print(f"ERROR: {result.status_code}")
            print("="*20)
            return

        if not result_dict:
            print("result_dict is error")
            return



获取标签

   
    def get_tag(self):
        """
            获取标签

            TODO self.tags
        """
        lk = "https://member.bilibili.com/x/vupre/web/tag/recommend"

        t = int(time.time()* 1000)  # 毫秒时间戳
        import re
        filename = re.split("[/\.]",self.upos_uri)[-2]
        title = self._name.replace(".mp4", "")
        url_query = {
            "upload_id": self.upload_id,
            "subtype_id": self.subtype_id,
            "title": title,    # "title": self._name[:self._name.find(".")],
            "filename": filename,
            # "description": "",
            # "cover_url": "",
            "t": t
        }
        url_query = urlencode(url_query)

        lk = f"{lk}?{url_query}"
        result =  requests.get(lk, headers=self._headers, verify=False)

        result_dict = None
        if result.status_code == 200:
            result_dict = json.loads(result.text)
            tag_list = [i["tag"] for i in result_dict["data"]]
            self.tags = ",".join(tag_list)
        else:
            print("="*20)
            print(f"ERROR: {result.status_code}")
            print("="*20)
            return

        if not result_dict:
            print("result_dict is error")
            return
        print()
 

发布


    def release(self):
        """
            发布
        """
        lk = "https://member.bilibili.com/x/vu/web/add/v3"

        t = int(time.time()* 1000)  # 毫秒时间戳
        url_query = {
            "t": t,
            "csrf": self._csrf,
        }
        url_query = urlencode(url_query)

        lk = f"{lk}?{url_query}"

        payload_data = {
                # "cover": "https://archive.biliimg.com/bfs/archive/f0f2a39ece5ece59d4d60e40d9a3595c2673d1b7.jpg",      # 封面
                "title": self.title,
                "copyright": 1,     # 版权类型:1自制,2转载
                "tid": self.subtype_id,
                "tag": self.tags,
                # "desc_format_id": 9999,
                # "desc": "",
                # "dtime": 1703405438,    # 定时发布
                # "recreate": -1,
                # "dynamic": "",
                # "interactive": 0,
                "videos": [
                    {
                        "filename": self.filename,
                        "title": self.title,
                        "desc": "",
                        "cid": self.biz_id
                    }
                ],
                # "act_reserve_create": 0,
                # "no_disturbance": 0,
                # "no_reprint": 1,
                # "subtitle": {
                #     "open": 0,
                #     "lan": ""
                # },
                # "open_elec": 1,
                # "dolby": 0,
                # "lossless_music": 0,
                # "up_selection_reply": false,
                # "up_close_reply": false,
                # "up_close_danmu": false,
                # "web_os": 2,
                "csrf": self._csrf
            }


        payload_data = json.dumps(payload_data)
        
        result =  requests.post(lk, data=payload_data, headers=self._headers, verify=False)

        result_dict = None
        if result.status_code == 200:
            result_dict = json.loads(result.text)

            if result_dict["code"] == 601:
                # TODO 验证码
                # 
                # self.v_voucher = result_dict["data"]["v_voucher"]
                # self.register()
                return
            
        else:
            print("="*20)
            print(f"ERROR: {result.status_code}")
            print("="*20)
            return

        if not result_dict:
            print("result_dict is error")
            return


其他猜测

# 参与话题
https://member.bilibili.com/x/vupre/web/topic/type?type_id=122&pn=0&ps=6&title=&t=1703380719968

# 封面上传
https://member.bilibili.com/x/vu/web/cover/up?t=1703385286457

  • 查询参数
    • t: 1703385286457
  • body
    • 二进制图片数据

在此感谢 菜鸟才能学的更多 的文章帮我省了很多的事

source code


到此结  DragonFangQy 2023.12.24

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容