V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gzxu
V2EX  ›  程序员

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

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

    前情提要: https://www.v2ex.com/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   ·   我们的愿景   ·   实用小工具   ·   3250 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 76ms · UTC 14:05 · PVG 22:05 · LAX 07:05 · JFK 10:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.