baiduyun

package module
v0.0.0-...-4feeb59 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 21, 2023 License: Apache-2.0 Imports: 13 Imported by: 0

README

baiduyun-go

sdk for Baidu Yunpan(sdk for 百度云盘)

Installation

go get github.com/chyroc/baiduyun-go

Usage

OAuth / 授权
func Example_client_AuthURL() {
	cli := baiduyun.New(baiduyun.WithAppCredential("id", "secret"))

	// 生成 OAuth 授权页面的 URL
	fmt.Println(cli.AuthURL("http://127.0.0.1:3000"))

	// 上一步生成的 code 换取 token
	res, err := cli.AuthAccessToken("afe6db28ed86582262b074df3f3f6cb2", "http://127.0.0.1:3000")
	if err != nil {
		fmt.Println("err", err)
	} else {
		fmt.Printf("token: %#v\n", res)
	}
}
Get File List / 获取文件列表
func Example_client_FileList() {
	cli := baiduyun.New(
		baiduyun.WithAppCredential("id", "secret"),
		baiduyun.WithToken("access-token", "refresh-token"),
	)

	files, err := cli.FileList(&baiduyun.FileListReq{
		Dir:       &[]string{"/"}[0],
		Order:     nil,
		Desc:      nil,
		Start:     nil,
		Limit:     nil,
		Web:       nil,
		Folder:    nil,
		ShowEmpty: nil,
	})
	if err != nil {
		fmt.Println("err", err)
	} else {
		for _, file := range files {
			fmt.Println(file.FsID, file.Path)
		}
	}
}
Get File Metadata / 获取文件元数据
func Example_client_FileMetadata() {
	cli := baiduyun.New(
		baiduyun.WithAppCredential("id", "secret"),
		baiduyun.WithToken("access-token", "refresh-token"),
	)

	files, err := cli.FileMetadata(&baiduyun.FileMetadataReq{
		FsIDs:     []int64{1, 2},
		DLink:     nil,
		Path:      nil,
		Thumb:     nil,
		Extra:     nil,
		NeedMedia: nil,
	})
	if err != nil {
		fmt.Println("err", err)
	} else {
		for _, file := range files {
			fmt.Println(file.FsID, file.Path)
		}
	}
}
Search File / 搜索文件
func Example_client_FileSearch() {
	cli := baiduyun.New(
		baiduyun.WithAppCredential("id", "secret"),
		baiduyun.WithToken("access-token", "refresh-token"),
	)

	hasMore, files, err := cli.FileSearch(&baiduyun.FileSearchReq{
		Key:       "文本",
		Dir:       nil,
		Page:      nil,
		Num:       nil,
		Recursion: nil,
		Web:       nil,
	})
	if err != nil {
		fmt.Println("err", err)
	} else {
		fmt.Println("hasMore", hasMore)
		for _, file := range files {
			fmt.Println(file.FsID, file.Path)
		}
	}
}
Download File / 下载文件
func Example_client_DownloadFileID() {
	cli := baiduyun.New(
		baiduyun.WithAppCredential("id", "secret"),
		baiduyun.WithDownloadTimeout(time.Minute*120),
		baiduyun.WithToken("access-token", "refresh-token"),
	)

	reader, err := cli.DownloadFileID(868217257594741)
	if err != nil {
		fmt.Println("err", err)
		return
	}
	bs, err := io.ReadAll(reader)
	if err != nil {
		fmt.Println("err", err)
		return
	}
	err = ioutil.WriteFile("./example.mp4", bs, 0644)
	if err != nil {
		fmt.Println("err", err)
		return
	}
}
Upload File / 上传文件
func Example_client_FileUpload() {
	cli := baiduyun.New(
		baiduyun.WithAppCredential("id", "secret"),
		baiduyun.WithToken("access-token", "refresh-token"),
	)

	f, err := os.Open("/filepath/1.txt")
	if err != nil {
		fmt.Println("err", err)
		return
	}
	defer f.Close()

	print(cli.FileUpload(&baiduyun.FileUploadReq{
		Name:  "/1.txt",
		File:  f,
		RType: nil,
	}))
}

Documentation

Overview

Example (Client_AuthURL)

OAuth 流程

cli := baiduyun.New(baiduyun.WithAppCredential("id", "secret"))

