吃自己的狗粮,用Dropbox Go SDK

获取appKey和设置回调地址

到这个页面https://www.dropbox.com/developers/apps 创建一个应用,应用的类型选择Dropbox API app,在这个页面还可以选择应用能访问的数据范围。

很重要的一点就是:应该只赋予应用最小权限,也就是只访问它自己创建的文件。

应用创建好后就可以在详细页面查看它的的App key,也就是下面要用的。

在应用的详细页面,还要设置授权后的回调地址,也就是“ OAuth redirect URIs ”的输入框,这个地址必须是合法的URL,哪怕是不存在的,也就是,可以设置成“https://127.0.0.1/oauth2/authorized”。

获取授权码

将上面得到的appKey和回调地址拼接成下面这样:
https://www.dropbox.com/1/oauth2/authorize?response_type=token&client_id=abc1234569XYZ&redirect_uri=https://127.0.0.1/oauth2/authorized

里面的client_id的值填appKey,redirect_uri填回调地址,把这个地址拷贝到浏览器打开,如果你还没有登录Dropbox,会提醒你登录,登录后大概是这样的界面:
vpsBak4coderbee

点击“允许”授权成功后,浏览器会调整,地址栏里的地址会变,拷出来大概是这样的:
https://127.0.0.1/oauth2/authorized#access_token=O_xxkdkdkdw2yeidikcppdfdoiffjj&token_type=bearer&uid=158130000

上面的access_token: O_xxkdkdkdw2yeidikcppdfdoiffjj就是代码要用的。

调用Go SDK

首先要把sdk clone回来: git clone https://github.com/wen866595/godropbox.git , 这条命令会把sdk拷贝到当前的godropbox目录下。


package main

import (
        "./dropbox"
        "fmt"
        "os"
        "flag"
)

var (
        tokens = map[string]string{
                "access_token": "you oauth2 access token",
                "token_type":   "bearer",
        }
)

func main() {
        flag.Parse()

        args := flag.Args()
        if len(args) < 2 {
                fmt.Printf("Usage: godropbox path/to/locale/file  /path/at/dropbox\n")
                return
        }

        oauth2 := &dropbox.OAuth2{AccessToken: tokens["access_token"], TokenType: tokens["token_type"]}

        dropboxApi := &dropbox.DropboxApi{Signer: oauth2, Root: "sandbox", Locale: "CN"}

        localePath, remotePath := flag.Arg(0), flag.Arg(1)
        _, err := dropboxApi.UploadByChunked(localePath, remotePath, 10485760, 8)   //  10485760表示一次上传的块大小为1M,对于大文件,这个值设得大点可以减少上传的次数。
        if err != nil {
                fmt.Printf("error msg: %s\n", err)
                os.Exit(1)
        } else {
                os.Exit(0)
        }
}

把上面的代码保存在main.go文件里面,放到godropbox目录下,到godropbox目录用 go build命令构建成一个可执行文件。在我的VPS上使用: ./godropbox path/to/locale/file /path/at/dropbox,效果还行。

以前用Java SDK写过一个上传的功能,文件上传完了还要很久才退出。


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

Dropbox Go SDK

把最近用Go写的 Dropbox SDK 发布到了 gihub上,有兴趣的可以参与、反馈。

地址: https://github.com/wen866595/godropbox

大多数接口都已实现,除了获取delta数据的,因为这个接口返回的JSON结构数据没法映射到Go的数据结构上。

一些示例:

 oauth2 := &oauth2.OAuth2{AccessToken: "you ouath2 access_token"}

 dropboxApi := &dropbox.DropboxApi{Signer: oauth2, Root: "dropbox", Locale: "CN"}

 accountInfo, err := dropboxApi.GetAccountInfo()
 if err != nil {
     fmt.Printf("error msg: %s\n", err)
 } else {
     fmt.Printf("account info: %v\n", accountInfo)
 }

 metadata, err := dropboxApi.GetFileMetadata("/")
 if err != nil {
     fmt.Printf("error msg: %s\n", err)
 } else {
     fmt.Printf("metadata: %v\n", metadata)
 }

 put, err := dropboxApi.PutFileByName("main.go", "dropbox", "/main.go")
 if err != nil {
     fmt.Printf("error msg: %s\n", err)
 } else {
     fmt.Printf("put: %v\n", put)
 }

 copyRef, err := dropboxApi.CopyRef("/main.go")
 if err != nil {
     fmt.Printf("error msg: %s\n", err)
 } else {
     fmt.Printf("copyRef : %v\n", copyRef)
 }

 revisions, err := dropboxApi.Revisions("/main.go")
 if err != nil {
     fmt.Printf("error msg: %s\n", err)
 } else {
     fmt.Printf("revisions : %v\n", revisions)
 }

 shares, err := dropboxApi.Shares("/main.go")
 if err != nil {
     fmt.Printf("error msg: %s\n", err)
 } else {
     fmt.Printf("shares : %v\n", shares)
 }

  media, err := dropboxApi.Media("/main.go")
  if err != nil {
      fmt.Printf("error msg: %s\n", err)
  } else {
      fmt.Printf("media : %v\n", media)
  }

  thumbnails, err := dropboxApi.Thumbnails("/IMG_20130613_121901.jpg")
  if err != nil {
      fmt.Printf("get thumbnails error msg: %s\n", err)
  } else {
      ioerr := ioutil.WriteFile("IMG_20130613_121901.jpg", thumbnails.DataByte, 666)
      if ioerr == nil {
          fmt.Printf("write image ok .\n")
      } else {
          fmt.Printf("write image error : %v\n", ioerr)
      }
  }

  copym, err := dropboxApi.Copy("/testcopy.txt", "/abctest/testcopy.txt")
  if err != nil {
      fmt.Printf("error msg: %s\n", err)
  } else {
      fmt.Printf("copym : %v\n", copym)
  }

  copym, err := dropboxApi.Copy("/testcopy.txt", "/abctest/testcopy.txt")
  if err != nil {
      fmt.Printf("error msg: %s\n", err)
  } else {
      fmt.Printf("copym : %v\n", copym)
  }

  move, err := dropboxApi.Move("/abctest/testcopy.txt", "/testcopy-moved.txt")
  if err != nil {
      fmt.Printf("error msg: %s\n", err)
  } else {
      fmt.Printf("move : %v\n", move)
  }

  createFolder, err := dropboxApi.CreateFolder("createFolder")
  if err != nil {
      fmt.Printf("error msg: %s\n", err)
  } else {
      fmt.Printf("createFolder: %v\n", createFolder)
  }

  deleted, err := dropboxApi.Delete("createFolder")
  if err != nil {
      fmt.Printf("error msg: %s\n", err)
  } else {
      fmt.Printf("deleted: %v\n", deleted)
  }

欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。