eboer's Boat

Neboer's Blog isn't Only About Technique

阿里云盘的一种打开方式
下载阿里云盘 123

欢迎收看《每日白嫖指南》,这里是Neboer,我们一起来用资本的产品创造点自由的价值。

使用阿里云网盘作为下载中转

使用阿里云网盘作为下载中转,从而实现对本来直接连接下载龟速的国外内容的高速下载,这个思想确实非常简单。

流程大概长这个样子:控制远端服务器下载某个链接,这个链接就变成了远端服务器硬盘上的文件。然后我们使用阿里云盘的客户端把这个文件上传到自己的阿里云盘,然后再在本地以“不限速”的速度完成下载,整个过程一气呵成,没有任何问题。

下载远端链接可以使用强大的下载工具aria2,上传工具可以随便到github上找一个开源的阿里云盘上传脚本就可以(这里推荐一下https://github.com/wxy1343/aliyunpan ,截止到此篇文章发稿,这个脚本上传文件夹是最好用的)

阿里云盘的上传速度在不同地区的差异很大。之前Neboer曾经在日本东京测试过,速度很快,大约5M/s。但是现在不一定可以达到这个速度了。在Github Actions的workers里,平均上传到阿里云盘的速度大约1.5M/s,这个速度不算快,但对于普通大小的文件来说,这个速度已经很棒了。上传的整个过程完全由actions操作,不需要人为干预。等上传结束,你就可以去盘里拿传好的文件了,很不错!

问题出在哪?

没错,如果想要完成刚才那个操作,你需要一个国外的服务器。

一个能够让你运行aria2c和python的服务器不需要很强大,有个1核CPU、1G内存就够了。主要问题出在了硬盘上面。迄今为止我们依然没有办法完全脱离硬盘完成这个上传过程,虽然这个过程理论上也可以实现(将阿里云盘或者一个更大的硬盘挂载到服务器),但是实现起来比较麻烦,没有“现成的办法”。而且即便如此你也需要一个服务器。以vultr最低性能的high frequency实例的价格为例,一个月6美元,也是一笔不小的开销。

主要是这样一个下载服务器不是很划算,如果你没有下载任务,它可能大多数时间是闲置的,这些钱花的很浪费!因此我们自然而然地把目光投向了一些能够提供免费服务器使用机会的供应商,他们能够满足你白嫖的想法。

GitHub actions

没错没错,是时候从微软那里赚回来一点了(什么你没给微软付过钱?不可能的,如果你购买过任何一台搭载了Windows系统的笔记本电脑,你就一定付给了微软的一定的激活费用。这些钱包含在了你的电脑价格之中,万恶的资本主义!

GitHub actions的服务器性能强大,根据GitHub的文档,GitHub-hosted runners的配置是“2-core CPU/7 GB of RAM memory/14 GB of SSD disk space”。我知道你们在想什么:GitHub给的这14GB的SSD空间还不够我塞牙缝的!这也太少了,我下的种子要是比这个大怎么办?

其实GitHub的服务器的硬盘空间是很多的,只不过GitHub在Ubuntu server的硬盘中预先安装了一套Haskell环境、一套Android sdk、还有一套Windows .NET sdk,这些东西大概占据了30GB多的空间!而且事实上GitHub actions提供的空间要比14GB多的,大概有32GB空间是完全可以写入的(挂载到根),因此最后执行了彻底清理的GitHub actions server可以满足你下载任何小于60GB左右的文件(夹)的需求,这个空间足够了。

编写workflow

我提供一个workflow供大家参考。

name: downloader
on: push

jobs:
  build:
    name: setup_and_run
    runs-on: ubuntu-latest
    steps:
      - name: Maximize build space
        uses: easimon/maximize-build-space@master
        with:
          root-reserve-mb: 512
          swap-size-mb: 1024
          remove-dotnet: 'true'
          remove-android: 'true'
          remove-haskell: 'true'

      - name: install aria2/python
        run: sudo apt install -y aria2 python3

      - name: install aliyun cli
        run: sudo pip install aliyunpan

      - name: prepare aliyun drive
        env:
          REFRESH_TOKEN: ${{ secrets.REFRESH_TOKEN }}
        shell: bash
        run: |
          mkdir -p ~/.config && echo "refresh_token: '$REFRESH_TOKEN'"  >  ~/.config/aliyunpan.yaml

      - name: prepare working directory
        env:
          NEWFOLDERNAME: ${{ secrets.NEWFOLDERNAME }}
        run: mkdir ${{ secrets.NEWFOLDERNAME }}

      - name: download files
        env:
          TARGETURL: ${{ secrets.TARGETURL }}
        run:
          run: aria2c "$TARGETURL" --seed-time=0
        working-directory: ${{ secrets.NEWFOLDERNAME }}

      - name: upload to aliyun
        env:
          NEWFOLDERNAME: ${{ secrets.NEWFOLDERNAME }}
        run: aliyunpan upload "$NEWFOLDERNAME"

这个脚本的使用需要你创建一个空的仓库(推荐创建公共仓库,具体的理由参考下面的介绍),然后添加三个SECRETS:REFRESH_TOKEN、NEWFOLDERNAME和TARGETURL,之后创建文件.github/workflow/xxx.yaml,把上面的内容拷贝进去就可以了。 REFRESH_TOKEN是阿里云盘的通行证,有了它你就可以上传文件到你的云盘了。具体的获取方法可以参考我推荐的"aliyunpan-cli"项目的README。 NEWFOLDERNAME是你准备给你的下载文件夹起的名字。 TARGETURL是你要下载的目标“链接”。所有aria2c支持的链接都可以在此传入。

GitHub actions 的收费标准

放心,GitHub actions不会收取你的任何费用,也不需要你绑定什么付款方式,纯粹就是为了方便你使用而推出的一种功能。微软所做出的为数不多的“人事”之一。

GitHub workflow相对来说比较自由,而且还提供了root权限供你方便的使用,总体来讲使用体验极佳。但是它依然存在一系列问题:

  1. GitHub workflow 的单个job最大运行的时间不应该超过6小时,整个workflow总运行时间不应该超过72小时。因此如果你的下载持续时间超过了6小时,你可能需要考虑把下载过程拆成更多个job来运行。即便如此,你也不能持续下载72小时的文件。
  2. GitHub workflow 的免费计划的最大并行任务的限制是20个(Windows/Linux job),也就是说你可以同时启动20个不同的下载,这个限制相对宽裕,因此不是很大的问题。
  3. GitHub workflow 对于私有仓库有一个特别的收费标准,这个我们下面再说。正常的使用公共仓库不会产生费用,只需要注意一下上面的限制。

综上所述,GitHub actions 是一个理想的运行你下载任务方法。但是你在下载之前需要考虑一下下载的使用时间。

非常值得注意的一点是:GitHub actions有一个“对私有仓库使用GitHub actions收取额外的费用”的功能,免费用户的每月配额大概是2000分钟。虽然说这个配额看起来不是很少,但是这种下载的任务没必要用私有仓库进行。你只需要反复“re run”你的workflow就可以,整个仓库中没有任何关于你的敏感信息。GitHub的secrets都是加密存储的,不会有泄露的风险,所以开放仓库是安全的。

这是不是在滥用GitHub actions呢?

是的。

不是,等等,别走,你最起码看看GitHub actions的使用条款里是如何规定的:

(参考文档:https://docs.github.com/en/github/site-policy/github-terms-for-additional-products-and-features ) 我来翻译一下这个网页:你不应该用GitHub做这些事情:

  1. 挖矿。(理所当然,挖矿必然是绝对禁止的。实际上GitHub主机应该也没法挖矿,毕竟配置就那么些)
  2. 分发或(企图)获得未经许可的数据、账户、进入网络(除了那些被GitHub Bug Bounty计划授权的用户)。(这个主要是防止黑客行为,我们没有做任何黑客行为)
  3. 为商业目的提供独立或集成的应用程序或服务,以提供 Actions 产品或服务,或 Actions 产品或服务的任何元素;(只要你不把这种服务放到公网上并用它赚钱,这条约束不了你)
  4. 任何给我们的服务器带来负担的活动,该负担与为用户提供的收益不成比例(例如,不要将 Actions 用作内容交付网络或作为无服务器应用程序的一部分,但收益较低的 Action 可能是好吧,如果它也是低负担(笑))。(这一点说的比较模糊,不过从后面的话里也可以看出来GitHub对这种行为应该是持宽容态度的,再加上我们确实没有占用GitHub太多资源,因此这条很可能被我们bypass。)
  5. 如果使用 GitHub 托管的runners,则与使用 GitHub Actions 的存储库关联的软件项目的生产、测试​​、部署或发布无关的任何其他活动。(不用说了,我们的下载行为单一看就是和软件的生产测试没啥关系的,这种活动必然是对GitHub actions的滥用)

综上所述,这种行为是对GitHub actions的滥用,使用这种方式进行下载可能违反了GitHub的用户使用协议而造成封号等损失。

真的没有办法改变“滥用”的本质吗?

有办法。

人类的智慧是无穷的,我们可以很容易的让我们的操作符合GitHub对于actions提出的要求:我们正在开发一款“下载软件”,这个软件可以在服务器上运行,输入文件夹名和待下载的URL,就可以完成下载并上传到服务器上。我们在GitHub actions中的所作所为只是为了对这个软件进行一些基础的测试,看看它是否能够胜任这个工作。至于为什么不断地重新部署?我看看现在这个软件还能不能正常使用嘛!

所以你完全可以把这个行为堂而皇之的合法化,这种使用的方式完全符合GitHub的使用协议,我建议想试一试的朋友们都把它伪装成一个下载器来使用,不要直接用我提供的actions file,那个用法确实违反了使用协议,存在风险。

谢谢大家读到这里,你的支持就是我更新的动力。我只能希望如果有能力的话希望网上能多一些代理下载的工具,供大家免费或者低成本使用,促进开源软件或者自由知识的传播,让我们能够用这些珍贵的资料创造出更大的价值来,最后再次感谢大家,希望我能和你们在一个更加自由的世界里相遇。