Skip to content

中文说明

Dict Xiong edited this page Apr 3, 2019 · 9 revisions

onedrivecmd

OneDrive 的命令行客户端.

基于 onedrive-sdk-python, 也进行了大量魔改.

参考 megacmd 扒下来的, 但是语言变成Python了.

为什么要写这东西?

OneDrive 是 Microsoft 的云存储服务. 教育用户可以在 https://products.office.com/en-us/student?tab=students 取得 1TB 的空间. 最多 5TB.

OneDrive 的 API 进行了修改, 现有的各种第三方客户端不日将失效. 而且大部分支持 OneDrive 的软件都是同步软件: 但是作为仓鼠, 要是我本地有那么大的硬盘, 何必还去用什么云服务呢...故撸一个客户端.

功能

  • 根据路径取文件
  • 配置文件 (~/.onedrive.json)
  • 可对单个文件或者目录下载, 并会在失败时重试
  • 可对单个文件或者目录上传, 并会在失败时重试 (实验性功能)
  • 可列远程目录,包括文件大小和时间戳
  • 上传与下载有进度条,也可用 aria2 进行下载
  • 离线下载 (此功能仅通过 API 提供,Web 和官方客户端都是没有的)
  • 取直链!
  • Python 2 和 3 通用 (应该是吧,我是专门按照这样来写的)

使用方法

    Usage onedrivecmd:
    onedrivecmd -h 
    onedrivecmd [OPTIONS] init 个人版登陆
    onedrivecmd [OPTIONS] init_business 企业/Office 365/Education登陆
    onedrivecmd [OPTIONS] list od:/foo/bar/ 列目录
    onedrivecmd [OPTIONS] share od:/foo/doc.txt 共享
    onedrivecmd [OPTIONS] direct od:/foo/image.jpg 取直链! 这个直链不过期
    onedrivecmd [OPTIONS] get od:/foo/file.txt /tmp/ 下载文件
    onedrivecmd [OPTIONS] get od:/boo/dir/ ./localdir/ 下载目录
    onedrivecmd [OPTIONS] put /tmp/hello.txt od:/bar/ 上传文件
    onedrivecmd [OPTIONS] put /tmp/dir/ od:/bar/ 上传目录
    onedrivecmd [OPTIONS] delete od:/foo/bar 删除
    onedrivecmd [OPTIONS] mkdir od:/foo/bar/ 建目录
    onedrivecmd [OPTIONS] search foobar 搜索
    onedrivecmd [OPTIONS] remote http://thecatapi.com/api/images/get?format=src&type=gif 离线下载
    onedrivecmd [OPTIONS] quota 看容量


  -conf="~/.onedrive.json": 配置文件, 此文件和密码一样重要
  -h: 帮助
  -hack: 用 SDK 上传/aria2 下载
  -recursive=false: 递归列目录, 速度比想象中慢得多
  -chunk=62914560: 上传分片大小, 必须是 320K 的倍数, 不能超过 60MB
  -url=False: 只列出文件下载 URL, 这个 URL 失效很快

如何运行 onedrivecmd?

最简单的:pip install onedrivecmd .

安装依赖

除非用源码安装,否则不需要管。

有3个依赖:

onedrivesdk
progress
requests

pip install -r requirements.txt 就全装上了.

登陆

onedrivecmd init . Office 365 用 onedrivecmd init_business .

提示的 URL 差不多是

https://login.live.com/oauth20_authorize.srf?scope=wl.signin+wl.offline_access+onedrive.readwrite&redirect_uri=https%3A%2F%2Fod.cnbeining.com&response_type=code&client_id=aeba6391-92fd-437d-a9d9-33a258b96c4e

登录.

如果不修改, 重定向会到 https://od.cnbeining.com/, 这个是我的域名. 后端是 gh-pages 这个 branch 前端是 Cloudflare. 显示验证码的操作是纯 JS 完成, 没有任何 logging, 我也不 care 你自己用这个: 不花我钱啊. 如果对安全性有疑虑, 请自行注册 application, 修改 static.py 的内容.

默认配置文件是 ~/.onedrive.json , 可以自己设置. 此文件和你的密码一样重要! 泄露会导致你的盘被随便查看!

第一次登陆后 access_token 每次程序启动都会刷新, 可能会稍慢.

例子

列目录内容:

$ onedrivecmd list od:/foo/bar/

有'/'结尾的是目录, 目录的大小是其内容的大小总和.

删除只能删到垃圾箱.

$ onedrivecmd delete od:/foo/bar/file

更多的例子

$ onedrivecmd  init

https://login.live.com/oauth20_authorize.srf?scope=wl.signin+wl.offline_access+onedrive.readwrite&redirect_uri=https%3A%2F%2Fod.cnbeining.com&response_type=code&client_id=aeba6391-92fd-437d-a9d9-33a258b96c4e