// 生成 OAuth 授权页面的 URL
fmt.Println(cli.AuthURL("http://127.0.0.1:3000"))

// 上一步生成的 code 换取 token
res, err := cli.AuthAccessToken("afe6db28ed86582262b074df3f3f6cb2", "http://127.0.0.1:3000")
if err != nil {
	fmt.Println("err", err)
} else {
	fmt.Printf("token: %#v\n", res)
}
Output:

Example (Client_DownloadFileID)

下载文件

cli := baiduyun.New(
	baiduyun.WithAppCredential("id", "secret"),
	baiduyun.WithDownloadTimeout(time.Minute*120),
	baiduyun.WithToken("access-token", "refresh-token"),
)

reader, err := cli.DownloadFileID(868217257594741)
if err != nil {
	fmt.Println("err", err)
	return
}
bs, err := io.ReadAll(reader)
if err != nil {
	fmt.Println("err", err)
	return
}
err = ioutil.WriteFile("./example.mp4", bs, 0644)
if err != nil {
	fmt.Println("err", err)
	return
}
Output:

Example (Client_FileList)

获取文件列表

cli := baiduyun.New(
	baiduyun.WithAppCredential("id", "secret"),
	baiduyun.WithToken("access-token", "refresh-token"),
)

files, err := cli.FileList(&baiduyun.FileListReq{
	Dir:       &[]string{"/"}[0],
	Order:     nil,
	Desc:      nil,
	Start:     nil,
	Limit:     nil,
	Web:       nil,
	Folder:    nil,
	ShowEmpty: nil,
})
if err != nil {
	fmt.Println("err", err)
} else {
	for _, file := range files {
		fmt.Println(file.FsID, file.Path)
	}
}
Output:

Example (Client_FileMetadata)

获取文件元数据

cli := baiduyun.New(
	baiduyun.WithAppCredential("id", "secret"),
	baiduyun.WithToken("access-token", "refresh-token"),
)

files, err := cli.FileMetadata(&baiduyun.FileMetadataReq{
	FsIDs:     []int64{1, 2},
	DLink:     nil,
	Path:      nil,
	Thumb:     nil,
	Extra:     nil,
	NeedMedia: nil,
})
if err != nil {
	fmt.Println("err", err)
} else {
	for _, file := range files {
		fmt.Println(file.FsID, file.Path)
	}
}
Output:

Example (Client_FileSearch)

搜索文件

cli := baiduyun.New(
	baiduyun.WithAppCredential("id", "secret"),
	baiduyun.WithToken("access-token", "refresh-token"),
)

hasMore, files, err := cli.FileSearch(&baiduyun.FileSearchReq{
	Key:       "文本",
	Dir:       nil,
	Page:      nil,
	Num:       nil,
	Recursion: nil,
	Web:       nil,
})
if err != nil {
	fmt.Println("err", err)
} else {
	fmt.Println("hasMore", hasMore)
	for _, file := range files {
		fmt.Println(file.FsID, file.Path)
	}
}
Output:

Example (Client_FileUpload)

上传文件

cli := baiduyun.New(
	baiduyun.WithAppCredential("id", "secret"),
	baiduyun.WithToken("access-token", "refresh-token"),
)

f, err := os.Open("/filepath/1.txt")
if err != nil {
	fmt.Println("err", err)
	return
}
defer f.Close()

print(cli.FileUpload(&baiduyun.FileUploadReq{
	Name:  "/1.txt",
	File:  f,
	RType: nil,
}))
Output:

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Client

type Client struct {
	// contains filtered or unexported fields
}

func New

func New(options ...Option) *Client

func (*Client) AuthAccessToken

func (r *Client) AuthAccessToken(code, redirectURI string) (*Token, error)

AuthAccessToken OAuth 流程使用 code 换取 token

doc: https://pan.baidu.com/union/doc/al0rwqzzl

func (*Client) AuthRefreshToken

func (r *Client) AuthRefreshToken(refreshToken string) (*Token, error)

func (*Client) AuthURL

func (r *Client) AuthURL(redirectURI string) string

AuthURL 生成 OAuth 授权页面的 URL

doc: https://pan.baidu.com/union/doc/al0rwqzzl

func (r *Client) DownloadDLink(dlink string) (io.ReadCloser, error)

