115 Cloud / Share

Please read the following notes carefully

This interface is a reverse-engineered interface based on legacy products. The project team will not actively maintain it. Please do not submit any issues regarding fixes or further reverse engineering requests for this driver.

请仔细阅读注意事项

本接口是基于历史产物的逆向接口,项目组不会主动进行维护,请勿针对此驱动提出有关于任何修复或进行进一步逆向行为需求的issue。

115 Cloud

115 个人网盘

视频教程(优先选择文字教程)

视频教程有可能因为时间关系导致部分视频内功能不可用或产生变化

所以推荐优先选择文字教程,当然如果你看不懂文字教程或者嫌麻烦也可以观看视频教程

视频发布时间:2025-07-18

https://www.bilibili.com/video/BV1i3gTzsEma

Root folder ID

根文件夹 ID

Open the official website of 115 Cloud and click the string behind the url when you click into the folder you want to set, such as https://115.com/?cid=249163533602609229&offset=0&tab=&mode=wangpan, which is 249163533602609229

打开 115 网盘官网,点击进入要设置的文件夹时点击 URL 中 cid后面的数字

https://115.com/?cid=249163533602609229&offset=0&tab=&mode=wangpan

这个文件夹的 根文件夹ID 即为 249163533602609229

Cookie获取方式

The following message is displayed when mounting a 115 cloud. This is because 115 has removed the three client applications of Windows, Mac, and Linux.

json
{
  "state": 0,
  "error": "登录失败,系统已下架!如果你有电脑端的使用需求,我们诚挚邀请你下载体验115产品专属客户端“115浏览器”或在线使用“115网页端(115.com)”,畅享智能高效云生活。",
  "errno": 0,
  "message": "登录失败,系统已下架!如果你有电脑端的使用需求,我们诚挚邀请你下载体验115产品专属客户端“115浏览器”或在线使用“115网页端(115.com)”,畅享智能高效云生活。",
  "code": 0
}

The cookies you have obtained from these three devices cannot be used. Please obtain the cookies from other devices again to mount them.

挂载115云盘提示如下信息,是因为 115已经下架了 Windows、Mac、Linux 这三个客户端的应用

json
{
  "state": 0,
  "error": "登录失败,系统已下架!如果你有电脑端的使用需求,我们诚挚邀请你下载体验115产品专属客户端“115浏览器”或在线使用“115网页端(115.com)”,畅享智能高效云生活。",
  "errno": 0,
  "message": "登录失败,系统已下架!如果你有电脑端的使用需求,我们诚挚邀请你下载体验115产品专属客户端“115浏览器”或在线使用“115网页端(115.com)”,畅享智能高效云生活。",
  "code": 0
}

你获取的是这三个设备的Cookie自然就无法使用,请重新获取其它设备的Cookie进行挂载

1. QRCode scanning method login

1. QRCode 扫码方式登录

TIP

Still under active development, please stay tuned!

TIP

开发中, 教程暂未更新, 敬请期待!

2. Log in by manually grabbing Cookies

The cookie can be obtained from the browser with your 115 account logined, or packet capture.

TIP

Please note that cookies should not end with ;.

Cookie 可以在浏览器登录账号时从浏览器获取,如 Chrome 浏览器可以使用 115ToAlist插件 自动同步 Cookie:

115ToAlist tutorial

也可通过抓包 115 应用获取,有效期比较长。

TIP

注意 Cookie 最后不要有;


3. Get Cookies Using Python Script

Expand the detailed description to view the tutorial and script source code

Source code from:https://gist.github.com/ChenyangGao/d26a592a0aeb13465511c885d5c7ad61

展开详细说明进行查看教程和脚本源码

源码来自:https://gist.github.com/ChenyangGao/d26a592a0aeb13465511c885d5c7ad61