Paste this URL into your browser, approve the app's access.
Copy all the code in the new window, and paste it below:
Paste code here: Ma0d6f772-****-e5ea-8d5a-******    

$ onedrivecmd  init_business
ATTENTION: This is for Onedrive Business and Office 365 only.
If you are using normal Onedrive, lease exit and run

onedrivecmd init

https://login.microsoftonline.com/common/oauth2/authorize?redirect_uri=https%3A%2F%2Fod.cnbeining.com&response_type=code&client_id=6fdb55b4-c905-4612-bd23-306c3918217c

Paste this URL into your browser, approve the app's access.
Copy all the code in the new window, and paste it below:
Paste code here: (Very long!)

$ onedrivecmd list od:/
od:/133/    0   2016-09-24T04:17:58.957000Z
od:/134/    0   2016-09-24T05:11:17.190000Z
od:/New Folder/ 351 2016-09-22T03:02:25.423000Z
od:/1.png   342677  2016-09-24T04:28:51.617000Z
od:/OneDrive 入门.pdf 1159342 2016-08-23T03:03:55.043000Z

$ onedrivecmd put /tmp/demo/ od:/test/

[2019-03-19 11:57:07]
/tmp/demo/index.html ==> od:/test/demo/index.html
Uploading |################################| 100.0% - 0s

[2019-03-19 11:57:26]
/tmp/demo/Pic/1.png ==> od:/test/demo/Pic/1.png
Uploading |################################| 100.0% - 0s

[2019-03-19 11:57:44]
/tmp/demo/Pic/2.png ==> od:/test/demo/Pic/2.png
Uploading |################################| 100.0% - 0s

[2019-03-19 11:58:03]
/tmp/demo/Pic/test/365.ps1 ==> od:/test/demo/Pic/test/365.ps1
Uploading |################################| 100.0% - 0s

[2019-03-19 11:58:22]
/tmp/demo/Pic/3.jpg ==> od:/test/demo/Pic/3.jpg
Uploading |################################| 100.0% - 0s


$ onedrivecmd get od:/1.pdf
Downloading |######                          | 21.4% - 74s

# personal
$ onedrivecmd share od:/1.png
https://1drv.ms/u/s!AnpifX1Elagmb_7sFIiyr2ipY1k

$ onedrivecmd direct od:/1.png
https://onedrive.live.com/download?resid=26A895447D7D627A!111&authkey=!AP7sFIiyr2ipY1k

# Office 365
$ onedrivecmd share od:/onedrive.json
https://ad-my.sharepoint.com/personal/email/_layouts/15/guestaccess.aspx?docid=xxx&authkey=xxx

$ onedrivecmd direct od:/onedrive.json
https://ad-my.sharepoint.com/personal/email/_layouts/15/download.aspx?docid=md5&authkey=xxx

$ onedrivecmd -hack get od:/1.png
[#e257f9 16KiB/334KiB(4%) CN:1 DL:230KiB ETA:1s]                                                                                                                            
09/24 02:10:56 [NOTICE] Download complete: **onedrivecmd/1.png

Download Results:
gid   |stat|avg speed  |path/URI
======+====+===========+=======================================================
e257f9|OK  |   343KiB/s|**onedrivecmd/1.png

Status Legend:
(OK):download completed.

$ onedrivecmd search file.txt
01DERSD4MVUNK66BVQRFFZZEDK7FILJSYS  file.txt    1073741824  2017-08-30T05:55:24Z
01DERSD4JFGCT7P2VFFVEI3KXDPASSCX2H  files.txt   89  2017-08-30T05:46:38Z

$ onedrivecmd mkdir od:/145

$ onedrivecmd remote "http://wscont2.apps.microsoft.com/winstore/1x/.../Screenshot.225037.100000.jpg"
https://api.onedrive.com/v1.0/monitor/...

$ onedrivecmd quota

Total Size: 1.0TiB,
Used: 1.6MiB,
Remaining: 1024.0GiB,
Deleted: 0.0B,

Your state is: normal

TODO

  • 递归创建文件夹
  • 完善失败时的重试功能
  • 代码重构
  • 我自己不写同步了, 因为 rclone 支持 OneDrive. 欢迎发 pull requests 吧.
  • 我想不出来了, 开 issue 或 PR 吧

如何参与

发 PR, 开 issue, star, watch 和 fork 就行了.

授权

AGPL

Author

Beining, https://www.cnbeining.com/ , i [at] cnbeining.com .

Driven by coffee, coffee and coffee.

Collaborator/Dict Xiong, https://beardic.cn/, me [at] beardic.cn.