python教程

超星云盘Python解析直链方法

精准像素 2021-09-17 人阅读

超星云盘特点

1、超星云盘是全国最大的图书数字化加工中心之一,安全有保证。

2、拥有100GB免费存储空间,上传下载也同样是不限速的。


3、网页版单文件上传,最高只支持1GB,而客户端是不限大小的。

4、文件直链分享,就是不需要经过分享页面,点击后就能直接下载的链接。

超星云盘Python解析直链方法
超星云盘截图

Python直连解析方法

非登录状态上传引用的另一个接口,登录状态上传使用ftp而非post来突破单文件1GB的限制(ftp上传不需要登录但是提取出直链需要,所以还是要提供Cookie),我只测试过4.32GB的文件没有问题。
登录后文件上传是支持断点续传的(没有实现),秒传必须是有人曾经上传过的(必须在登录状态),上传到网盘后的文件会删除不会占用空间,分享链接不会失效。

# -*- coding: utf-8 -*-
import requests,json
from ftplib import FTP
import os, time, sys
 
cookie = { #在下方引号内填入UID和uf两个cookies参数,仅上传200MB以上文件需要
    "UID": "",
    "uf": ""
    }
 
 
class Chaopan(object):
    def __init__(self, cookies):
        """登录超盘"""
        session = requests.session()
        requests.utils.add_dict_to_cookiejar(session.cookies, cookies)
        response = session.get('https://pan-yz.chaoxing.com/api/token/uservalid')
        retobj = json.loads(response.text)
        if not retobj["result"]:
            raise Exception("参数验证失败,登录状态失效")
        self.__token = retobj["_token"]
        self.__id = cookies["UID"]
        self.__session = session
 
    def __get_info(self):
        url = f'https://pan-yz.chaoxing.com/api/info?puid={self.__id}&_token={self.__token}'
        return self.__session.get(url).json()["data"]
 
    def get_disk_capacity(self):
        """获取总空间和已用空间大小"""
        url = f'https://pan-yz.chaoxing.com/api/getUserDiskCapacity?puid={self.__id}&_token={self.__token}'
        response = self.__session.get(url)
        retobj = json.loads(response.text)
        return retobj
 
    def list_dir(self, fldid='', orderby='d', order='desc', page=1, size=100, addrec=False, showCollect=1):
        """列举目录文件"""
        url = f'https://pan-yz.chaoxing.com/api/getMyDirAndFiles?puid={self.__id}&fldid={fldid}&orderby={orderby}&order={order}&page={page}&size={size}&_token={self.__token}&addrec={addrec}&showCollect={showCollect}'
        response = self.__session.get(url)
        retobj = json.loads(response.text)
        return retobj
 
    def __create_file_new(self, file: "本地文件", fldid=""):
        url = 'https://pan-yz.chaoxing.com/opt/createfilenew'
        BYTES_PER_CHUNK = 512 * 1024
        LIMIT = 1024 * 1024
        ffile = []
        rr = file.tell()
        size = file.seek(0, 2)
        file.seek(0, 0)
        ffile.append(file.read(BYTES_PER_CHUNK))
        file.seek(BYTES_PER_CHUNK + size - LIMIT, 0)
        ffile.append(file.read(BYTES_PER_CHUNK))
        file.seek(0, rr)
 
        path,name = os.path.split(file.name)
 
        files = {
            "file0":(ffile[0]),
            "file1":(ffile[1])
            }
        post_data = {
            "size": size,
            "fn": name,
            "puid":0,
            }
        if fldid:
            post_data["fldid"] = fldid
 
        response = self.__session.post(url, data=post_data, files=files)
        return json.loads(response.text)
 
    def __ftp_upload_file(self, file: "本地文件", timemil, callback=None):
        jindu = [file.seek(0, 2),0]
        def __callback(block):
            jindu[1] += 8192
            if jindu[1] < jindu[0]:
                callback(jindu[1] / jindu[0])
            else:
                callback(1)
        info = self.__get_info()
        upath = info["froot"]
        host = info["host"]
        ftp = FTP()
        ftp.encoding = 'utf-8'
        ftp.connect(host, 21)
        ftp.login("usertemp", "0GYF0hBAbsXVBZCUPaSOVS")
        ftp.set_pasv(True)
        ftp.mkd(f'/{upath}/{timemil}')
        path,name = os.path.split(file.name)
        file.seek(0, 0)
        if callback:
            res = ftp.storbinary(f'STOR /{upath}/{timemil}/{name}', file, blocksize=8192, callback=__callback)
        else:
            res = ftp.storbinary(f'STOR /{upath}/{timemil}/{name}', file)
        ret =  res.find('226') != -1
        ftp.quit()
        return ret
 
    def __sync_upload(self, timemil, pntid=""):
        url = 'https://pan-yz.chaoxing.com/api/notification/rsyncsucss'
        post_data = {
            "puid": self.__id,
            "rf": timemil,
            "_token": self.__token
            }
        if pntid:
            post_data["pntid"] = pntid
 
        response = self.__session.post(url, data=post_data)
        return json.loads(response.text)
 
    def __crcstatus(self, crc):
        url = f'https://pan-yz.chaoxing.com/api/crcstatus?puid={self.__id}&crc={crc}&_token={self.__token}'
        response = requests.get(url)
        return json.loads(response.text)
 
    def upload_file(self, file: "本地文件", fldid="", callback=None):
        """上传文件"""
        size = Chaopan.__getsize(file)
        if size > 1024 * 1024 + 1024 * 1024:
            retobj = self.__create_file_new(file, fldid)
            if retobj["result"]:
                return retobj["data"]
 
            crc = retobj["crc"]
            timemil = retobj["timemil"]
 
            if self.__ftp_upload_file(file, timemil, callback):
                self.__sync_upload(timemil, fldid)
            return self.__crcstatus(crc)
 
        else:
            timemil = int(time.time() * 1000)
            self.__ftp_upload_file(file, timemil, callback)
            return  self.__sync_upload(timemil, fldid)
 
    def del_file(self, id: '文件id,多个请用英文逗号","分隔'):
        """删除网盘上文件"""
        url = 'https://pan-yz.chaoxing.com/api/delete'
        post_data = {
            "puid": self.__id,
            "resids": id,
            "_token": self.__token
            }
        response = self.__session.post(url, data=post_data)
        return json.loads(response.text)
 
    @staticmethod
    def upload_share_file(file: "本地文件或Bytes"):
        """上传本地文件转链接,不得大于200M"""
        size = Chaopan.__getsize(file)
        if size == 0 or size > 200000000:
            return {"status":False,"msg":"文件大小必须在0-200MB之间"}
        url = 'http://notice.chaoxing.com/pc/files/uploadNoticeFile'
        file_data = {
            'attrFile': file
            }
        response = requests.post(url, files=file_data)
        return json.loads(response.text)
 
    @staticmethod
    def __getsize(file):
        """获取文件大小"""
        import _io
        if isinstance(file, _io.BufferedReader):
            rr = file.tell()
            size = file.seek(0, 2)
            file.seek(0, rr)
            return size
        elif isinstance(file, bytes):
            return len(file)
        else:
            return 0
 
