l9zp6 发表于 2023-8-20 19:13

有道云笔记永久直链解析

本帖最后由 l9zp6 于 2023-8-20 19:15 编辑



## 前言

有道云笔记的直链解析分析其实出来很长一段时间,搜索了一下,也有类似的桌面程序制作。

因为最近发现 ChatGPT 在生产力方面挺好用的,于是就用它辅助写了一个有道云笔记的直链解析接口和网页。

## 方法

1、在有道云笔记分享文件之后,得到分享链接。

http://note.youdao.com/noteshare?id=9862400b661006b5cf5a512e5ad80d6d

2、取出链接中 id 值 9862400b661006b5cf5a512e5ad80d6d。

3、根据 id 值拼接链接:

http://note.youdao.com/yws/public/note/9862400b661006b5cf5a512e5ad80d6d?editorType=0&cstk=cGtjFpHb

3.1、拼接逻辑为:

http://note.youdao.com/yws/public/note/ **{id值}**?editorType=0&cstk=cGtjFpHb

4、访问拼接后的链接,得到一串 json 字符串。

```
{"p":"/WEBf82fd575bd63c60f98ba999f1c1279ad","ct":1475838565,"su":null,"pr":0,"au":null,
"pv":1,"mt":1475838565,"sz":15581976,"domain":1,"tl":"shsn.mp4"}
```

5、获取 p 值,并去掉其中的/,拼接新的链接。

拼接逻辑为:

http://note.youdao.com/yws/api/personal/file/{第 4 步得到的 p 的值}?method=download&inline=true&shareKey={第 1 步分享链接中的 id 值}

6、得到最终的直链地址:

http://note.youdao.com/yws/api/personal/file/WEBf82fd575bd63c60f98ba999f1c1279ad?method=download&inline=true&shareKey=9862400b661006b5cf5a512e5ad80d6d

## 分析

知道直链获得的逻辑之后,就是如何通过代码实现上面的功能。

一开始我考虑的是通过浏览器来处理所有逻辑,这样可以减轻服务器的请求压力。

但几经尝试,跨域的问题都没法很好的解决,无奈还是加入了 PHP。

而且上面的直链获得逻辑是六年前大佬发表的(你没有听错时间,原文链接在最下方参考文章中),这期间,有道云笔记在上述第一步获得 id 值前,加入了短链接,也就是说要通过访问分享得到的短链接跳转到带有 id 值的链接。

这无疑又给我这个本来就是菜鸡,又很久没写代码的辣鸡增添了许多难度(主要也是懒,想一步到位,其实完全可以手动访问短链接,手动复制 id 值,但我觉得这样太麻烦)。

所以,虽然最终功能实现,但是因为通过了服务器去处理部分逻辑,所以在处理速度上终归是有些差强人意。

当然,归根结底,处理速度跟服务器有很大的关系。

## 实现

以下是**接口**代码的实现(考虑到方便,将所有代码都写在了一个文件):

```
<?php
// 验证请求是否合法,防止恶意请求
if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
    http_response_code(400);
    echo json_encode(['error' => 'Invalid request method']);
    exit;
}

// 获取传入的链接参数
if (!isset($_GET['url'])) {
    http_response_code(400);
    echo json_encode(['error' => 'Missing url parameter']);
    exit;
}

$url = $_GET['url'];

$json = isset($_GET['json']) && $_GET['json'] == 'ture';

// 获取跳转后的链接
function getRedirectUrl($url) {
    $curl = curl_init();
    curl_setopt_array($curl, [
      CURLOPT_URL => $url,
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_FOLLOWLOCATION => true,
      CURLOPT_NOBODY => true, // 只获取响应头,不获取响应体
      CURLOPT_HEADER => true, // 将响应头包含在输出中
      CURLOPT_CONNECTTIMEOUT => 5, // 设置连接超时时间为5秒
      CURLOPT_TIMEOUT => 10 // 设置请求超时时间为10秒
    ]);
    curl_exec($curl);
    $redirectUrl = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL);
    curl_close($curl);
    return $redirectUrl;
}

$redirectUrl = getRedirectUrl($url);

// 提取链接中的ID值
$queryString = parse_url($redirectUrl, PHP_URL_QUERY);
parse_str($queryString, $params);
$id = isset($params['id']) ? $params['id'] : '';

if (empty($id)) {
    http_response_code(400);
    echo json_encode(['error' => 'Invalid url parameter']);
    exit;
}

// 构建API请求链接
$apiUrl = "http://note.youdao.com/yws/public/note/{$id}?editorType=0&cstk=cGtjFpHb";

// 发送API请求
$curl = curl_init($apiUrl);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec($curl);
curl_close($curl);

if (!$res) {
    http_response_code(500);
    echo json_encode(['error' => 'Failed to fetch API response']);
    exit;
}

// 解析API响应
$resArr = json_decode($res, true);
if (!$resArr || !isset($resArr['p'])) {
    // 打印API响应内容进行调试
    var_dump($res);
    http_response_code(500);
    echo json_encode(['error' => 'Invalid API response']);
    exit;
}

// 提取p值
$p = trim($resArr['p'], '/');

// 构建下载链接
$downUrl = "http://note.youdao.com/yws/api/personal/file/{$p}?method=download&inline=true&shareKey={$id}";

// 返回下载链接
if ($json) {
    echo json_encode(['downloadUrl' => $downUrl]);
} else {
    echo $downUrl;
}
```