func (*Client) DownloadFileID

func (r *Client) DownloadFileID(fileID int64) (io.ReadCloser, error)

func (*Client) FileDelete

func (r *Client) FileDelete(req *FileDeleteReq) (int64, error)

FileDelete 删除文件

doc: https://pan.baidu.com/union/doc/mksg0s9l4

func (*Client) FileList

func (r *Client) FileList(req *FileListReq) ([]*FileInfo, error)

FileList 获取文件列表

doc: https://pan.baidu.com/union/doc/nksg0sat9

func (*Client) FileMetadata

func (r *Client) FileMetadata(req *FileMetadataReq) ([]*FileMeta, error)

FileMetadata 查询文件信息

doc: https://pan.baidu.com/union/doc/Fksg0sbcm

func (*Client) FileRename

func (r *Client) FileRename(req *FileRenameReq) (int64, error)

FileRename 重命名文件

doc: https://pan.baidu.com/union/doc/mksg0s9l4

func (*Client) FileSearch

func (r *Client) FileSearch(req *FileSearchReq) (bool, []*FileInfo, error)

func (*Client) FileUpload

func (r *Client) FileUpload(req *FileUploadReq) error

func (*Client) FileUploadSessionAppend

func (r *Client) FileUploadSessionAppend(req *FileUploadSessionAppendReq) error

func (*Client) FileUploadSessionFinish

func (r *Client) FileUploadSessionFinish(req *FileUploadSessionFinishReq) error

func (*Client) FileUploadSessionStart

func (r *Client) FileUploadSessionStart(req *FileUploadSessionStartReq) (*FileUploadSessionStartResp, error)

func (*Client) SetLogger

func (r *Client) SetLogger(logger Logger)

type FileDeleteReq

type FileDeleteReq struct {
	Async    int64    // 0 同步,1 自适应,2 异步
	PathList []string // [{"path":"/test/123456.docx}"]
}

type FileInfo

type FileInfo struct {
	FsID           int64  `json:"fs_id"`                     // 文件在云端的唯一标识ID
	Path           string `json:"path,omitempty"`            // 文件的绝对路径
	ServerFilename string `json:"server_filename,omitempty"` // 文件名称
	Size           int64  `json:"size,omitempty"`            // 文件大小,单位B
	ServerMtime    int64  `json:"server_mtime"`              // 文件在服务器修改时间
	ServerCtime    int64  `json:"server_ctime,omitempty"`    // 文件在服务器创建时间
	LocalMtime     int64  `json:"local_mtime,omitempty"`     // 文件在客户端修改时间
	LocalCtime     int64  `json:"local_ctime,omitempty"`     // 文件在客户端创建时间
	IsDir          int64  `json:"isdir,omitempty"`           // 是否为目录,0 文件、1 目录
	Privacy        int64  `json:"privacy"`
	Category       int64  `json:"category"`            // 文件类型,1 视频、2 音频、3 图片、4 文档、5 应用、6 其他、7 种子
	Md5            string `json:"md5,omitempty"`       // 云端哈希(非文件真实MD5),只有是文件类型时,该字段才存在
	DirEmpty       int64  `json:"dir_empty,omitempty"` // 该目录是否存在子目录,只有请求参数web=1且该条目为目录时,该字段才存在, 0为存在, 1为不存在
}

type FileListReq

type FileListReq struct {
	Dir       *string `query:"dir"`       // 以 / 开头的绝对路径, 默认为 /, 需要 url-encode 编码
	Order     *string `query:"order"`     // 排序字段,默认为 name; time表示先按文件类型排序,后按修改时间排序; name表示先按文件类型排序,后按文件名称排序; size表示先按文件类型排序,后按文件大小排序。
	Desc      *int64  `query:"desc"`      // 排序方式,默认为0,即升序;1表示降序, 排序的对象是当前目录下所有文件,不是当前分页下的文件)
	Start     *int64  `query:"start"`     // 分页开始位置,默认为0,表示从第一条记录开始
	Limit     *int64  `query:"limit"`     // 分页大小,默认为1000,建议最大不超过1000
	Web       *int64  `query:"web"`       // 值为1时,返回dir_empty属性和缩略图数据
	Folder    *int64  `query:"folder"`    // 0 返回所有,1 只返回文件夹,且属性只返回path字段
	ShowEmpty *int64  `query:"showempty"` // 0 不返回,1 返回dir_empty属性
}

