Code Monkey home page Code Monkey logo

bilibiliuploader's Introduction

BilibiliUploader

模拟B站pc投稿工具进行投稿

B站分区tid号码查询

https://github.com/FortuneDayssss/BilibiliUploader/wiki/Bilibili%E5%88%86%E5%8C%BA%E5%88%97%E8%A1%A8

海外DNS无法解析问题

海外的DNS有时无法解析upcdn-szhw.bilivideo.com域名导致上传失败,此时可以考虑将DNS服务器临时改为1.2.4.8

登录

支持密码登录以及access_token登录

uploader = BilibiliUploader()

# 账号密码登录
uploader.login("username_example", "password_example")

# 使用存有access_token的json文件登录
uploader.login_by_access_token_file("/YOURFILEPATH/bililogin.json")

# 直接使用access_token登录,refresh_token可以不提供,没有refresh_token更新时间的话access_token会在获取的30天后过期(todo: refresh)
uploader.login_by_access_token("ACCESS_TOKEN")
uploader.login_by_access_token("ACCESS_TOKEN", "REFRESH_TOKEN")

# 登录后获取access_token与refresh_token
access_token, refresh_token = uploader.save_login_data(file_name="/YOURFOLDER/bililogin.json")

Example

from bilibiliuploader.bilibiliuploader import BilibiliUploader
from bilibiliuploader.core import VideoPart

if __name__ == '__main__':
    uploader = BilibiliUploader()
    
    # 登录
    uploader.login("username_example", "password_example")

    # 处理视频文件
    parts = []
    parts.append(VideoPart(
        path="C:/Users/xxx/Videos/1.mp4",
        title="分p名:p1",
        desc="这里是p1的简介"
    ))
    parts.append(VideoPart(
        path="C:/Users/xxx/Videos/2.mp4",
        title="分p名:p2",
        desc="这里是p2的简介"
    ))
    
    # 上传
    avid, bvid = uploader.upload(
        parts=parts,
        copyright=2,
        title='py多p上传测试1',
        tid=171,
        tag=",".join(["python", "测试"]),
        desc="python多p上传测试",
        source='https://www.github.com/FortuneDayssss',
        thread_pool_workers=5,
    )
    
    
    # 修改已有投稿
    parts = []
    parts.append(VideoPart(
        path="C:/Users/xxx/Videos/1.mp4",
        title="edit分p名:p1",
        desc="这里是p1的简介"
    ))
    parts.append(VideoPart(
        path="C:/Users/xxx/Videos/2.mp4",
        title="edit分p名:p2",
        desc="这里是p2的简介"
    ))
    uploader.edit(
        avid=414167215,
        parts=parts,
        copyright=2,
        title='edit 测试1',
        tag=",".join(["python", "测试", "edit"]),
        desc="python多p edit测试",
        source='https://www.github.com/FortuneDayssss',
        cover='/cover_folder/cover.png',
    )

Parameters && Structures

VideoPart

VideoPart代表投稿内各个分p

  • path:上传的文件路径

  • title:分p标题

  • desc:分p简介

  • server_file_name:pre_upload API自动生成的服务端文件名,不需要填写

Upload

  • parts:VideoPart结构体

  • copyright: int 版权标志,1为原创2为转载,转载投稿需要填写下面的source参数

  • title: str 投稿标题

  • tid: int 投稿分区号

  • tag: str 以半角逗号分割的字符串

  • desc: str 视频简介

  • source: int, 转载地址

  • cover: str, 封面图片路径,若路径不正确则默认封面为空

  • no_reprint: int = 0,视频是否禁止转载标志0无1禁止

  • open_elec: int = 1,是否开启充电面板,0为关闭1为开启

  • max_retry: int = 5 上传重试次数

  • thread_pool_workers: int = 1 多视频并行上传最大线程数,默认为串行上传

