成功搭建 onedrive-cf-index 的亿点经验

在通过一些神秘渠道获取到一枚同济校友邮箱后,我也顺带获得了一个由世纪互联运营的 拥有 1TB 储存空间的 Onedrive(还有 25TB 存储空间的 SharePoint)。于是我想着折腾点什么...

这次要搭建的 Onedrive 列表程序是

onedrive-cf-index

由 CloudFlare Workers 强力驱动的 OneDrive 索引

作者也有写 中文文档,但其中有一些错误和挺多细节描述没到位(也许是我笨)
经过一番折腾最终还是完成了部署,并记录下完整步骤。于是乎有了这一篇补充教程

内容主要 以作者的文档为基础,按照作者的步骤进行补充


搭建环境:
Oracle 测试机 1C8G
Debian 10 (4.19.0-16-amd64)

生成 OneDrive API 令牌

也就是创建可用的 API。因为我的这枚世纪互联的账号是没有创建 API 的权限的,所以需要一个有权使用 API 的账号创建一个应用来给它使用。

  1. 访问此 URL 创建新的 Blade app:Microsoft Azure.cn App registrations(OneDrive 世纪互联版本)

    • 访问 应用注册,使用微软账户登陆,选择 新注册
    • 填写应用的 名称,例如 my-onedrive-cf-index
    • 受支持的帐户类型 设置为 任何组织目录(任何 Azure AD 目录 - 多租户)中的帐户
    • 重定向 URI (可选) 设置为 Web(下拉选项框)、https://localhost(回调 URL 地址)
    • 点击 注册
      注册应用
      注册应用
  2. 打开 概述 面板获取你的 应用程序(客户端) ID
    获取应用程序(客户端)ID
    获取应用程序(客户端)ID
  3. 打开 证书和密码 面板,点击 新客户端密码,创建一个新的 客户端密码,并将 截止期限 设置为 从不。点击 添加 并复制该密码的 并保存下来 (关闭页面后就复制不了了!)
    Update:更新后最多已只能设置为 2年
    添加客户端密码
    添加客户端密码
  4. 打开 API 权限 面板,点击 Microsoft Graph,选择 委托的权限,并搜索 offline_accessFiles.ReadFiles.Read.All 并选择这三个权限,然后点击 添加权限

    添加API权限
    添加API权限

    你应该拥有的权限(最后一个是创建好就自带的)

    最终拥有的权限
    最终拥有的权限

  5. 获取 refresh_token,这一步需要 Node.js 和 npm 环境,不清楚或不知道的可以先看下准备工作的第 2 部分

    • 确认 Node.js 与 npm 正常

      node -v
      npm -v

      分别返回版本号即正常

    • npx @beetcb/ms-graph-cli,依次选择 Operated by 21Vianet in ChinaOneDrive,然后输入 客户端ID客户端密码回调 URL 地址 后就会获得一串链接
      注意:填写回调URL地址时不要直接回车默认,默认的是 http://localhost 而不是作者一开始要求填写的 https://localhost。如果这里填写错误会导致接受应用后拿不到需要的东西
    • 使用浏览器 (可以是自己电脑) 访问这个链接,并登陆世纪互联账号,接受用许可。完成后如下图,需要完整复制地址栏中的内容并填回 VPS 中
      接受用许可
      接受用许可
    • 不出意外会获得这样一大串的内容

      {
       client_id: '之前填入的客户端ID',
       client_secret: '之前填入的客户端密码',
       redirect_uri: 'https://localhost',
       auth_endpoint: 'https://login.partner.microsoftonline.cn/common/oauth2/v2.0',
       refresh_token: '我是refresh_token,复制我!', #只复制单引号内的部分,不要单引号
       access_token: '我是access_token',
       drive_api: 'https://microsoftgraph.chinacloudapi.cn/v1.0/me/drive',
       graph_api: 'https://microsoftgraph.chinacloudapi.cn/v1.0'
      }

      refresh_token 中的内容保存下来。

      这是正常的,复制地址栏中的内容即可
      这是正常的,复制地址栏中的内容即可

  6. 最后,在 OneDrive 中创建一个需要用到的文件夹,比如 /Public 即可。建议不要直接分享根目录!

最后,这么折腾完,我们应该成功拿到如下的几个凭证:

  • refresh_token
  • client_id (客户端ID)
  • client_secret (客户端密码)
  • redirect_uri (回调 URL 地址)
  • base 比如上面创建的 /Public