type FileMeta

type FileMeta struct {
	Category    int64  `json:"category"`     // 文件类型,含义如下:1 视频, 2 音乐,3 图片,4 文档,5 应用,6 其他,7 种子
	DLink       string `json:"dlink"`        // 文件下载地址,参考下载文档进行下载操作
	Filename    string `json:"filename"`     // 文件名
	FsID        int64  `json:"fs_id"`        // id
	Isdir       int64  `json:"isdir"`        // 是否是目录,为1表示目录,为0表示非目录
	Md5         string `json:"md5"`          // md5
	OperatorID  int64  `json:"oper_id"`      // 操作者id
	Path        string `json:"path"`         // 路径
	ServerCtime int64  `json:"server_ctime"` // 文件的服务器创建Unix时间戳,单位秒
	ServerMtime int64  `json:"server_mtime"` // 文件的服务器修改Unix时间戳,单位秒
	Size        int64  `json:"size"`         // 文件大小,单位字节
	Thumbs      struct {
		Icon string `json:"icon,omitempty"`
		Url1 string `json:"url1,omitempty"`
		Url2 string `json:"url2,omitempty"`
		Url3 string `json:"url3,omitempty"`
	} `json:"thumbs"`
	DateTaken int64 `json:"date_taken,omitempty"` // 图片拍摄时间
	Width     int64 `json:"width,omitempty"`      // 图片宽度
	Height    int64 `json:"height,omitempty"`     // 图片高度
}

type FileMetadataReq

type FileMetadataReq struct {
	FsIDs     []int64 `query:"fsids"`     // 是	[414244021542671,633507813519281]	URL参数	文件id数组,数组中元素是uint64类型,数组大小上限是:100
	DLink     *int64  `query:"dlink"`     //	否	0	URL参数	是否需要下载地址,0为否,1为是,默认为0。获取到dlink后,参考下载文档进行下载操作
	Path      *string `query:"path"`      //	否	/123-571234	URL参数	查询共享目录或专属空间内文件时需要。; 共享目录格式: /uk-fsid; 其中uk为共享目录创建者id, fsid对应共享目录的fsid; 专属空间格式:/_pcs_.appdata/xpan/
	Thumb     *int64  `query:"thumb"`     //	否	0	URL参数	是否需要缩略图地址,0为否,1为是,默认为0
	Extra     *int64  `query:"extra"`     // 否	0	URL参数	图片是否需要拍摄时间、原图分辨率等其他信息,0 否、1 是,默认0
	NeedMedia *int64  `query:"needmedia"` // 否	0	URL参数	视频是否需要展示时长信息,0 否、1 是,默认0
}

type FileRenameReq

type FileRenameReq struct {
	Async       int64 // 0 同步,1 自适应,2 异步
	PathList    []*FileRenameReqPath
	OnDuplicate *string //	遇到重复文件的处理策略: fail(默认,直接返回失败)、newcopy(重命名文件)、overwrite、skip
}

type FileRenameReqPath

type FileRenameReqPath struct {
	Path    string `json:"path"`
	NewName string `json:"newname"`
}

type FileSearchReq

type FileSearchReq struct {
	Key       string  `query:"key"`       //	是	"day"	URL参数	搜索关键字
	Dir       *string `query:"dir"`       // 否	/测试目录	URL参数	搜索目录,默认根目录
	Page      *int64  `query:"page"`      //	否	1	URL参数	页数,从1开始,缺省则返回所有条目
	Num       *int64  `query:"num"`       //	否	100	URL参数	默认为500,不能修改
	Recursion *int64  `query:"recursion"` //	否	1	URL参数	是否递归搜索子目录 1:是,0:否(默认)
	Web       *int64  `query:"web"`       //	否	0	URL参数	默认0,为1时返回缩略图信息
}

type FileUploadReq

type FileUploadReq struct {
	Name  string
	File  io.Reader
	RType *int64 `json:"rtype"` // 文件命名策略,默认为0。0 表示不进行重命名,若云端存在同名文件返回错误; 1 表示当path冲突时,进行重命名; 2 表示当path冲突且block_list不同时,进行重命名; 3 当云端存在同名文件时,对该文件进行覆盖
}