Edit

  • avid: av号 (av/bv提供其一即可)

  • bvid: bv号 (av/bv提供其一即可)

  • parts: VideoPart list (不填写参数则不修改)

  • insert_index: 新视频分P位置(不填写参数则从最后追加)

  • copyright: 原创/转载 (不填写参数则不修改)

  • title: 投稿标题 (不填写参数则不修改)

  • tid: 分区id (不填写参数则不修改)

  • tag: 标签 (不填写参数则不修改)

  • desc: 投稿简介 (不填写参数则不修改)

  • source: 转载地址 (不填写参数则不修改)

  • cover: 封面路径 (不填写参数则不修改)

  • no_reprint: 可否转载 (不填写参数则不修改)

  • open_elec: 充电 (不填写参数则不修改)

  • max_retry: 上传重试次数

  • thread_pool_workers: 多视频并行上传最大线程数,默认为串行上传

reference

记一次B站投稿工具逆向.

bilibiliuploader's People

Contributors

esrrhs avatar fortunedayssss avatar jhonprice avatar zhaoweicheng98 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bilibiliuploader's Issues

请问怎么设置biliuploader不通过代理上传?

因为某些特殊需求服务器需要一直挂全局代理,但是全局代理下用bilibiliuploader登录时会出现无法解析域名的报错,关闭全局代理即可恢复正常。
请问是否考虑增加参数 来设置是否通过代理上传,或者修改哪些代码片段能达到这些效果?
打扰了!

status: False upload failed

upload Prologue:p1 added in pool
chunk0/12
filename: Prologue.mp4
chunk0/12
filename: Prologue.mp4
chunk0/12
filename: Prologue.mp4
chunk0/12
filename: Prologue.mp4
chunk0/12
filename: Prologue.mp4
video part Prologue:p1 finished, status: False
upload failed

请问这个是什么原因啊?

Traceback (most recent call last):
File "D:/chromedown/bilibiliuploader-0.0.4/bilibiliuploader-0.0.4/test.py", line 43, in
thread_pool_workers=5,
File "D:\chromedown\bilibiliuploader-0.0.4\bilibiliuploader-0.0.4\bilibiliuploader\bilibiliuploader.py", line 71, in upload
thread_pool_workers)
File "D:\chromedown\bilibiliuploader-0.0.4\bilibiliuploader-0.0.4\bilibiliuploader\core.py", line 504, in upload
status = status and t_obj.result()
File "D:\ProgramData\Anaconda3\envs\pytorch\lib\concurrent\futures_base.py", line 428, in result
return self.__get_result()
File "D:\ProgramData\Anaconda3\envs\pytorch\lib\concurrent\futures_base.py", line 384, in __get_result
raise self.exception
File "D:\ProgramData\Anaconda3\envs\pytorch\lib\concurrent\futures\thread.py", line 57, in run
result = self.fn(*self.args, **self.kwargs)
File "D:\chromedown\bilibiliuploader-0.0.4\bilibiliuploader-0.0.4\bilibiliuploader\core.py", line 400, in upload_video_part
pre_upload_data = r.json()
File "D:\ProgramData\Anaconda3\envs\pytorch\lib\site-packages\requests\models.py", line 900, in json
return complexjson.loads(self.text, **kwargs)
File "D:\ProgramData\Anaconda3\envs\pytorch\lib\json_init
.py", line 348, in loads
return _default_decoder.decode(s)
File "D:\ProgramData\Anaconda3\envs\pytorch\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "D:\ProgramData\Anaconda3\envs\pytorch\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

报错,需要帮助

Traceback (most recent call last):
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python310\lib\site-packages\requests-2.27.1-py3.10.egg\requests\models.py", line 910, in json
    return complexjson.loads(self.text, **kwargs)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python310\lib\json\__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python310\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python310\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Administrator\Documents\GitHub\bilibili_video_uploader\bilibili_up.py", line 397, in <module>
    script_main()
  File "C:\Users\Administrator\Documents\GitHub\bilibili_video_uploader\bilibili_up.py", line 390, in script_main
    BiliAPI(
  File "C:\Users\Administrator\Documents\GitHub\bilibili_video_uploader\bilibili_up.py", line 84, in publish_video
    res1 = self.preupload(filename=filename, filesize=filesize)
  File "C:\Users\Administrator\Documents\GitHub\bilibili_video_uploader\bilibili_up.py", line 275, in preupload
    ).json()
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python310\lib\site-packages\requests-2.27.1-py3.10.egg\requests\models.py", line 917, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: [Errno Expecting value] <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="zh-cn">

