PyOne:OneDrive 本地文件客户端详细定制部署教程(支持世纪互联版)

小助手读文章 00:00 / 00:00

OneDrive 是微软出品的网络云存储产品,以其稳定且上传下载基本不限速著称,因其大容量(5T+)和国内直连,成为众多图床、资源站等实力担当。曾介绍过另一款客户端(参见《部署 OneDrive for business (PHP)客户端程序 OneIndex 详细教程》),但不知为何经常发生页面空白的情况需要重新绑定才行,所以发现了这一款既支持国内世纪互联运营的 OneDrive 也支持微软官方运营的 OneDrive 的客户端 PyOne。

PyOne 介绍

PyOne 是一款基于 Python-Flask 的 OneDrive 文件本地化浏览系统,使用 MongoDB 储存文件列表,使用 redis 缓存数据,支持绑定多个网盘,极大的提高使用效率。

功能

  • 防盗链
  • 后台上传文件
  • 后台更新文件
  • 后台设置统计代码
  • 后台管理 OneDrive 文件
  • 删除 OneDrive 文件
  • 直接在后台给文件夹添加 .password 、 README 和 HEAD
  • 直接在后台编辑文本文件
  • 上传本地文件至 OneDrive
  • 支持创建文件夹
  • 支持移动文件(仅限单文件)
  • 支持绑定多网盘
  • 支持搜索文件
  • 支持离线下载
  • 不断更新中......

安装 PyOne


项目地址:GitHub
使用文档:GitBook
账号支持:支持国际 OneDrive 商业版、教育版、个人版和国内商业版
环境要求:Python2.7、Redis(5.0.3)、Mongodb(4.0.5)、Nginx

官方给的教程是基于宝塔的,但是我只是安装 PyOne,并没有宝塔的需求,甚至用不上 PHP,所以接下来我们一起来看看如何独立安装 PyOne。

以下操作基于华为云 199 元/年高配主机,Ubuntu 18.04 系统。

依赖

[root@pyone ~]# apt update
[root@pyone ~]# apt --no-install-recommends install -y gcc-multilib make zip unzip lrzsz mlocate python3-pip git vim python2.7 screen net-tools lsb-release debian-keyring debian-archive-keyring build-essential gcc g++ make autoconf automake wget cron openssl libssl-dev zlib1g zlib1g-dev libgeoip-dev

安装 Nginx

参考:《利用 Nginx 反向代理和缓存功能自建及优化 CDN 加速节点详细教程》- 编译安装

安装 Mongodb

[root@pyone ~]# apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 68818C72E52529D4
Executing: /tmp/apt-key-gpghome.0Vud1HPJde/gpg.1.sh --keyserver hkp://keyserver.ubuntu.com:80 --recv 68818C72E52529D4
gpg: key 68818C72E52529D4: public key "MongoDB 4.0 Release Signing Key <[email protected]>" imported
gpg: Total number processed: 1
gpg:               imported: 1
[root@pyone ~]# echo "deb http://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
deb http://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse
[root@pyone ~]# apt update
Ign:1 http://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 InRelease
......
[root@pyone ~]# apt install mongodb-org
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  mongodb-org-mongos mongodb-org-server mongodb-org-shell mongodb-org-tools
The following NEW packages will be installed:
  mongodb-org mongodb-org-mongos mongodb-org-server mongodb-org-shell mongodb-org-tools
0 upgraded, 5 newly installed, 0 to remove and 92 not upgraded.
......
Adding group `mongodb' (GID 116) ...
Done.
Adding user `mongodb' to group `mongodb' ...
Adding user mongodb to group mongodb
Done.
Setting up mongodb-org (4.0.10) ...
[root@pyone ~]# systemctl enable mongod && systemctl start mongod
Created symlink /etc/systemd/system/multi-user.target.wants/mongod.service → /lib/systemd/system/mongod.service.
[root@pyone ~]# ps -ef|grep mongod|grep -v grep
mongodb  128270      1  0 06:04 ?        00:00:01 /usr/bin/mongod --config /etc/mongod.conf

安装 Redis

[root@pyone ~]# apt install redis-server
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libjemalloc1 redis-tools
Suggested packages:
  ruby-redis
The following NEW packages will be installed:
  libjemalloc1 redis-server redis-tools
0 upgraded, 3 newly installed, 0 to remove and 92 not upgraded.
......
Setting up redis-tools (5:4.0.9-1ubuntu0.1) ...
Setting up redis-server (5:4.0.9-1ubuntu0.1) ...
Created symlink /etc/systemd/system/redis.service → /lib/systemd/system/redis-server.service.
Created symlink /etc/systemd/system/multi-user.target.wants/redis-server.service → /lib/systemd/system/redis-server.service.
Processing triggers for systemd (237-3ubuntu10.19) ...
Processing triggers for ureadahead (0.100.0-20) ...
[root@pyone ~]# ps -ef|grep redis|grep -v grep
redis    128666      1  0 06:04 ?        00:00:00 /usr/bin/redis-server 127.0.0.1:6379

安装 PyOne

安装

[root@pyone ~]# git clone https://github.com/abbeyokgo/PyOne.git && cd PyOne/
Cloning into 'PyOne'...
remote: Enumerating objects: 174, done.
remote: Counting objects: 100% (174/174), done.
remote: Compressing objects: 100% (95/95), done.
remote: Total 2660 (delta 98), reused 123 (delta 79), pack-reused 2486
Receiving objects: 100% (2660/2660), 914.34 KiB | 1.17 MiB/s, done.
Resolving deltas: 100% (1695/1695), done.
[root@PyOne ~]# pip install -r requirements.txt
Collecting flask (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/9a/74/670ae9737d14114753b8c8fdf2e8bd212a05d3b361ab15b44937dfd40985/Flask-1.0.3-py2.py3-none-any.whl (92kB)
......
Successfully installed Flask-And-Redis-1.0.0 Jinja2-2.10.1 MarkupSafe-1.1.1 SQLAlchemy-1.3.4 Werkzeug-0.15.4 click-7.0 dnspython-1.16.0 eventlet-0.25.0 flask-1.0.3 flask-caching-1.7.2 flask-limiter-1.0.1 flask-script-2.0.6 flask-sqlalchemy-2.4.0 greenlet-0.4.15 gunicorn-19.9.0 humanize-0.5.1 itsdangerous-1.1.0 limits-1.3 markdown-3.1.1 meld3-1.0.2 monotonic-1.5 pymongo-3.8.0 python-dateutil-2.8.0 redis-3.2.1 shelljob-0.5.6 supervisor-4.0.3  
[root@PyOne ~]# cp self_config.py.sample self_config.py && cp supervisord.conf.sample supervisord.conf
[root@PyOne ~]# cd ..
[root@pyone ~]# mv PyOne/ /usr/local/nginx/html/pyone/
[root@pyone ~]# cd /usr/local/nginx/html/pyone/
[root@pyone ~]# vim self_config.py
......
config_dir="/root/PyOne"  #将此目录设为 PyOne 目录,比如 /usr/local/nginx/html/pyone
.......
[root@pyone ~]# vim supervisord.conf
......
directory = /root/PyOne  # 将此目录设为 PyOne 目录,比如 /usr/local/nginx/html/pyone
......

运行

开放端口

PyOne 有两种工作方式,一种是直接运行,用户直接访问到 PyOne;另一种是在 PyOne 上套一层 Nginx,通过 Nginx 反代来运行,建议使用这种方法(参见后文)。

如果使用第一种方式,需开放 34567 端口(默认,可更改),执行命令:

[root@pyone ~]# ufw enable 34567/tcp
Rule added
Rule added (v6)
[root@pyone ~]# ufw reload
Firewall reloaded

如果使用第二种,需开放 80 端口(使用 SSL 还需开放 443 端口),执行命令:

[root@pyone ~]# ufw enable 80/tcp
Rule added
Rule added (v6)
[root@pyone ~]# ufw enable 443/tcp
Rule added
Rule added (v6)
[root@pyone ~]# ufw reload
Firewall reloaded
单次运行
[root@pyone ~]# gunicorn -k eventlet -b 0.0.0.0:34567 run:app
[2019-06-13 06:22:19 +0000] [130449] [INFO] Starting gunicorn 19.9.0
[2019-06-13 06:22:19 +0000] [130449] [INFO] Listening at: http://0.0.0.0:34567 (130449)
[2019-06-13 06:22:19 +0000] [130449] [INFO] Using worker: eventlet
[2019-06-13 06:22:19 +0000] [130459] [INFO] Booting worker with pid: 130459

可以看到 PyOne 已经运行起来了,如果你需要配置 SSL 安全访问,则命令是:

[root@pyone ~]# gunicorn -k eventlet -b 0.0.0.0:34567 --certfile=/usr/local/nginx/conf/default.crt --keyfile=/usr/local/nginx/conf/default.key run:app
如果开启 SSL 后台运行时记得将 supervisord.conf 里的 command 相应修改一下。
后台运行

建议 PyOne 都配置好后再后台运行,不然重启服务麻烦。

[root@pyone ~]# echo "supervisord -c /root/PyOne/supervisord.conf" >> /etc/rc.d/rc.local
[root@pyone ~]# chmod +x /etc/rc.d/rc.local
[root@pyone ~]# supervisord -c /usr/local/nginx/html/pyone/supervisord.conf

浏览器访问 http://服务器IP:34567 应该就可以看到界面了:

安装成功.png

安装 Aria2

Aria2 主要是用作离线下载的,可选安装,如果主机在国外,注意 DMCA。

参考官方 WIKI,手工安装后续有时间再来搞。

绑定账号

浏览器访问 http://服务器IP:34567,正常首次访问会自动跳转到绑定页面,没有跳转的话通过后台(http://服务器IP:34567/admin/login)绑定,默认登录密码是 PyOne

登录.png

左侧菜单找到网盘管理,然后选定盘位或添加盘位,根据自己需求设置一下名称,然后点击绑定

添加网盘.png

根据自己账号类型选择对应版本,然后点下一步

选择类型.png

点击获取应用ID和机密

获取应用 ID 和机密.png

自动新窗口打开微软登录界面,输入账号和密码登录

登录账号.png

输入密码.png

自动创建应用并显示应用机密,务必保存机密后再返回到快速启动(只显示一次,没保存只能再创建一次):

保存机密.png

如果没有自动创建应用,出现了如下页面:

添加应用.png

那么可以按页面提示手动添加应用,或者切回到上一步页面,重新点击获取应用ID和机密即可。

点击返回到快速启动,自动跳转到应用 ID ,记录下来:

保存应用 ID.png

回到系统安装页面,输入刚保存的应用机密和应用 ID,然后下一步

输入信息.png

点击绑定账号

绑定账号.png

自动新窗口打开微软认证页面,点击接受授权认证:

添加许可.png

自动跳转认证 code,复制下来:

验证码.png

返回到绑定账号页面,输入刚复制的认证 code,然后点击结束绑定

结束绑定.png

如无意外,到这里都可以授权成功,如果授权失败,从获取应用ID和机密开始重新进行即可,多次都失败的话,考虑选择国外的主机,比如 VultrCloudCone,都是性价比比较高的。使用之前先进入后台更新列表

进入更新.png

注意首次添加都要全量更新

全量更新.png

由于前端没有更新进度,此时可以在后端查看日志确认更新进度:

[2019-06-13 08:11:22 +0000] [10782] [INFO] Starting gunicorn 19.9.0
[2019-06-13 08:11:22 +0000] [10782] [INFO] Listening at: https://0.0.0.0:34567 (10782)
[2019-06-13 08:11:22 +0000] [10782] [INFO] Using worker: eventlet
[2019-06-13 08:11:22 +0000] [10787] [INFO] Booting worker with pid: 10787
2019-06-13 08:52:28,943 - INFO: set client_id:
2019-06-13 08:52:28,945 - INFO: set client_secret:
2019-06-13 08:52:28,946 - INFO: set od_type:nocn
2019-06-13 08:59:10,295 - INFO: [* UpdateFile] user:None, method:all
2019-06-13 08:59:10,301 - INFO: [* UpdateFile] delete local data;check file num:0
2019-06-13 08:59:10,303 - INFO: update A's / file
2019-06-13 08:59:10,304 - INFO: [start] getting files from url https://graph.microsoft.com/v1.0/me/drive/root/children?expand=thumbnails
2019-06-13 08:59:13,363 - INFO: [success] getting files from url https://graph.microsoft.com/v1.0/me/drive/root/children?expand=thumbnails
2019-06-13 08:59:13,364 - INFO: all users update status is complete
2019-06-13 08:59:13,364 - INFO: update file success!
Killed

出现 update file success 说明更新完成,可以进行其他设置或直接使用了,首页也展示了网盘文件:

添加成功.png

最后,在 PyOne 根目录添加 .install 表示安装完成:

[root@pyone ~]# touch .install

到此,PyOne 已安装成功并可以使用,如果感觉看不太懂也没关系,在每一步重要操作,PyOne 基本都提供了动图演示,可以说很人性化了。

高级应用

绑定多账号

PyOne 支持绑定多个 OneDrive 账号,并且支持分流(如果 OneDrive 有同步的话),绑定方法也很简单,参考上面绑定账号的步骤,再操作一次即可。

绑定域名

前面提到了 PyOne 有两种工作方式,刚才绑定账号是直接运行了,但这种方式对于前端用户来说,实际上是不太友好的,所以我们可以通过 Nginx 反代来运行。

Nginx 是一款很不错的代理软件,可以先看看文章《利用 Nginx 反向代理和缓存功能自建及优化 CDN 加速节点详细教程》认识一下。

参考以下配置:

server
    {
        listen 80;
        listen 443 ssl http2;
        server_name dl.vircloud.net;
        ssl_certificate          key/dl.vircloud.net/key.csr;
        ssl_certificate_key  key/dl.vircloud.net/key.key;

        error_page 497  https://$host$uri;

        location  / {
            proxy_pass https://服务器 IP:34567;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_hide_header X-Powered-By;
            proxy_buffering off;
            proxy_cache off;
        }

        access_log  /www/wwwlogs/dl.vircloud.net.log;
        error_log  /www/wwwlogs/dl.vircloud.net.error.log;
    }

展示指定目录

这个功能其实早先版本是自带的,后来不知道为什么取消了,需求主要是只想开放部分目录,而不是默认的根目录所有文件,对于有重要文件的人来说这个功能很实用,由于 PyOne 已经取消了,我们就通过 Nginx 来实现,参考以下代码:

假设,绑定的是 A 盘位,只想显示 share 子目录及其文件:

server
    {
        listen 80;
        listen 443 ssl http2;
        server_name dl.vircloud.net;
        ssl_certificate          key/dl.vircloud.net/key.csr;
        ssl_certificate_key  key/dl.vircloud.net/key.key;

        error_page 497  https://$host$uri;

        location /static {
            proxy_pass https://服务器 IP:34567;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_hide_header X-Powered-By;
            expires max;
        }

        location ^~ /A:/share {
            rewrite ^/A:/share/(.*)$ /$1 redirect;
        }

        location ^~ /py_find {
            proxy_pass https://服务器 IP:34567;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_hide_header X-Powered-By;
            subs_filter '/A:/share/' '/' gi;
            subs_filter '/A:/share' '/' gi;
            subs_filter '/A:' '/' gi;
            subs_filter '/A%3A/share/' '/' gi;
        }

        location = / {
            proxy_pass https://服务器 IP/A:/share;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_hide_header X-Powered-By;
            subs_filter '/A:/share/' '/' gi;
            subs_filter '/A:/share' '/' gi;
            subs_filter '/A:' '/' gi;
            subs_filter '/A%3A/share/' '/' gi;
        }

        location ^~ / {
            rewrite ^/(.*)$ /A:/share/$1 break;

            proxy_pass https://服务器 IP:34567;
            proxy_redirect off;

            subs_filter '/A:/share/' '/' gi;
            subs_filter '/A:/share' '/' gi;
            subs_filter '/A:' '/' gi;
            subs_filter '/A%3A/share/' '/' gi;
            subs_filter 'http://dl.vircloud.net' 'https://dl.vircloud.net' gi;

            proxy_pass https://服务器 IP:34567;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_hide_header X-Powered-By;
            proxy_buffering off;
            proxy_cache off;
        }

        access_log  /www/wwwlogs/dl.vircloud.net.log;
        error_log  /www/wwwlogs/dl.vircloud.net.error.log;
}

其他功能

文件上传、网盘克隆、自定义 CSS 等功能都可以在管理后台找到,都有详细的使用说明或者提示,甚至如果想要修改主题,可以直接修改安装目录 /app/templates/theme/material/(默认主题)下的文件,很贴心了。

问题点处理

若访问文件提示:

......
error:CompactToken parsing failed with error code: 80049217
......

或更新文件列表时提示:

2019-08-10 07:45:09,603 - INFO: [start] getting files from url https://graph.microsoft.com/v1.0/me/drive/root:/share:/children?expand=thumbnails
2019-08-10 07:45:09,849 - INFO: error:CompactToken parsing failed with error code: 80049217! waiting 180s

这是因为微软更新了认证链接,此时我们重新绑定网盘即可,会自动使用最新的认证。


参考文章:

1、强烈推荐:《PyOne 官方 WIKI
2、《PyOne:一款支持绑定多网盘的OneDrive文件本地化浏览系统


ArmxMod for Typecho
个性化、自适应、功能强大的响应式主题

推广

 继续浏览关于 部署教程网盘onedrive客户端pyoneonedrive 客户端 的文章

 本文最后更新于 2019/08/12 10:41:07,可能因经年累月而与现状有所差异

 引用转载请注明: VirCloud's Blog > 媒体 > PyOne:OneDrive 本地文件客户端详细定制部署教程(支持世纪互联版)

精选评论

  1. chancat
    chancat 回复

    Windows 10Chrome 80.0.3987.149来自 江苏 的大神

    你好博主,你这个博客上的跳转连接检测安全的那个功能怎样实现的啊?

    1. 欧文斯

      ArmxMod for Typecho 集成功能,使用谷歌安全浏览服务接口