def callback(per):
    hashes = '#' * int(per * 30)
    spaces = ' ' * (30 - len(hashes))
    sys.stdout.write("rPercent: [%s] %d%%"%(hashes + spaces, per*100))
    sys.stdout.flush()
 
filepath = input("请输入文件路径: ")
 
try:
    with open(filepath, 'rb') as f:
        size = f.seek(0, 2)
        f.seek(0, 0)
        if size <= 200000000:
            print("正在上传中,请等待...")
            ret = Chaopan.upload_share_file(f)
            if ret["status"]:
                print(f'下载直链为(http替换为https仍然可用): {ret["att_file"]["att_clouddisk"]["downPath"]}')
                print(f'分享链接为: {ret["att_file"]["att_clouddisk"]["shareUrl"]}')
            else:
                print(f'转直链失败,原因为{ret["msg"]}')
        else:
            print("您的文件大于200M, 正在以登录状态上传,请等待...")
            cp = Chaopan(cookie)
            retobj = cp.upload_file(f, callback=callback)
            print("")
            print(f'下载直链为(http替换为https仍然可用): http://d0.ananas.chaoxing.com/download/{retobj["objectId"]}')
            print(f'分享链接为: http://cloud.ananas.chaoxing.com/view/fileview?objectid={retobj["objectId"]}')
            print('正在清理网盘空间(清理后上传的文件不会占用您的网盘空间)')
            time.sleep(3)
            if "id" in retobj:
                cp.del_file(retobj["id"])
            elif "resid" in retobj:
                cp.del_file(retobj["resid"])
            print('清理完成')
 
except Exception as e: 
    print(f'出现错误,原因为:{str(e)}')


相关专题
解析
解析
2022-03-03 1297

解析是一种破解限制下载工具,精准像素为你整理收集所有关于解析的资源,包含视频解析软件,音乐解析软件,在线解析网站,通通都是免费解析下载必备软件....

相关推荐
  • 网盘直链
  • python解析
  • 最新可用天翼云直链解析工具
    最新可用天翼云直链解析工具

    工具介绍最新可用天翼云直链解析工具,最新版4月1号更新规则,暂时免费使用。天翼云直链工具截图使用方法输入别人分享的文件链接和密码即可实现免登陆高速下载!需要配合其他下载工具一起使用,免费分享...

    在线工具 718 1年前
  • Motrix百度网盘直链下载浏览器脚本v0.0.7
    Motrix百度网盘直链下载浏览器脚本v0.0.7

    脚本说明Motrix百度网盘直链下载浏览器脚本是一款非常好用的百度网盘直链下载工具,搭配Motrix下载软件使用,能够不限速下载。注意事项:此脚本默认会临时分享指定下载的文件,这样才能通过svip账号解析...

    浏览器插件 239 1年前
  • 天翼网盘在线直链解析网站源码
    天翼网盘在线直链解析网站源码

    源码说明这几天好多人找精准像素要天翼网盘在线直链解析网站源码,之前分享一款应该是失效了。今天收集了2套天翼网盘在线直链解析网站源码分享给大家。天翼网盘在线直链解析网站源码无需授权,伪静...

    php源码 336 2年前
  • Python抖音官方接口分享

    抓了两个抖音的接口,一个是官方新的解析接口,另一个是拼接测试出来一个未公开的查用户信息的接口,一起分享给大家。代码放到阿里云的函数计算,可以直接托管到公网(腾讯云的云函数还需要自己配置API网关)。代码import requestsimport reheaders = {&#39;Use...

    python教程 120 1年前
  • Python好看视频地址解析下载代码

    #encoding:utf-8# 好看视频下载 import socketfrom urllib.request import urlopenimport urllibimport reimport timefrom pyquery import PyQuery as pqimport requestsfrom tqdm import tqdm # 打印进度条的库import gzip print(&#39;程序开始运...

    python教程 36 9个月前
  • 好看短视频解析下载Python脚本

    前言好看视频是百度旗下的短视频平台,里面有海量好看的短视频,遇到我们喜欢的,要如何下载呢。下面直接给出python语言中地址的解析及各种不同格式视频的下载。#encoding:utf-8# 好看视频下载 import socketfrom urllib.request import urlopenimport ur...

    python教程 45 1年前