<head>
    <meta http-equiv="Page-Enter" content="blendTrans(Duration=0.5)">
    <meta http-equiv="Page-Exit" content="blendTrans(Duration=0.5)">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta name="spm_prefix" content="333.937">
    <title>���! - bilibili.com</title>
    <style type="text/css">

        html,body {
            vertical-align: middle;
            padding: 0;
            margin: 0;
        }

        div.center {
            position: absolute;
            top: 50%;
            left: 50%;
            margin: -25% 0 0 -320px;
            width: 640px;
            min-height: 427px;
            padding: 0px;
        }

        div.errmsg {
            text-align: left;
            width: 640px;
            line-height: 150%;
        }

        a {
            text-decoration: none;
            color: red
        }

        .center {
            display: none
        }

        .h5-container {
            display: none;
        }
        @media screen and (max-width: 500px) {
            #biliMainHeader, #internationalHeader, .error-container {
                display: none;
            }

            .h5-container {
                display: block;
                position:absolute;
                top: 50%;
                left: 50%;
                transform: translate(-50%, -50%);
            }

            .h5__img {
                display: block;
                width: 300px;
            }

            .h5__desc {
                color: #a0a0a0;
                text-align: center;
            }
        }

    </style>
    <link rel="shortcut icon" href="//static.hdslb.com/images/favicon.ico">
    <link href="//static.hdslb.com/error/dist/error.css" rel="stylesheet">
    <script type="text/javascript">
        var options = {
            type: 'defaultError'
        }
        window.spmReportData = {};
        window.reportConfig = {
            sample: 1,
            msgObjects: "spmReportData",
        };
    </script>
    <script src="//s1.hdslb.com/bfs/seed/log/report/log-reporter.js"></script>
    <script type="text/javascript" src="//s1.hdslb.com/bfs/static/jinkela/long/js/jquery/jquery1.7.2.min.js"></script>
</head>

<body style="direction: ltr;">
    <div id="biliMainHeader" style="height: 56px; background-color: #fff;"></div>
    <div class="error-container">
        <div class="error-panel server-error">
            <img src="//i0.hdslb.com/bfs/feedback/f7b667011a46615732c701f4bb1d07f793f8d1df.png">
            <div style="text-align: center; padding: 0 0 40px 0;">
              <a class="rollback-btn" style="padding: 0 20px; float: none;">����页</a>
            </div>
        </div>
        <div class="error-split">
        </div>
        <div class="error-manga">
        </div>
    </div>
    <div class="h5-container">
        <img class="h5__img" src="//s1.hdslb.com/bfs/static/jinkela/long/bitmap/error_01.png" alt="parse failed">
        <div class="h5__desc">
            <span>Σ(o�д�o�) ���正��� zZ</span>
        </div>
    </div>
    <script type="text/javascript" src="//s1.hdslb.com/bfs/seed/jinkela/header-v2/header.js"></script>
    <script type="text/javascript" charset="utf-8" src="//static.hdslb.com/error/dist/error.js"></script>
</body>

</html>
: 0

[建议]不要用requests做post异步上传

用aiohttp都好,requests做上传比较容易报

urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))

During handling of the above exception, another exception occurred:

这个错误

国外vps上传慢

美国的vps上传一个20M的视频,用时要超过5分钟。换国内的1.2.4.8DNS,vps又不能正常访问国外网站了。😐有解决方案吗大佬们
@FortuneDayssss

关于登录接口失效,有一个新的想法

由于本项目是模拟PC客户端的登录和上传,现在PC客户端改版后不允许使用账号密码登录,必须使用手机验证码登录,因此已经不再方便了。但是B站的手机客户端还是能够直接用账号密码登录。为此,能否直接逆向手机客户端,然后用代码模拟手机客户端的上传行为呢?

求助大佬,上传中断问题