type FileUploadSessionAppendReq

type FileUploadSessionAppendReq struct {
	Method      string    `query:"method"` // 本接口固定为precreate
	AccessToken string    `query:"access_token"`
	Type        string    `query:"type"`     // 固定值 tmpfile
	Path        string    `query:"path"`     // 需要与上一个阶段预上传precreate接口中的path保持一致
	UploadID    string    `query:"uploadid"` // 上一个阶段预上传precreate接口下发的uploadid
	PartSeq     int64     `query:"partseq"`  // 文件分片的位置序号,从0开始,参考上一个阶段预上传precreate接口返回的block_list
	File        io.Reader `file:"file"`      // 是		RequestBody参数	上传的文件内容
}

type FileUploadSessionFinishReq

type FileUploadSessionFinishReq struct {
	Method      string `query:"method"` // 本接口固定为precreate
	AccessToken string `query:"access_token"`

	Path     string    `json:"path"` // 上传后使用的文件绝对路径,需要urlencode,需要与预上传precreate接口中的path保持一致
	File     io.Reader `json:"-"`
	UploadID string    `json:"uploadid"` // 预上传precreate接口下发的uploadid
	RType    *int64    `json:"rtype"`    // 0 为不重命名,返回冲突; 1 为只要path冲突即重命名; 2 为path冲突且block_list不同才重命名; 3 为覆盖,需要与预上传precreate接口中的rtype保持一致

}

type FileUploadSessionStartReq

type FileUploadSessionStartReq struct {
	Method      string `query:"method"` // 本接口固定为precreate
	AccessToken string `query:"access_token"`

	Path string `json:"path"` // 上传后使用的文件绝对路径,需要urlencode
	File io.Reader
	// Size       int64   `json:"size"`        // 文件和目录两种情况:上传文件时,表示文件的大小,单位B;上传目录时,表示目录的大小,目录的话大小默认为0
	// IsDir      int64   `json:"isdir"`       // 是否为目录,0 文件,1 目录
	// BlockList  string  `json:"block_list"`  // 是	["98d02a0f54781a93e354b1fc85caf488", "ca5273571daefb8ea01a42bfa5d02220"]	RequestBody参数	文件各分片MD5数组的json串。block_list的含义如下,如果上传的文件小于4MB,其md5值(32位小写)即为block_list字符串数组的唯一元素;如果上传的文件大于4MB,需要将上传的文件按照4MB大小在本地切分成分片,不足4MB的分片自动成为最后一个分片,所有分片的md5值(32位小写)组成的字符串数组即为block_list。
	// AutoInit   int64   `json:"autoinit"`    //	是	1	RequestBody参数	固定值1
	RType *int64 `json:"rtype"` // 文件命名策略,默认为0。0 表示不进行重命名,若云端存在同名文件返回错误; 1 表示当path冲突时,进行重命名; 2 表示当path冲突且block_list不同时,进行重命名; 3 当云端存在同名文件时,对该文件进行覆盖

}

type FileUploadSessionStartResp

type FileUploadSessionStartResp struct {
	Path       string  `json:"path"`
	UploadID   string  `json:"uploadid"`
	ReturnType int64   `json:"return_type"` // 1 文件在云端不存在,2 文件在云端已存在
	BlockList  []int64 `json:"block_list"`  // 需要上传的分片序号列表,索引从0开始
	// contains filtered or unexported fields
}

func (FileUploadSessionStartResp) Err

func (e FileUploadSessionStartResp) Err() error

func (*FileUploadSessionStartResp) Exist

func (r *FileUploadSessionStartResp) Exist() bool

type Logger

type Logger interface {
	Info(format string, args ...interface{})
	Error(format string, args ...interface{})
}

func NewDefaultLogger

func NewDefaultLogger() Logger

type Option

type Option func(o *option)

func WithAppCredential

func WithAppCredential(appKey, secret string) Option

func WithDownloadTimeout

func WithDownloadTimeout(timeout time.Duration) Option

func WithToken

func WithToken(accessToken, refreshTokens string) Option

type Token

type Token struct {
	AccessToken  string `json:"access_token"`
	RefreshToken string `json:"refresh_token"`
	ExpiresIn    int    `json:"expires_in"`
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL