锤了一个 OneDrive 的双向同步客户端,大概花了 10 个回合 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
gzxu
V2EX    程序员

锤了一个 OneDrive 的双向同步客户端,大概花了 10 个回合

  gzxu 2018-06-02 21:11:47 +08:00 5857 次点击
这是一个创建于 2763 天前的主题,其中的信息可能已经有所发展或是发生改变。

前情提要: t/453864 感谢大家指点,尤其是 @geelaw 指出可以使用 Extended Attributes 这样的黑科技,大大减少了算法的复杂度

锤这个奇迹的目的主要还是跟原来说的一样,解决自己 Linux 上面访问 OneDrive 不方便的问题。程序是用人生苦短写的,所以安装也很简单 pip install --user onedrive-sync-client,安装完之后执行 onedrive --set-location ~/OneDrive 配置同步目录之后每次运行 onedrive 即可同步,同步是手动的,没有后台进程,算法的状态依前文所述是通过 xattr 存储的,外加一个默认在 $XDG_DATA_HOME/onedrive.sqlite 的数据库存储比如登录状态等等的其它必要信息

城市建在了 https://github.com/gzxu/onedrive-sync-client 这个地块,欢迎大家来和本城的所有者进行交谈~偷懒了没有写中文说明文件麻烦大家凑合着看吧

数据无价,虽然欢迎大家测试吐槽,但还是要建议大家不要用重要的网盘数据来测试

最后,祝自己生日快乐吧

17 条回复    2018-06-04 13:36:10 +08:00
safeoy
    1
safeoy  
   2018-06-02 22:04:09 +08:00
酷,已 star
coreos
    2
coreos  
   2018-06-02 22:09:56 +08:00
生日快乐
elvisyao
    3
elvisyao  
   2018-06-02 22:11:00 +08:00
生日快乐
UnknownR
    4
UnknownR  
   2018-06-02 22:14:06 +08:00
cool, 生日快乐,最近刚遇到 onedrive 的问题,organization 的账户无法登陆 mac 版 onedrive,网页版每次都要登陆而且同步时也很麻烦
0915240
    5
0915240  
   2018-06-02 23:30:48 +08:00 via iPhone
生日快乐
yaerda
    6
yaerda  
   2018-06-03 01:18:32 +08:00 via Android
快乐快乐哦
msg7086
    7
msg7086  
   2018-06-03 02:13:40 +08:00   4
生快。
我随便扫了一眼你的源码,sdk 里上传文件只写了简易上传,而不支持大文件(>10M )的上传。
大文件上传需要用 UploadSession。

https://github.com/msg7086/rb1drv/blob/master/lib/rb1drv/onedrive_dir.rb#L104
https://github.com/cnbeining/onedrivecmd/blob/master/onedrivecmd/utils/uploader.py#L69
https://github.com/OneDrive/onedrive-api-docs/blob/live/docs/rest-api/api/driveitem_createuploadsession.md

还有,商业版教育版的 OneDrive 用的是 QuickXorHash 而不是 SHA1,我看你代码里没有相应的处理逻辑。
https://rclone.org/onedrive/#modified-time-and-hashes
https://docs.microsoft.com/en-us/onedrive/developer/code-snippets/quickxorhash
DearTanker
    8
DearTanker  
   2018-06-03 02:23:58 +08:00
生日快乐
cnbeining
    9
cnbeining  
   2018-06-03 05:37:52 +08:00 via Android
@msg7086 这个坑跳过。。。
huyinjie
    10
huyinjie  
   2018-06-03 06:41:48 +08:00 via iPhone
生日快乐
zclHIT
    11
zclHIT  
   2018-06-03 11:36:49 +08:00 via iPhone
生日快乐
masir
    12
masir  
   2018-06-03 17:39:52 +08:00
生日快乐~你昨天 我今天~哈哈~
gzxu
    13
gzxu  
OP
   2018-06-03 21:15:36 +08:00
@UnknownR #4 啊哈,只可惜我现在既没有加 macOS 的支持也没有加 organization 的支持(里面登录那块代码我记得我设置的是用组织账户登录会失败),虽然说里面依赖 Linux 的地方只有 local.py 前头几行默认的配置文件路径和 xattr 扩展属性两个

@msg7086 #7 谢谢提醒,这块我偷懒没写,在 README 最后的 Future Works 里面写了说之后加上专门负责上传下载的模块,sdk.py 里面那块留了一个函数虽然现在里面只有几行代码完成最基础的功能。目前我的逻辑是用 SHA1 检测文件是否有修改,要是改成用修改时间判断的话估计可以加上 QuickXor 的支持,因为这玩意不知道碰撞风险多大,代码里面也是留了之后加这块功能的地方的 2333 毕竟这些都不是锤太空船的核心零部件

最后,谢谢大家啦~
msg7086
    14
msg7086  
   2018-06-04 02:08:05 +08:00
@gzxu OAuth API 2.0 配上 Graph API 是可以登录 Business 版的。
旧版 OAuth 1.0 配旧版 API 才需要分开登录。
gzxu
    15
gzxu  
OP
   2018-06-04 10:00:06 +08:00
@msg7086 #14 https://github.com/gzxu/onedrive-sync-client/blob/0.1.2/onedrive/sdk.py#L87 这里我故意写的是 `/consumers/` 而不是 `/common/` 为的就是组织用户登录会失败
msg7086
    16
msg7086  
   2018-06-04 13:02:42 +08:00
@gzxu →_→ 会玩。
gzxu
    17
gzxu  
OP
   2018-06-04 13:36:10 +08:00
@msg7086 #16 因为这个功能还没完成(没有摆脱对 SHA1 的依赖),这样可以把不可控的东西尽量限制在自己已知的范围里面[/乖巧]
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1207 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 30ms UTC 23:52 PVG 07:52 LAX 15:52 JFK 18:52
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86