准备工作

  1. 拉取作者的仓库
    git clone https://github.com/spencerwooo/onedrive-cf-index.git
  2. 使用 nvm 安装 Node.js 和 npm。别问为什么,问就是试过后最方便的...

    # 安装nvm
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
    
    # 一瞬间后安装完毕,打开新的新的新的终端验证 nvm 安装情况
    command -v nvm
    成功安装会得到一个 nvm 的回复
    
    # 安装 Node.js 和 npm
    nvm install 'lts/*'

    安装完毕后从 获取 refresh_token 这一步过来的人可以回去继续 获取 refresh_token

  3. 获取 CloudFlare 的 API Token 前往获取

    • 创建一枚 API 令牌注意不是API密钥
    • API 令牌模板选择 编辑 Cloudflare Workers
    • 帐户资源 包括 所有账户
    • 区域资源 包括 所有区域

    然后一路下一步创建完毕后将令牌内容保存下来 (关闭页面后就复制不了了!)

  4. CloudFlare Workers 相关工作
    坑1:不加参数会提示 node: Permission denied
    坑2:nvm直接安装的 Stable 版(v15.13.0)安装报错,所以前面是安装的 LTS 版(v14.16.0)

    # 安装 CloudFlare Workers 官方编译部署工具
    npm i @cloudflare/wrangler -g --unsafe-perm=true --allow-root
    
    # 进入程序目录
    cd ./onedrive-cf-index
    
    # 使用 npm 安装依赖
    npm install
    
    # 通过 API Token 使用 wrangler 登录 CloudFlare 账户
    wrangler config
    # 输入前面取得的 API 令牌
    
    # 使用这一命令检查自己的登录状态
    wrangler whoami
  5. 获取需要的 CloudFlare 参数
    打开 CloudFlare 并登录,选择一个添加的域名,再向下滚动一点,在右侧栏处 API 保存下 区域 ID 以及 账户 ID
    同时,在首页右侧 Workers 中创建一个 Worker,然后直接 保存并部署。名称 (前缀) 可稍后在 Worker 列表中重命名
    回到 VPS 中,此时应该在 onedrive-cf-index 文件夹内
    修改 wrangler.toml

    • name:就是刚刚创建的 Worker 名称。例如这段中的 部分
      <name>.<worker_subdomain>.workers.dev
    • account_id:前面获取到的 CloudFlare 账户 ID
    • zone_id:前面获取到的 CloudFlare 区域 ID
  6. 创建叫做 BUCKET 的 Workers KV

    # 创建 KV bucket
    wrangler kv:namespace create "BUCKET"
    
    # ... 或者,创建包括预览功能的 KV bucket
    wrangler kv:namespace create "BUCKET" --preview

    修改 wrangler.toml 里面的 kv_namespaces 部分

    # 注意区分创建的是不是带预览功能的 KV bucket
    
    # 不带预览
    kv_namespaces = [
        { binding = "BUCKET", id = "修改为上一步创建后获取的ID" }
    ]
    
    # 带预览
    kv_namespaces = [
        { binding = "BUCKET", id = "修改为上一步创建后获取的ID", preview_id = "修改为上一步创建后获取的preview_id" }
    ]
  7. 修改 src/config/default.js

    • client_id:前面获取的 OneDrive 客户端ID
    • base:前面创建的 base 目录 (比如/Public)
    • redirect_uri:https://localhost

    部署的是由世纪互联运营的中国版 OneDrive,所以还需要以下步骤
    修改 type 下的 accountType 为 1
    保持 driveType 不变,即 0

  8. 使用 wrangler 添加 Cloudflare Workers 环境变量

    # 在这里粘贴 refresh_token
    wrangler secret put REFRESH_TOKEN
    
    # 在这里粘贴 client_secret
    wrangler secret put CLIENT_SECRET
    
    # 在这里输入自己想设置的认证密码
    wrangler secret put AUTH_PASSWORD

至此,所有准备工作已经就绪,只欠东风!

编译与部署

如果之前创建的是带预览功能的 KV bucket,可以使用 wrangler 预览部署
wrangler preview
如果一切顺利,即可使用如下命令发布 Cloudflare Worker
wrangler publish

没有报错的话,打开你的 Worker 地址看看成果吧


使用自定义域名访问Worker

进入想要自定义的域名后,点击功能栏中的 Workers 按钮,然后点击 添加路由

添加路由示意图
添加路由示意图

路由 一栏中添加你想要自定义的具体域名,选择本应用所在的 Worker,随后保存即可

添加具体域名
添加具体域名

例如 od.abc.xyz/*,或需要根域名访问的话 abc.xyz/*

再次点击功能栏中的 DNS 按钮,然后点击 添加记录

添加DNS解析
添加DNS解析

  • 类型:CNAME
  • 名称:自定义前缀,根域名填 @
  • 目标:Woker 的原地址
  • TTL:自动
  • 代理状态:已代理(必须开启代理)

完成后保存即可通过自定义域名访问 Worker 了

最后的话

这篇教程只是写了最基础的搭建过程,它的目的是确保你能成功搭建并使用最基础的功能。

更多功能与自定义可以参考 作者的原文档