View source
python
#!/usr/bin/env python3
"扫码获取 115 cookie"
__author__ = "ChenyangGao <https://chenyanggao.github.io>"
__version__ = (0, 0, 2)
__all__ = [
    "AppEnum", "get_qrcode_token", "get_qrcode_status", "post_qrcode_result",
    "get_qrcode", "login_with_qrcode",
]
if __name__ == "__main__":
    from argparse import ArgumentParser, RawTextHelpFormatter
    parser = ArgumentParser(description="""\
扫码获取 115 cookie
默认在命令行输出,需要安装 qrcode: pip install qrcode
    - https://pypi.org/project/qrcode/
可以指定 -o 或 --open-qrcode 直接打开图片扫码
""", formatter_class=RawTextHelpFormatter)
    parser.add_argument("app", nargs="?", choices=("web", "android", "ios", "linux", "mac", "windows", "tv", "alipaymini", "wechatmini", "qandroid"), default="web", help="选择一个 app 进行登录,注意:这会把已经登录的相同 app 踢下线")
    parser.add_argument("-o", "--open-qrcode", action="store_true", help="打开二维码图片,而不是在命令行输出")
    parser.add_argument("-v", "--version", action="store_true", help="输出版本号")
    args = parser.parse_args()
    if args.version:
        print(".".join(map(str, __version__)))
        raise SystemExit(0)
from enum import Enum
from json import loads
from urllib.parse import urlencode
from urllib.request import urlopen, Request
AppEnum = Enum("AppEnum", "web, android, ios, linux, mac, windows, tv, alipaymini, wechatmini, qandroid")
def get_enum_name(val, cls):
    if isinstance(val, cls):
        return val.name
    try:
        if isinstance(val, str):
            return cls[val].name
    except KeyError:
        pass
    return cls(val).name
def get_qrcode_token():
    """获取登录二维码,扫码可用
    GET https://qrcodeapi.115.com/api/1.0/web/1.0/token/
    :return: dict
    """
    api = "https://qrcodeapi.115.com/api/1.0/web/1.0/token/"
    return loads(urlopen(api).read())
def get_qrcode_status(payload):
    """获取二维码的状态(未扫描、已扫描、已登录、已取消、已过期等)
    GET https://qrcodeapi.115.com/get/status/
    :param payload: 请求的查询参数,取自 `login_qrcode_token` 接口响应,有 3 个
        - uid:  str
        - time: int
        - sign: str
    :return: dict
    """
    api = "https://qrcodeapi.115.com/get/status/?" + urlencode(payload)
    return loads(urlopen(api).read())
def post_qrcode_result(uid, app="web"):
    """获取扫码登录的结果,并且绑定设备,包含 cookie
    POST https://passportapi.115.com/app/1.0/{app}/1.0/login/qrcode/
    :param uid: 二维码的 uid,取自 `login_qrcode_token` 接口响应
    :param app: 扫码绑定的设备,可以是 int、str 或者 AppEnum
        app 目前发现的可用值:
            - 1,  "web",        AppEnum.web
            - 2,  "android",    AppEnum.android
            - 3,  "ios",        AppEnum.ios
            - 4,  "linux",      AppEnum.linux
            - 5,  "mac",        AppEnum.mac
            - 6,  "windows",    AppEnum.windows
            - 7,  "tv",         AppEnum.tv
            - 8,  "alipaymini", AppEnum.alipaymini
            - 9,  "wechatmini", AppEnum.wechatmini
            - 10, "qandroid",   AppEnum.qandroid
    :return: dict,包含 cookie
    """
    app = get_enum_name(app, AppEnum)
    payload = {"app": app, "account": uid}
    api = "https://passportapi.115.com/app/1.0/%s/1.0/login/qrcode/" % app
    return loads(urlopen(Request(api, data=urlencode(payload).encode("utf-8"), method="POST")).read())
def get_qrcode(uid):
    """获取二维码图片(注意不是链接)
    :return: 一个文件对象,可以读取
    """
    url = "https://qrcodeapi.115.com/api/1.0/mac/1.0/qrcode?uid=%s" % uid
    return urlopen(url)