PS:以上代码(含注释)由 ChatGPT 辅助编写、优化等

## 部署

1、新建一个index.php文件

2、复制代码至文件

3、上传至服务器

4、访问文件的地址即可使用

## 演示

**调用地址**

`https://api.lkblog.net/youdao/?url=有道云笔记文件分享链接&json=true`

**Type参数详解**

url:有道云笔记**文件**分享地址(支持短链接)

json:非必须,是否返回 json 格式

**请求示例**

输出直链:https://api.lkblog.net/youdao/?url=http://note.youdao.com/noteshare?id=9862400b661006b5cf5a512e5ad80d6d

输出直链 JSON:https://api.lkblog.net/youdao/?url=http://note.youdao.com/noteshare?id=9862400b661006b5cf5a512e5ad80d6d&json=ture

Web演示:https://lab.lkblog.net/youdao-note/

## 说明

目前看这个直链还是比较稳定的,希望别打脸,而且具备国内直链该有的防盗链(苦笑),用来作为文件的下载链接还是不错的,当然你要是自己能想办法,也可以在线播放视频。

## 参考

[《 [原创技术贴]手动获取有道云笔记的文件直链 》](https://www.cnblogs.com/wuhairui/p/6596178.html)

[《手动获取有道云笔记的文件直链(PHP代码获取)》](https://blog.csdn.net/qq_14922059/article/details/96428548)

## 鸣谢

Chat For AI(提供 ChatGPT 服务)

## 声明

分析文章仅限用于学习和研究目的,不得将上述内容用于商业或者非法用途,否则一切后果自负。

l9zp6 发表于 2023-12-31 16:57

guan1021 发表于 2023-12-8 00:27
20231207应该是https证书到期了,导致无法使用,烦请更新,谢谢。感谢分享

已经更新,感谢使用

l9zp6 发表于 2023-8-23 22:23

wingking 发表于 2023-8-23 19:10
感谢分享.
我有点疑惑的地方,楼主看到,还望解答.
1. 获取直链是为了做什么呢?(我之前试过通过抓包的方式, ...

获取直链的用途很多,如果暂时用不到,说明平常可能不太需要,当然有可能没想到。
我举几个比较常见的例子:
文件分享。你有一个软件,想分享在公网,任何人看到都可以下载,但是你没有服务器,或者服务器带宽比较小,不能通过自己服务器提供下载链接。
如果上传到网盘,首先下载速度没法保证,一些大文件下载还需要使用网盘的客户端,甚至还有广告。
假设我有一个直链,那想下载的人,点一下链接就能下载,不用下载客户端,不限速,还没有广告等,是不是会很方便。
这里包括软件但不限于软件,图片、视频都可以通过直链来传播。
远程更新。你有一个项目,目前处于迭代状态,可能经常需要更新,但是这个项目本身不盈利,或者盈利仅够支出,我能不能在软件中内置一个接口,让它判断软件是否有新版本,如果有则提醒用户更新,然后用户通过我另外的直链进行更新,这样是不是会方便快捷很多,既不会因为使用对象存储产生额外的费用,也避免了使用自己服务器的带宽资源,以及因为自己服务器的带宽较小,而同一时间,多个用户请求更新而造成拥堵。
静态存储。这个最典型的就是图片直链,你有一个博客,公网可以访问,但是服务器带宽很小,而文章总有需要展示图片的时候,这时候如果有一个地方可以获取到图片的直链,我就可以直接引用到博客中,而变相使页面加载速度变快。
总之直链有很多地方可以用得到,关键看思路,以及需要,以上方法仅供学习研究交流,望周知。
另外,你能想到白嫖平台的直链,平台也会永方设法对你制造障碍,例如防盗链等,而防盗链也有相应的解决方法。
在这你来我往之中,技术也由此进步,得到提升。

代码主要就是构造这个直链,而这个直链的获得本身只需要通过操作字符串,代码是根据需求来的。
ChatGPT是个人工智能模型,现在发展比较强悍,在程序领域,一般的小功能它都可以自主完成。

jediking 发表于 2023-8-20 19:23

这个可以 ,正好用得上感谢

kkoo 发表于 2023-8-20 19:37

很有条理,能看得懂,感谢大佬分享

boxer 发表于 2023-8-20 19:42

非常好的帖子, 感谢分享!!!有空看看能不能简化下,不使用服务器{:1_918:}

cbkxh 发表于 2023-8-20 19:46

谢谢分享,看看

YOUBAIWEI 发表于 2023-8-20 19:54

大佬能弄https://****/***.mp4这样的直链嘛

allinall 发表于 2023-8-20 20:04

为啥不直接弄网盘?

wzt0524 发表于 2023-8-20 20:08

allinall 发表于 2023-8-20 20:10

YOUBAIWEI 发表于 2023-8-20 19:54
大佬能弄https://****/***.mp4这样的直链嘛
筷手能满足你:lol,隔壁有这类软件
https://bbs.binmt.cc/thread-88878-1-1.html

iigames 发表于 2023-8-20 20:13

谢谢分享!
页: [1] 2 3 4 5 6
查看完整版本: 有道云笔记永久直链解析