国内部分网盘秒传链接分析和互相转换

2023-02-13 19:20:32 11点赞 91收藏 20评论

原理

上传到网盘的每个文件,服务器都会校验MD5码。如果这个您上传的文件MD5码与已经存在于服务器里的文件的MD5码相同的话,网盘服务器将会判断成为重复文件,只需要复制副本保存在网盘上即可。这样实现了服务器的高效运作。

协议分析

因此一般厂商会使用多个HASH联合的方式。 下面列出常用网盘的HASH计算方式。

国内部分网盘秒传链接分析和互相转换

Ppikpak和迅雷云盘是一个计算方式

阿里云盘之前也是SHA1和115类似

可惜的是阿里云盘前两年年取消了秒传

应用场景

本地生成秒传链接,分享或发布

网上本地生成秒传链接的工具蛮多,我自己整理了一下做了个整合版

支持115、百度网盘、pikpak,支持单个文件或文件夹

自动遍历文件夹下所有文件,生成结果保存在脚本所在txt文件

生成链接不包含路径,有需要的自己改下吧

使用方式如图

国内部分网盘秒传链接分析和互相转换

python代码和打包的exe文件放在gitee

sonata1/network-disk-application

不知道为gitee啥链接不能过审那就直接把代码打下面吧

import os
import sys
import hashlib

def get_sha1sum(buffer):
BUFFERSIZE = 128*1024
sha1 = hashlib.sha1()
sha1128ksum = None
while True:
data = buffer.read(BUFFERSIZE)
if not data:
break
sha1.update(data)
if not sha1128ksum:
sha1128ksum = hashlib.sha1(data).hexdigest().upper()
sha1sum = sha1.hexdigest().upper()
return sha1sum, sha1128ksum



def create_url(filename):
name = os.path.basename(filename)
size = os.stat(filename).st_size
with open(filename, "rb") as f:
sha1sum, sha1128ksum = get_sha1sum(f)
return "115://%s|%s|%s|%s" % (name, size, sha1sum, sha1128ksum)

def gcid_hash_file(path):
h = hashlib.sha1()
size = os.path.getsize(path)
psize = 0x40000
while size / psize > 0x200 and psize < 0x200000:
psize = psize << 1
with open(path, 'rb') as stream:
data = stream.read(psize)
while data:
h.update(hashlib.sha1(data).digest())
data = stream.read(psize)
(path, filename) = os.path.split(path)

return 'PikPak://'+filename+'|'+str(size)+'|'+h.hexdigest().upper()

def hash_f(pth:str,api:str='md5',block_size:int=1024*1024,head_size:int=256*1024)->list:
with open(pth,'rb') as f:
hsh=hashlib.new(api,f.read(head_size))
head=hsh.hexdigest()
while True:
data=f.read(block_size)
if not data:
break
hsh.update(data)
return [hsh.hexdigest(),head,]

def _file(pth:str)->str:
if mode == 'baidu网盘':
_ll=[str(i) for i in hash_f(pth)+[os.path.getsize(pth),os.path.basename(pth)]]
ans='#'.join(_ll)
with open(mode+'_link.txt',"a+") as file: #”w"代表着每次运行都覆盖内容
file.write(ans+"n")
return os.path.abspath(pth)+' :n'+ans+'n'
if mode == 'pikpak':
ans = gcid_hash_file(pth)
with open(mode+'_link.txt',"a+") as file: #”w"代表着每次运行都覆盖内容
file.write(ans+"n")
return os.path.abspath(pth)+' :n'+ans+'n'
if mode == '115':
ans = create_url(pth)
with open(mode+'_link.txt',"a+") as file: #”w"代表着每次运行都覆盖内容
file.write(ans+"n")
return os.path.abspath(pth)+' :n'+ans+'n'

def _dir(pth:str)->str:
ans=list()
for r,d,f in os.walk(pth):
for i in f:
ans.append(_file(os.path.join(r,i)))
return 'n'.join(ans)

def mian(pth:str)->str:


if os.path.isfile(pth):
return _file(pth)
if os.path.isdir(pth):
return _dir(pth)
return '没有此文件或者目录: "'+os.path.abspath(pth)+'"n'


sign = True #标志位置为 True
while sign:

ipt = input("1:115 2:baidu网盘 3:pikpak q:退出n结果会保存在脚本所在目录对应txt文件n请输入序号:")
n = ipt
if ipt == 'q' or ipt == 'Q':
sign = False #标志位置为 False
print("Thanks for playing!")
if ipt in ['1','2','3']:
temp_list= ['115','baidu网盘','pikpak']
mode = temp_list[int(ipt)-1]
if os.path.exists(mode+'_link.txt'):
os.remove(mode+'_link.txt')
while sign:

f_ipt = input("请输入要生成"+mode+"秒传链接的文件或文件夹路径:")
if f_ipt == 'q' or f_ipt == 'Q':
sign = False #标志位置为 False
else:

结果 = mian(f_ipt)
print(结果)

115、百度网盘、pikpak垮网盘直接生成秒传链接

把某一家的资源迁移到另外一家

这里建议用alist配合115版rlcone挂载(不会挂载的同学可以参考系列另一篇文章)

就可以用上面的脚本生成链接了

需要注意 115和百度网盘都需要计算整个文件的HASH

也就是说相当于把文件完全下载到本地第一次

注意批量下载请求不要超过网站限制

另外还要注意传入方是否已经有这个文件了

几家网盘的体量都比较大,常规文件大部分都可以

其实做一个浏览器脚本更方便使用,不过没精力弄了

这里顺便说下国外网盘

Google Drive,Jottacloud自带MD5信息,可以免下载快速生成百度云盘秒传链接

OneDrive,Box,(还有115)自带SHA1信息,可以免下载快速生成115秒传链接

工具暂时还没写。有需要的自行google下看看能不找到

上传工具

115:油猴脚本 115转存助手

百度网盘:油猴脚本 秒传链接提取

PikPak:第三方网页版

阿里云盘超级会员12个月SVIP年卡8TB容量极速下载充值手机号198元天猫精选去购买
展开 收起
20评论

  • 精彩
  • 最新
  • 阿里云盘还是sha1检验,只是加了随机切片字段。用clouddrive,同时挂载115和阿里云就可以互相秒传了。或者挂两个阿里云互相也可以秒传。只是不能无来源秒传。这个也是以后安全考虑的趋势。

    校验提示文案

    提交
    怪不得,那有点难搞,

    校验提示文案

    提交
    收起所有回复
  • 你好,我想请问下telegram的文件如何和pikpak的hash关联起来呢,能够互相转换吗

    校验提示文案

    提交
    T-Drive挂载,不过这样不好吧还不如用pikpak的离线下载

    校验提示文案

    提交
    我已经知道了,telegram生成的file_id 无法通过计算得到,所以没办法和pikpak建立连接,pikpak的元数据信息里面的link也没有存储具体的消息id

    校验提示文案

    提交
    收起所有回复
  • 你好,我想问下一个文件的多个hash值如何合并成一个hash值,sha2-256

    校验提示文案

    提交
    你是说大文件分块读取计算然后合并吗?

    校验提示文案

    提交
    现在我场景是有pikpak的文件hash,也可以获取到telegram文件的分片hash(sha2-256),这两个可以互相转换吗

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 你好我想请教下,115sha1的连接可以转存到百度网盘或者夸克网盘吗?

    校验提示文案

    提交
    sha1和MD5不是一个东西啊,只能挂载之后算

    校验提示文案

    提交
    收起所有回复
  • 迅雷的文件能秒传到pikpak吗?
    我看代码里没有
    这样就能少开迅雷会员了

    校验提示文案

    提交
    太久了,不记得了, [高兴] 按理说应该直接可以用吧。都不需要转换。

    校验提示文案

    提交
    收起所有回复
  • 昨天试了下阿里云盘又开放了秒传,不过限制太多,没有实用价值

    校验提示文案

    提交
  • 啥都不用问,115绝对厉害,懂得都懂。

    校验提示文案

    提交
    我也是使用115

    校验提示文案

    提交
    收起所有回复
  • 我才发现这个脚本是全部完成后统一显示链接的,网盘用的话自己改下吧或者一次不要生成太多 [高兴]

    校验提示文案

    提交
  • 很技术流~~~

    校验提示文案

    提交
  • 简单的一点用copy /B附加一个文本文件到所要上传的文件上边不就可以实现更改文件MD5值了吗,那你的文件就不会秒传了

    校验提示文案

    提交
  • 比较好奇得到的PikPak://1.mp4|709545321|2D47019B575ADE0DEC072E3E7C78877AC2E080E11 这种链接如何使用呢

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
91
扫一下,分享更方便,购买更轻松