def login_with_qrcode(app="web", scan_in_console=True):
    """用二维码登录
    :param app: 扫码绑定的设备,可以是 int、str 或者 AppEnum
        app 目前发现的可用值:
            - 1,  "web",        AppEnum.web
            - 2,  "android",    AppEnum.android
            - 3,  "ios",        AppEnum.ios
            - 4,  "linux",      AppEnum.linux
            - 5,  "mac",        AppEnum.mac
            - 6,  "windows",    AppEnum.windows
            - 7,  "tv",         AppEnum.tv
            - 8,  "alipaymini", AppEnum.alipaymini
            - 9,  "wechatmini", AppEnum.wechatmini
            - 10, "qandroid",   AppEnum.qandroid
    :return: dict,扫码登录结果
    """
    qrcode_token = get_qrcode_token()["data"]
    qrcode = qrcode_token.pop("qrcode")
    if scan_in_console:
        try:
            from qrcode import QRCode
        except ModuleNotFoundError:
            from sys import executable
            from subprocess import run
            run([executable, "-m", "pip", "install", "qrcode"], check=True)
            from qrcode import QRCode # type: ignore
        qr = QRCode(border=1)
        qr.add_data(qrcode)
        qr.print_ascii(tty=True)
    else:
        from atexit import register
        from os import remove
        from threading import Thread
        from tempfile import NamedTemporaryFile
        qrcode_image = get_qrcode(qrcode_token["uid"])
        with NamedTemporaryFile(suffix=".png", delete=False) as f:
            f.write(qrcode_image.read())
            f.flush()
        register(lambda: remove(f.name))
        def open_qrcode():
            platform = __import__("platform").system()
            if platform == "Windows":
                from os import startfile # type: ignore
                startfile(f.name)
            elif platform == "Darwin":
                from subprocess import run
                run(["open", f.name])
            else:
                from subprocess import run
                run(["xdg-open", f.name])
        Thread(target=open_qrcode).start()
    while True:
        try:
            resp = get_qrcode_status(qrcode_token)
        except TimeoutError:
            continue
        status = resp["data"].get("status")
        if status == 0:
            print("[status=0] qrcode: waiting")
        elif status == 1:
            print("[status=1] qrcode: scanned")
        elif status == 2:
            print("[status=2] qrcode: signed in")
            break
        elif status == -1:
            raise OSError("[status=-1] qrcode: expired")
        elif status == -2:
            raise OSError("[status=-2] qrcode: canceled")
        else:
            raise OSError("qrcode: aborted with %r" % resp)
    return post_qrcode_result(qrcode_token["uid"], app)
if __name__ == "__main__":
    resp = login_with_qrcode(args.app, scan_in_console=not args.open_qrcode)
    print()
    print("; ".join("%s=%s" % t for t in resp['data']['cookie'].items()))
  1. You need to install Python 3.11.x or above
  2. If the QR code cannot be displayed properly in the CMD and powershell terminals, you can use the -o parameter to generate an image to scan the code, or you need to install an additional terminal
    1. Use the -o parameter to generate the image method and scan the QR code to confirm
      • python
             python main.py wechatmini -o
             ```
        The devices that can be obtained are as follows. If you do not fill in the device, the default device on the `Web` side will be used
        `Web``android``ios`~~`linux``mac``windows`~~`tv``alipaymini``wechatmini``qandroid`
    • alipaymini and wechatmini They are Alipay Mini Program and WeChat Mini Program.
    • Windows、Mac、Linux should not be able to use it anymore. The official client was recently removed from the shelves.
    • It is recommended to use some devices that you do not commonly use, otherwise logging in will crowd out the previous ones.

    1. Additional installation terminal
    2. Other ways, solve it yourself

Execute the command and obtain the QR code. Scan the QR code on the APP to obtain Cookie

  1. 需要安装 Python 3.11.x 以上版本
  2. 如果二维码在 CMDpowershell 两个终端无法显示正常,可以使用-o参数生成图片的方式来扫码,或者需要额外安装一个终端
    1. 使用 -o 参数,生成图片方式然后扫码确认
      • python
             python main.py wechatmini -o
             ```
        可以获取的设备有如下,如果不填写设备默认使用的是 `Web` 端的设备
        `Web``android``ios`~~`linux``mac``windows`~~`tv``alipaymini``wechatmini``qandroid`
    • alipayminiwechatmini 分别是支付宝小程序和微信小程序
    • Windows、Mac、Linux 应该不能使用了,最近官方把客户端下架了
    • 建议使用一些自己不常用的设备,否则登录会将之前的挤掉

    1. 另外安装终端
    2. 其它方式自行解决