Traceback (most recent call last):
  File "upload.py", line 41, in <module>
    thread_pool_workers=4,
  File "/root/bilibiliuploader-0.0.2/bilibiliuploader/bilibiliuploader.py", line 41, in upload
    thread_pool_workers)
  File "/root/bilibiliuploader-0.0.2/bilibiliuploader/core.py", line 303, in upload
    status = status and t_obj.result()
  File "/usr/lib/python3.7/concurrent/futures/_base.py", line 425, in result
    return self.__get_result()
  File "/usr/lib/python3.7/concurrent/futures/_base.py", line 384, in __get_result
    raise self._exception
  File "/usr/lib/python3.7/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/root/bilibiliuploader-0.0.2/bilibiliuploader/core.py", line 220, in upload_video_part
    chunk_total_num
  File "/root/bilibiliuploader-0.0.2/bilibiliuploader/util/retry.py", line 11, in run
    return_value = func(*args, **kwargs)
  File "/root/bilibiliuploader-0.0.2/bilibiliuploader/core.py", line 157, in upload_chunk
    'PHPSESSID': server_file_name
  File "/usr/local/lib/python3.7/dist-packages/requests/api.py", line 119, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/requests/api.py", line 61, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/requests/sessions.py", line 530, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python3.7/dist-packages/requests/sessions.py", line 643, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/requests/adapters.py", line 516, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='upcdn-szhw.bilivideo.com', port=80): Max retries exceeded with url: /vs816/upload3/423902bb0d7c829e9035aa6ea44e6e68/?filename=m200804163bg5q65ukr6jz2jqi3368oc&uip=194.242.x.xx&use_dqp=0&deadline=1596684582&os=bili&profile=ugcfr%2Fpc3&uploadstart=1596540582&uport=57822&uid=530xxxxx&upcdn=172.22.33.245 (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7ff55bbd2710>: Failed to establish a new connection: [Errno -2] Name or service not known'))

上传视频中途会中断报错,并且连续好几次都是这样,这是服务器到B站上传cdn的连接问题吗?

登录报错

File "D:\Program Files\py38\lib\site-packages\bilibiliuploader-0.0.6-py3.8.egg\bilibiliuploader\bilibiliuploader.py", line 14, in login
code, self.access_token, self.refresh_token, self.sid, self.mid, _ = core.login(username, password)
File "D:\Program Files\py38\lib\site-packages\bilibiliuploader-0.0.6-py3.8.egg\bilibiliuploader\core.py", line 198, in login
return response_code, login_data['access_token'], login_data['refresh_token'], sid, login_data['mid'], login_data["expires_in"]
TypeError: 'NoneType' object is not subscriptable

今天突然不能登录了呢

File "/home/hi/bilibiliuploader/bilibiliuploader.py", line 14, in login
self.access_token, self.refresh_token, self.sid, self.mid, _ = core.login(username, password)
File "./bilibiliuploader/core.py", line 166, in login
login_data = r.json()['data']
KeyError: 'data'

关于上传速度

不知道你们有没有这个现象…用这个工具上传单个视频的时候网络占用是一阵一阵的,虽然峰值能到10Mb/s(我家上行带宽),但是大多数时间没有网络占用,只有1/4的时间在做上传。我不清楚是因为海外连接的解析/延时之类的问题,还是别的什么原因。我用多线程的时候这个问题就没那明显,能把我的带宽吃满。
另外,在web端上传单一视频时好像可以实现同时上传多个不同的chunk?不知道是不是因为这个原因,我网页端传单个视频的时候上行是一直能占满的。虽然这个工具利用的pc端的api好像和web的不一样,没有指定每个chunk的start和end,但不知道以后是否也能上传单一视频时也这样用上多线程。

请问支持多线程上传吗?

客户端同时支持上传5个视频,BilibiliUploader可否支持同时上传多个分段,还是直接调chunk大小来提高上传速度?

登录显示验证码错误

response{'code': -105, 'data': {'cookie_info': None, 'message': '', 'sso': None, 'status': 0, 'token_info': None, 'url': 'f'}, 'message': '验证码错误', 'ttl': 1}

国外VPS上传慢 2.0

系统Ubuntu 20,位于LV,带宽1000M

使用环境为DDrecorder中拉取的BilibiliUploader
上传速度约10M左右

使用biliup时,并发线程3,上传选择kodo线路,可跑至500~900M

不只Bilibiliuploader中是否有选择上传线路的办法,应如何解决

投稿视频报错

视频已经上传完了.但是最后报错了
QQ截图20201004220033
uploader.login_by_access_token("xxx")用的token这个方式

上传报错"No file in body."

upload XXXXX added in pool
chunk0/133
filename: XXXXX.mp4
408
b'{"OK":-1,"info":"No file in body."}'
chunk0/133
filename: XXXXX.mp4
408
b'{"OK":-1,"info":"No file in body."}'
chunk0/133
filename: XXXXX.mp4
408
b'{"OK":-1,"info":"No file in body."}'
chunk0/133
filename: XXXXX.mp4
408
b'{"OK":-1,"info":"No file in body."}'
chunk0/133
filename: XXXXX.mp4
408
b'{"OK":-1,"info":"No file in body."}'
video part XXXXX finished, status: False
upload failed

get_key()的函数调用有问题

Traceback (most recent call last):
File "main.py", line 28, in
File "bilibiliuploader/bilibiliuploader.py", line 14, in login
File "bilibiliuploader/core.py", line 204, in login
File "bilibiliuploader/core.py", line 233, in login_captcha
TypeError: get_key() takes 0 positional arguments but 2 were given

音频上传

你好,请问是否有机会加上音频 上传 功能?

可以使用CI/CD 的**来让Uploader更加强大

比如 指定目录并且指定投稿类型,设定时间。都使用yaml文件配置好

config:
  - project: # 可以设置多个项目
    type: "video|audio|image" # 投稿类型分为视频投稿 音频投稿 图片投稿
    workspace: "" # 视频的目录
    title: "" #发布的标题
    desc: "" # 描述性文字
    clock:  # 定时发布的时间

无法登陆

2021-12-20 11:45:38 - 【ERROR】 - Job "check_two (trigger: interval[0:10:00], next run at: 2021-12-20 11:55:38 CST)" raised an exception
Traceback (most recent call last):
File "/usr/local/lib/python3.8/dist-packages/apscheduler/executors/base.py", line 125, in run_job
retval = job.func(*job.args, **job.kwargs)
File "check.py", line 36, in check_two
run.run()
File "/root/BilibiliUploader/upload/uploader.py", line 44, in run
uploader.login("", "") #请修改这里
File "/root/BilibiliUploader/bilibiliuploader/bilibiliuploader.py", line 14, in login
code, self.access_token, self.refresh_token, self.sid, self.mid, _ = core.login(username, password)
File "/root/BilibiliUploader/bilibiliuploader/core.py", line 202, in login
response_code, access_token, refresh_token, sid, mid, expire_in = login_captcha(username, password, sid)
File "/root/BilibiliUploader/bilibiliuploader/core.py", line 229, in login_captcha
captcha_str = recognize_captcha(captcha_img)
File "/root/BilibiliUploader/bilibiliuploader/core.py", line 141, in recognize_captcha
r = requests.post(
File "/usr/local/lib/python3.8/dist-packages/requests/api.py", line 117, in post
return request('post', url, data=data, json=json, **kwargs)
File "/usr/local/lib/python3.8/dist-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/local/lib/python3.8/dist-packages/requests/sessions.py", line 528, in request
prep = self.prepare_request(req)
File "/usr/local/lib/python3.8/dist-packages/requests/sessions.py", line 456, in prepare_request
p.prepare(
File "/usr/local/lib/python3.8/dist-packages/requests/models.py", line 316, in prepare
self.prepare_url(url, params)
File "/usr/local/lib/python3.8/dist-packages/requests/models.py", line 390, in prepare_url
raise MissingSchema(error)
requests.exceptions.MissingSchema: Invalid URL 'NOT SUPPORT': No schema supplied. Perhaps you meant http://NOT SUPPORT?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.