Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
BiliDriveEx
提交
5399f695
B
BiliDriveEx
项目概览
OpenDocCN
/
BiliDriveEx
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
B
BiliDriveEx
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
5399f695
编写于
11月 02, 2019
作者:
H
Hsury
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
优化超时重试逻辑
上级
1edee325
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
90 addition
and
60 deletion
+90
-60
README.md
README.md
+1
-1
drive.py
drive.py
+89
-59
未找到文件。
README.md
浏览文件 @
5399f695
...
...
@@ -5,7 +5,7 @@
<h1
align=
"center"
>
- BiliDrive -
</h1>
<p
align=
"center"
>
<img
src=
"https://img.shields.io/badge/version-2019.1
0.30
-green.svg?longCache=true&style=for-the-badge"
>
<img
src=
"https://img.shields.io/badge/version-2019.1
1.2
-green.svg?longCache=true&style=for-the-badge"
>
<img
src=
"https://img.shields.io/badge/license-SATA-blue.svg?longCache=true&style=for-the-badge"
>
</p>
...
...
drive.py
浏览文件 @
5399f695
...
...
@@ -8,11 +8,13 @@ import math
import
os
import
re
import
requests
import
shlex
import
signal
import
struct
import
sys
import
threading
import
time
import
traceback
import
types
from
bilibili
import
Bilibili
...
...
@@ -67,7 +69,7 @@ def image_upload(data, cookies):
headers
=
{
'Origin'
:
"https://t.bilibili.com"
,
'Referer'
:
"https://t.bilibili.com/"
,
'User-Agent'
:
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/7
7.0.3865.12
0 Safari/537.36"
,
'User-Agent'
:
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/7
8.0.3904.7
0 Safari/537.36"
,
}
files
=
{
'file_up'
:
(
f
"
{
int
(
time
.
time
()
*
1000
)
}
.bmp"
,
data
),
...
...
@@ -75,17 +77,27 @@ def image_upload(data, cookies):
'category'
:
"daily"
,
}
try
:
response
=
requests
.
post
(
url
,
headers
=
headers
,
cookies
=
cookies
,
files
=
files
).
json
()
response
=
requests
.
post
(
url
,
headers
=
headers
,
cookies
=
cookies
,
files
=
files
,
timeout
=
5
).
json
()
except
:
response
=
None
return
response
def
image_download
(
url
):
headers
=
{
'Referer'
:
"http://t.bilibili.com/"
,
'User-Agent'
:
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
,
}
content
=
[]
last_chunk_time
=
None
try
:
response
=
requests
.
get
(
url
).
content
for
chunk
in
requests
.
get
(
url
,
headers
=
headers
,
timeout
=
5
,
stream
=
True
).
iter_content
(
64
*
1024
):
if
last_chunk_time
is
not
None
and
time
.
time
()
-
last_chunk_time
>
5
:
return
None
content
.
append
(
chunk
)
last_chunk_time
=
time
.
time
()
return
b
""
.
join
(
content
)
except
:
response
=
None
return
response
return
None
def
log
(
message
):
Bilibili
.
_log
(
message
)
...
...
@@ -141,45 +153,58 @@ def login_handle(args):
def
upload_handle
(
args
):
def
core
(
index
,
block
):
block_sha1
=
calc_sha1
(
block
,
hexdigest
=
True
)
full_block
=
bmp_header
(
block
)
+
block
full_block_sha1
=
calc_sha1
(
full_block
,
hexdigest
=
True
)
url
=
skippable
(
full_block_sha1
)
if
url
:
# log(f"分块{index} ({len(block) / 1024 / 1024:.2f} MB) 已存在于服务器")
block_dict
[
index
]
=
{
'url'
:
url
,
'size'
:
len
(
block
),
'sha1'
:
block_sha1
,
}
done_flag
.
release
()
else
:
# log(f"分块{index} ({len(block) / 1024 / 1024:.2f} MB) 开始上传")
for
_
in
range
(
10
):
response
=
image_upload
(
full_block
,
cookies
)
if
response
:
if
response
[
'code'
]
==
0
:
url
=
response
[
'data'
][
'image_url'
]
log
(
f
"分块
{
index
}
(
{
len
(
block
)
/
1024
/
1024
:.
2
f
}
MB) 上传完毕"
)
block_dict
[
index
]
=
{
'url'
:
url
,
'size'
:
len
(
block
),
'sha1'
:
block_sha1
,
}
done_flag
.
release
()
break
elif
response
[
'code'
]
==
-
4
:
terminate_flag
.
set
()
log
(
f
"分块
{
index
}
(
{
len
(
block
)
/
1024
/
1024
:.
2
f
}
MB) 第
{
_
+
1
}
次上传失败, 请重新登录"
)
break
log
(
f
"分块
{
index
}
(
{
len
(
block
)
/
1024
/
1024
:.
2
f
}
MB) 第
{
_
+
1
}
次上传失败"
)
try
:
block_sha1
=
calc_sha1
(
block
,
hexdigest
=
True
)
full_block
=
bmp_header
(
block
)
+
block
full_block_sha1
=
calc_sha1
(
full_block
,
hexdigest
=
True
)
url
=
skippable
(
full_block_sha1
)
if
url
:
# log(f"分块{index} ({len(block) / 1024 / 1024:.2f} MB) 已存在于服务器")
block_dict
[
index
]
=
{
'url'
:
url
,
'size'
:
len
(
block
),
'sha1'
:
block_sha1
,
}
done_flag
.
release
()
else
:
terminate_flag
.
set
()
# log(f"分块{index} ({len(block) / 1024 / 1024:.2f} MB) 开始上传")
for
_
in
range
(
10
):
response
=
image_upload
(
full_block
,
cookies
)
if
response
:
if
response
[
'code'
]
==
0
:
url
=
response
[
'data'
][
'image_url'
]
log
(
f
"分块
{
index
}
(
{
len
(
block
)
/
1024
/
1024
:.
2
f
}
MB) 上传完毕"
)
block_dict
[
index
]
=
{
'url'
:
url
,
'size'
:
len
(
block
),
'sha1'
:
block_sha1
,
}
done_flag
.
release
()
break
elif
response
[
'code'
]
==
-
4
:
terminate_flag
.
set
()
log
(
f
"分块
{
index
}
(
{
len
(
block
)
/
1024
/
1024
:.
2
f
}
MB) 第
{
_
+
1
}
次上传失败, 请重新登录"
)
break
log
(
f
"分块
{
index
}
(
{
len
(
block
)
/
1024
/
1024
:.
2
f
}
MB) 第
{
_
+
1
}
次上传失败"
)
else
:
terminate_flag
.
set
()
except
:
terminate_flag
.
set
()
traceback
.
print_exc
()
def
skippable
(
sha1
):
url
=
default_url
(
sha1
)
response
=
requests
.
head
(
url
)
return
url
if
response
.
status_code
==
200
else
None
headers
=
{
'Referer'
:
"http://t.bilibili.com/"
,
'User-Agent'
:
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
,
}
for
_
in
range
(
3
):
try
:
response
=
requests
.
head
(
url
,
headers
=
headers
,
timeout
=
5
)
return
url
if
response
.
status_code
==
200
else
None
except
:
pass
return
None
def
write_history
(
first_4mb_sha1
,
meta_dict
,
url
):
history
=
read_history
()
...
...
@@ -249,24 +274,29 @@ def upload_handle(args):
def
download_handle
(
args
):
def
core
(
index
,
block_dict
):
# log(f"分块{index} ({block_dict['size'] / 1024 / 1024:.2f} MB) 开始下载")
for
_
in
range
(
10
):
block
=
image_download
(
block_dict
[
'url'
])[
62
:]
if
block
:
if
calc_sha1
(
block
,
hexdigest
=
True
)
==
block_dict
[
'sha1'
]:
file_lock
.
acquire
()
f
.
seek
(
block_offset
(
index
))
f
.
write
(
block
)
file_lock
.
release
()
log
(
f
"分块
{
index
}
(
{
block_dict
[
'size'
]
/
1024
/
1024
:.
2
f
}
MB) 下载完毕"
)
done_flag
.
release
()
break
try
:
# log(f"分块{index} ({block_dict['size'] / 1024 / 1024:.2f} MB) 开始下载")
for
_
in
range
(
10
):
block
=
image_download
(
block_dict
[
'url'
])
if
block
:
block
=
block
[
62
:]
if
calc_sha1
(
block
,
hexdigest
=
True
)
==
block_dict
[
'sha1'
]:
file_lock
.
acquire
()
f
.
seek
(
block_offset
(
index
))
f
.
write
(
block
)
file_lock
.
release
()
log
(
f
"分块
{
index
}
(
{
block_dict
[
'size'
]
/
1024
/
1024
:.
2
f
}
MB) 下载完毕"
)
done_flag
.
release
()
break
else
:
log
(
f
"分块
{
index
}
(
{
block_dict
[
'size'
]
/
1024
/
1024
:.
2
f
}
MB) 校验未通过"
)
else
:
log
(
f
"分块
{
index
}
(
{
block_dict
[
'size'
]
/
1024
/
1024
:.
2
f
}
MB)
校验未通过
"
)
log
(
f
"分块
{
index
}
(
{
block_dict
[
'size'
]
/
1024
/
1024
:.
2
f
}
MB)
第
{
_
+
1
}
次下载失败
"
)
else
:
log
(
f
"分块
{
index
}
(
{
block_dict
[
'size'
]
/
1024
/
1024
:.
2
f
}
MB) 第
{
_
+
1
}
次下载失败"
)
e
lse
:
terminate_flag
.
set
(
)
e
xcept
:
terminate_flag
.
set
()
traceback
.
print_exc
()
def
block_offset
(
index
):
return
sum
(
meta_dict
[
'block'
][
i
][
'size'
]
for
i
in
range
(
index
))
...
...
@@ -301,10 +331,11 @@ def download_handle(args):
else
:
# log(f"分块{index} ({block_dict['size'] / 1024 / 1024:.2f} MB) 需要重新下载")
download_block_list
.
append
(
index
)
log
(
f
"
{
len
(
download_block_list
)
}
个分块待下载"
)
else
:
return
None
else
:
download_block_list
=
list
(
range
(
len
(
meta_dict
[
'block'
])))
download_block_list
=
list
(
range
(
len
(
meta_dict
[
'block'
])))
done_flag
=
threading
.
Semaphore
(
0
)
terminate_flag
=
threading
.
Event
()
file_lock
=
threading
.
Lock
()
...
...
@@ -334,7 +365,7 @@ def download_handle(args):
if
__name__
==
"__main__"
:
signal
.
signal
(
signal
.
SIGINT
,
lambda
signum
,
frame
:
os
.
kill
(
os
.
getpid
(),
9
))
parser
=
argparse
.
ArgumentParser
(
description
=
"Bili
bili Drive"
,
epilog
=
"By Hsury, 2019/10/30
"
)
parser
=
argparse
.
ArgumentParser
(
description
=
"Bili
Drive"
,
epilog
=
"By Hsury, 2019/11/2
"
)
subparsers
=
parser
.
add_subparsers
()
history_parser
=
subparsers
.
add_parser
(
"history"
,
help
=
"view upload history"
)
history_parser
.
set_defaults
(
func
=
history_handle
)
...
...
@@ -359,7 +390,7 @@ if __name__ == "__main__":
shell
=
False
while
True
:
if
shell
:
args
=
input
(
"BiliDrive > "
).
split
(
)
args
=
shlex
.
split
(
input
(
"BiliDrive > "
)
)
if
args
==
[
"exit"
]:
break
elif
args
==
[
"help"
]:
...
...
@@ -377,4 +408,3 @@ if __name__ == "__main__":
break
except
AttributeError
:
shell
=
True
parser
.
print_help
()
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录