执行命令,获取二维码 APP扫码获取 Cookie

3.1. Direct Execution
3.1.直接执行
shell
PS C:\Users\233\Desktop\115> python --version
Python 3.12.2
PS C:\Users\233\Desktop\115> python main.py wechatmini
█▀▀▀▀▀▀▀█▀▀▀▀█▀███▀▀▀█▀█▀▀▀██▀█▀▀▀▀▀▀▀█
 █▀▀▀█ █▀▄▀█▄▀▀█▀█  ▄█▀▀ █▀█ █▀▀▀█
 █▀█ ▄▀▄ ▀▄ █▀▄▀█▀█
 ▀▀▀▀▀ █▀█ ▄▀▄ ▄▀▄▀█▀█▀█ ▀▀▀▀▀
█▀██▀▀▀▀▀▀▀ ▄█ ▀█ █▀▀▀ █▀ ▄▄▄ ▀██▀█▀▀▀█
██▄▀▀▄▀▀▀▀ ▄██▀▄██▀██▄█ █▀▀▀ ▀▀▀▄▄▀ ▄▀█
   ▀██▀████ █▀ ▀▀▄▄▀▄ █▄▀▄▄ ▀▀▀█
 ▄▀▀█▄▀█▀▀██ ▀▀▀▀ ▄▀ ▀███▀██▀▄▀▀▄▄
██▄█ ▄▀▀█▄   ▀█▄▀▄▄ █▀ ▄▀▀  ▄▀█▀█▀█▀█
███▄ ▀█  █▄ ▀▀▀▀█▀█▀█ ▄▀▀  ██▄█
 █▀▀▀█ ▄▄▀▄▄▀ █▄▄▀█▀ █▀▄█  ▀▀▀ ▀█▀
 █▄ ▄▀ █▀▀ ▀▄▀▀█▀▀ ▄█▀▄▄ ▀█
 ▀▀▀▀▀ █▀  █▄▀ ▄█▄ █▄▀▀█▄ ▀▄▄ ▄▄
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

Execute the command directly. The QR code will appear in the terminal for display.

直接执行 二维码会出现在终端中进行显示

3.2. Using the -o parameter
3.2. 使用-o参数
bash
PS C:\Users\233\Desktop\115> python --version
Python 3.12.2
PS C:\Users\233\Desktop\115> python main.py wechatmini -o

After using the -o parameter, a QR code image will pop up automatically

使用 -o 参数后会自动弹出一张二维码图片

秒传

Rapid upload

  • v.3.27.0 version Enhanced Rapid upload: You can directly upload files with Alibaba Cloud Disk Open by copying
    • The premise is to upload the file from 115 Rapid upload to Alibaba Cloud Disk Open, the file already exists in Alibaba Cloud Disk Open, otherwise it is a normal copy task.
    • If you want to transfer 115 cloud disk files to Alibaba Cloud Disk in seconds, you need to turn on the Rapid upload option of Alibaba Cloud Disk, otherwise it will be uploaded in normal mode. If you want to upload files using Miaochuan, it is recommended to build an OpenList locally on your home computer and add a local storage and 115 cloud disk to copy Miaochuan to save resources.
  • v.3.27.0 版本 增强秒传:可以直接通过复制方式来和阿里云盘Open进行相互秒传文件
    • 前提是要从115秒传到阿里云盘Open的文件,阿里云盘Open已经存在,否则就是正常复制任务。
    • 如果将115的文件秒传到阿里云盘,需要将阿里云盘的秒传选项打开否则为正常模式上传 如果要使用秒传来上传文件建议在自己家用电脑本地搭建一个OpenList添加一个本地存储115云盘进行复制秒传这样节省资源。

离线下载

Offline Download

v3.37.0 and above versions support calling 115 Cloud offline download function in OpenList Select in the lower right corner and select 115 Cloud for offline download options

  • Support: magne, http, ed2k links Only 115 Cloud is supported for offline download. If it is not 115 Cloud, the following error message will be displayed, Although the offline download prompt was successfully added, an error will be prompted in the background.
  • unsupported storage driver for offline download, only 115 Cloud is supported
  • Some tips for using 115 offline downloads:
    1. Out of sync problems may occur (manual refresh in the lower right corner )
    2. Currently, when the download is successful, completed tasks in the offline list are deleted.
    3. 115 Task URLs that are already in the offline list cannot be added again.

v3.37.0 及以上版本支持在OpenList调用115离线下载功能 右下角选择 离线下载选项选择115 Cloud

  • 支持:magnethttped2k 链接 仅支持使用115个人云盘使用离线下载,非115个人云盘会提示如下错误,虽然添加离线下载提示成功但是在后台会提示错误
  • unsupported storage driver for offline download, only 115 Cloud is supported
  • 使用115离线下载的一些提示
    1. 可能会发生不同步的问题(手动右下角刷新
    2. 目前当下载成功后,删除离线列表中完成的任务
    3. 115已经在离线列表中的任务url不能再次添加

默认使用的下载方式

The default download method used

115 Share

115网盘分享

url_demo

分享链接ID^1^ 和 分享链接提取码^2^ 分别如何获取一目了然

url_demo

Sharing link ID^1^ and Sharing link extraction code^2^ How to obtain them respectively is clear at a glance.

Root folder ID

根文件夹ID

The default is empty and the entire directory file is mounted.

The folder IDs are the root folder ID and the subfolder ID respectively. The following demonstrates how to obtain the shared root folder directory ID^1^ and other subfolder directory ID^2^ respectively.

1. shared root folder directory ID

1. 分享根文件夹目录ID

Open developer mode (F12) and clear all requests first. Before we enter the folder, clear all requests first.

Let’s click on the root folder to enter. There will be a new request on the right, and then select Load to see the ID (cid) of our folder.

url_demo

打开开发者模式(F12)先将请求全部清空,我们进入文件夹,先将全部请求清空,

我们再点击根文件夹进入,右侧会有一个新的请求,然后选择载荷就能看到我们的这个文件夹的ID (cid)

url_demo

2. other subfolder directory ID

2. 其它子文件夹目录ID

打开开发者模式(F12)先将请求全部清空,我们进入文件夹,先将全部请求清空,

右侧会有一个新的请求,然后选择预览 然后进行展开查看,就可以看到其它子文件夹的ID (cid)

url_demo

Open developer mode (F12) and clear all requests first. Before we enter the folder, clear all requests first.

There will be a new request on the right, then select Preview and expand it to see the IDs (cid) of other subfolders.

url_demo

错误提示

Error Tips

For example, the 115 sharing link shown in the picture below has expired, but the sharing link can still be opened.

url_demo

But when adding and saving, the following error code will appear:

Failed init storage but storage is already created: failed init storage: failed to get share snap: json: cannot unmarshal number into Go struct field .data.shareinfo.share_state of type string

例如下图所示的115分享链接分享过期,但是分享链接还能打开

url_demo

但是在添加保存时候会出现如下错误码:

Failed init storage but storage is already created: failed init storage: failed to get share snap: json: cannot unmarshal number into Go struct field .data.shareinfo.share_state of type string

默认使用的下载方式

The default download method used

Contributors