python 有道云笔记-有道云笔记openAPI

2023-05-16

有道云笔记旨在以云存储技术帮助用户建立一个可以轻松访问、安全存储的云笔记空间,解决了个人资料和信息跨平台跨地点的管理问题,目前已经提供了桌面版、网页版以及部分手机型号的版本。但是用户对笔记的需求不仅仅局限于这几种情形,对于很多非笔记应用,用户仍然可能有跨平台跨设备的存储需求。通过开放的API,第三方应用只需要进行简单的开发,就可以通过标准的web协议对有道云笔记的数据进行安全的访问与修改,而不需要搭设和维护运存储服务,这大大降低了第三方的开发与运营成本,从而将更多的精力专注于应用本身。

本文档从技术角度对有道云笔记的开放API进行说明,从而方便开发者的理解和使用。

目前有道云笔记的数据模型包括用户、笔记本、笔记以及附件四部分,下面将对它们分别进行说明:

用户

每一个有道云笔记的账号(目前我们使用网易通行证作为账号,但是以后将允许使用其它网站的开放认证账号,例如新浪微博账号,人人网账号)都在系统中对应着一份用户信息,包括该用户邮箱、笔记总空间、当前使用空间、默认笔记本、在线时间、注册时间以及上次修改时间等一系列信息。

笔记本

用户通过笔记本对所有笔记进行组织管理,每一篇笔记必须属于某一个笔记本,同时为了方便用户的区分与定位,每个笔记本也必须具有唯一的名字。目前有道云笔记仅支持一层笔记本结构,而不支持笔记本的多层嵌套。

对于同一篇笔记,可以在两个笔记本之间进行转移,但是却不允许出现在两个笔记本中。此外,每个用户在任何时候都有一个笔记本被标记为默认笔记本,如果一个笔记在创建时没有特别指明笔记本,它将被放入默认笔记本中。删除一个笔记本将删除该笔记本下的所有笔记。

虽然有道云笔记的客户端同时提供了同步笔记本与本地笔记本两种类型,但是由于本地笔记本仅存储在用户的本机而没有上传至服务器,因此开放API只能创建或者访问用户同步笔记本中的笔记。

笔记

一篇笔记由一段超文本以及相关联的附件(例如图片、文本、PPT、PDF等)所组成,其中超文本的内容按照一种标记语言的格式进行存储,每个附件所在的位置都对应着一个tag,包含着该附件路径,从而可以根据该信息找到对应附件的数据。同时,每个笔记还包含一些属性信息,例如题目、作者、来源URL以及创建修改时间等,这些信息可以用来对笔记进行查找、过滤以及排序。

当一个笔记被删除时,它将被放入回收站,回收站中的笔记在一定的时间内仍然可以访问(Open API不可以访问删除的笔记),但是不可以进行编辑,如果没有进行恢复,回收站的笔记将在一定的时间后(目前为两个月)被清除。

笔记标记语言格式的详细说明见附录A。

附件

笔记附件是附属于笔记的二进制数据,无法脱离笔记单独存在,因此如果仅上传附件而不添加相应的笔记,则该附件会被定期的空间回收所删除。笔记附件类似于邮件的附件,但是与邮件的附件不同的是,笔记的附件没有与笔记的内容进行整体编码,而只是在笔记内容超文本的对应位置放置了一个tag,附件的数据则单独进行存储。因此如果将附件tag在两个笔记之间进行拷贝,这两个笔记将共享同一个附件,而对附件的修改也将同时反映在两个笔记之中。不过目前我们尚不提供附件修改的API,还不存在这样的问题。随着API的完善,以后将提供类似的API,因此如果第三方应用希望避免这种情况,需要自行对附件拷贝进行处理。另一方面,如果共享附件的两篇笔记中有一篇笔记被删除,不会对另外一篇笔记及其附件造成影响。

目前笔记的附件支持除了exe、com、cmd、bat、sys以外的所有文件格式,大小限制为100MB。

为了对用户的数据进行保护,大部分API的访问都需要获得用户的身份信息,我们采用OAuth的方式对第三方应用进行授权,只有经过用户授权的应用才可以对用户的数据进行访问。目前我们支持OAuth 1.0a和OAuth 2.0,推荐用户使用OAuth2.0授权的方式,该方式更简洁也更安全。OAuth的官方技术说明可参看 http://oauth.net/。

申请Consumer Key

对于所有需要使用Open API的应用,在使用Open API之前首先要在系统内申请一个应用程序,申请者需要提交申请人姓名、应用名称、callback URL以及是否限制callbackURL等信息,我们会生成相应的ConsumerKey和ConsumerSecret,作为每个应用的身份标识。应用名称和ConsumerKey在系统中均是唯一的,在进行请求时,第三方应用需要将ConsumerKey加入请求中,而系统收到请求后,便可以根据ConsumerKey和ConsumerSecret对请求进行验证与记录,,具体请求方式参见根据OAuth版本的不同有所不同,请分别参见OAuth1.0a授权说明和OAuth2.0授权说明

授权流程

在获取Consumer Key和Consumer Secret后,应用程序便可以通过OAuth授权访问用户数据,一个完整的OAuth授权流程如下图所示:

1_OAuth.png

图1 OAuth授权流程图

应用程序首先利用Consumer Key与Consumer Secret从有道云笔记Server端获取Request Token及Request Secret。

获取Request Token及Secret后,应用程序便可以将用户重定向至有道云笔记的用户登录授权页面,此时用户登录并选择接受或者拒绝对应用程序的授权,如果用户选择接受授权有道云笔记会重定向至应用程序提供的callback页面,并且将verifier作为参数一同传递过去;如果用户选择拒绝授权则终止整个授权过程。

应用程序利用Request Token以及刚刚得到的verifier应用程序便可以请求Access Token,而有道云笔记在验证过Request Token及verifier后便会生成Access Token及Secret返回给应用程序,之后应用程序便可以使用Access Token及Secret访问用户的数据。通常Access Token具有一定的有效期,在有效期内应用程序可以一直访问该用户的数据,而当Access Token过期后,应用程序则需要再次走一遍授权流程。

在上述过程中,如果发生了任何异常,有道云笔记都会返回对应的错误码及错误信息,详细的错误信息说明见附录B。

授权请求说明

在进行OAuth授权请求时,OAuth相关的参数可以放置在query string和http header中,这里我们推荐使用http header的方式,这样可以将OAuth相关的参数与接口非OAuth参数区别对待,其中Header name为Authorization,而Header value则为OAuth相关参数组成的值,格式如下:

OAuth[空格][parameterName=”value”],[空格][ parameterName=”value”]…此外在发送时还有以下几点需要注意:

parameterName和value必须进行Percent Encoding (做法为先进行URL Encoding后再要将”+”替换为”%20”,将”*”替换为”%2A”,将”%7E”替换为”~”)

value的引号为必须

发送请求时参数可以是无序的,但是在签名时这些参数有一定的顺序要求,详见附录D

请求的baseURL为有道云笔记的domain,对于线上环境该baseURL为note.youdao.com,而测试环境为notesandbox.youdao.com,下同

一个包含OAuth参数的Header示例如下所示:

Authorization: OAuth oauth_token="64e4f0c25029dd6687ea74cd64e9640a",

oauth_consumer_key="2456f9dd37e162ffe237c8b88739925f",

oauth_signature_method="HMAC-SHA1", oauth_timestamp="1343381467",

oauth_nonce="952606576956129", oauth_version="1.0",

oauth_signature="%2FLQhn0OCf3lCMPSAAMVW35aUka0%3D"

请求request_token

l 请求方式:GET

l OAuth参数:

参数名

参数说明

oauth_callback

回调url,该url可以为oob,代表不回调。另外url还可以跟其他参数

oauth_consumer_key

申请应用时拿到的consumerKey

oauth_signature_method

签名方法,支持HMAC-SHA1

oauth_timestamp

时间戳,当前时间,单位秒

oauth_nonce

随机串,为了防止重放攻击,5分钟内同一用户同一应用同一时间发来的请求中oauth_nonce应不同

oauth_version

1.0

oauth_signature

签名,使用consumerSecret +’&’作为签名的key, 而签名的内容是除oath_signature以外的请求url内容,计算签名完毕后,使用base64编码,具体签名方法见附录D

l 返回结果:请求成功时返回oauth_token和oauth_token_secret,即Request Token与Secret,结果示例:

oauth_token=8b1676312a97aaa762ad743853a3c814&oauth_token_secret=71eb91f4d40b896c0aed9820cb240f76

请求失败时返回http status code 500以及error message

请求用户登录授权

l 请求方式:GET

l 请求参数:该处的参数必须以query string的形式发送

参数名

参数说明

oauth_token

请求request_token时返回的oauth_token

l 返回结果:当用户成功登录并且选择接受授权后,返回oauth_token与oauth_verifier,否则返回出错信息

l 备注:应用将用户定向至授权页面时,如果已经携带了网易或者有道的cookie信息,则将直接询问用户是否授权,否则会重新定向到网易的通行证页面先进行登录。

如果oauth_callback为oob,则不会产生回调,用户会在有道云笔记的授权页面上看到授权码,该授权码即为授权后的verifier,用户需要手工将该授权码黏贴至应用程序中完成OAuth授权程序。

请求Access Token

l 请求方式:GET

l OAuth参数:

参数名

参数说明

oauth_consumer_key

第三方应用的Consumer Key

oauth_token

请求request_token时返回的oauth_token

oauth_verifier

用户授权后得到的oauth_verifier,或者是授权页面显示的授权码

oauth_signature_method

签名方法,支持HMAC-SHA1

oauth_timestamp

时间戳,当前时间,单位毫秒

oauth_nonce

随机串,为了防止重放攻击,5分钟内同一用户同一应用同一时间发来的请求中oauth_nonce应不同

oauth_version

1.0

oauth_signature

使用consumerSecret + ’&’ + oauth_token_secret(该secret为请求request_token时返回的oauth_token_secret,即Request Token Secret)字串作为key, 而签名的内容是除oauth_signature以外的请求url内容,计算签名完毕后,使用base64编码具体签名方法见附录D

l 返回结果:请求成功时返回oauth_token和oauth_token_secret,即为Access Token与Secret,结果示例:

oauth_token=f7063a40e0c480c99930131526d5d31c&oauth_token_secret=71eb91f4d40b896c0aed9820cb240f76

请求失败时返回http status code 500以及error message

访问OpenAPI

在获得Access Token及Secret后,应用程序便可以通过OpenAPI访问、更新用户的数据,在进行OpenAPI的请求时,应用程序除了需要添加OpenAPI接口所需要的参数,仍然需要在Header中添加OAuth相关的参数以便对请求来源进行校验。

l OAuth参数:

参数名

参数说明

oauth_consumer_key

第三方应用的Consumer Key

oauth_token

请求request_token时返回的oauth_token

oauth_signature_method

签名方法,支持HMAC-SHA1

oauth_timestamp

时间戳,当前时间,单位毫秒

oauth_nonce

随机串,为了防止重放攻击,5分钟内同一用户同一应用同一时间发来的请求中oauth_nonce应不同

oauth_version

1.0

oauth_signature

使用consumerSecret + ’&’ + oauth_token_secret(该secret为请求request_token时返回的oauth_token_secret,即Request Token Secret)字串作为key, 而签名的内容是除oauth_signature以外的请求url内容,计算签名完毕后,使用base64编码具体签名方法见附录D

需要注意的是,在进行OpenAPI请求时,签名的内容根据OpenAPI接口的不同而有所不同:

对于请求方式为GET的接口,在计算签名时除了OAuth本身的参数以及OpenAPI的URL,例如获取用户信息接口,还需要将该接口query string中的其他所有非OAuth参数加入到base string中一起进行签名

对于请求方式为POST且Content Type为application/x-www-form-urlencoded的接口,例如创建笔记本接口,在计算签名时除了OAuth本身的参数以及OpenAPI的URL,还需要将该接口content body中的其他所有非OAuth参数加入到base string中一起进行签名,例如笔记本name

对于请求方式为POST且Content Type为multipart/form-data的接口,例如创建笔记接口,在计算签名时只需要加入OAuth本身的参数及OpenAPI的URL,而不需要考虑content body中的参数

具体API的请求方式以及Content Type见下文关于OpenAPI的详细说明。

目前已经有一些OAuth相关的类库提供了计算签名以及获取Request Token和Access Token的方法,同时我们也提供了一些常见语言的SDK以便应用开发者可以快速的开发,详见附录C。

OAuth 2.0说明

OAuth 2.0较1.0整个授权验证流程更简单更安全,是未来主要的用户身份验证和授权方式,因此有道云笔记开放平台对这种授权方式进行了支持,并推荐开发者采用这一协议,在OAuth 2.0 的授权及使用流程中都需要使用https协议。

OAuth 2.0授权流程

第三方应用在获取到consumerKey和consumerSecret之后,便可以通过OAuth 2.0授权访问用户数据,完整的OAuth 2.0授权流程如下图所示:

oauth2_authorize.png

应用程序首先利用Consumer Key请求用户授权,便可以将用户重定向至有道云笔记的用户登录授权页面,此时用户登录并选择接受或者拒绝对应用程序的授权,如果用户选择接受授权有道云笔记会重定向至应用程序提供的callback页面,并且将code作为url参数一同传递过去;如果用户选择拒绝授权则终止整个授权过程。

利用刚刚得到的code应用程序便可以请求Access Token,而有道云笔记在验证过code后便会生成Access Token返回给应用程序,之后应用程序便可以使用Access Token访问用户的数据。

在上述过程中,如果发生了任何异常,有道云笔记都会返回对应的错误码及错误信息,OAuth2.0相关的错误信息说明见Oauth 2.0错误说明。

OAuth 2.0授权接口说明

请求用户登陆授权

请求方式: GET

请求参数:

参数名称

参数说明

是否必需

client_id

申请的consumerKey

response_type

当前只支持code

redirect_uri

授权成功之后的跳转地址,在申请consumerKey的时候会要求填入domains,只要该参数值属于所填的domains(没有domain的时候采用home page)中的任意一个即可。如果该应用没有domain信息,则该参数需要填固定的http://note.youdao.com/redirect 网址才能通过认证。

state

授权完成后会回传该参数

display

默认会根据userAgent进行自动适配,可选值web/mobile,用于适配pc或mobile设备

返回结果:

当用户成功登录并授权成功后,通过redirect_uri的方式将code和state返回,否则返回出错信息。

备注:

请求成功后的跳转url格式如下:http://note.youdao.com/test?state=state&code=060148d3e406a80ac5f89e28f4ac633a

获取AccessToken

请求方式: GET

请求参数:

参数名称

参数说明

是否必需

client_id

申请的consumerKey

client_secret

对应的consumerSecret

grant_type

当前只支持authorization_code

redirect_uri

授权成功之后的跳转地址,在申请consumerKey的时候会要求填入domains,只要该参数值属于所填的domains(没有domain的时候采用home page)中的任意一个即可。如果该应用没有domain信息,则该参数需要填固定的http://note.youdao.com/redirect 网址才能通过认证。

code

授权成功取得到的code

返回结果:

调用成功返回access token,否则返回出错信息。

备注:

正常返回结果的格式如下:{"accessToken":"b43de33483491bc86090d6a707d6c3d3"}

OAuth1.0a的AccessToken置换成OAuth2.0的AccessToken

请求方式: GET

请求参数:

参数名称

参数说明

是否必需

client_id

申请的consumerKey

client_secret

对应的consumerSecret

token

OAuth1.0a中授权成功后获取到的token

token_secret

OAuth1.0a中授权成功后获取到的token secret

返回结果:

调用成功返回access token,否则返回出错信息。

备注:

该接口在调用成功之后会将对应的OAuth1.0a的token置为失效。 正常返回结果的格式如下: {"accessToken":"b43de33483491bc86090d6a707d6c3d3"}

通过OAuth2.0授权的token访问OpenAPI

对于普通的post和get请求,只需要增加oauth_token参数即可,参数值为去得到的accessToken。

对于Content-Type为multipart/form-data的post请求,需要在访问中增加一个名为Authorization的header,格式为:OAuth oauth_token="%accessToken%",其中%accessToken%即为取到的accessToken(引号必需)。用OAuth2.0 协议访问 OpenAPI 时需要使用 https 协议。

查看用户信息

l 请求方式:GET

l 支持格式:JSON

l 是否需要用户认证:是 (关于登录授权,参见OAuth1.0a授权说明)

l 请求参数:无

l 返回结果:操作成功时http状态为200,并用户信息;失败时http状态为500并返回错误码和错误信息,详见附录B。

结果示例:

{

“user” : “test@163.com”, // 用户ID

“total_size” : “10293736383”, // 用户总的空间大小,单位字节

“used_size” : “1024” // 用户已经使用了的空间大小,单位字节

“register_time” : “1323310917650” // 用户注册时间,单位毫秒

“last_login_time” : “1323310949120” // 用户最后登录时间,单位毫秒

“last_modify_time” : “1323310978120” // 用户最后修改时间,单位毫秒

“default_notebook” : “/AB384D734” // 该应用的默认笔记本

}

注:对于每个第三方应用,都分别在用户的笔记空间中对应一个默认笔记本,笔记本名可以在申请应用时指定,如果不指定则默认为“来自<应用名称>”,这样在使用OpenAPI创建笔记时,如果第三方应用不指定笔记本,则自动创建在该默认笔记本中。

查看用户全部笔记本

l 请求方式:POST

l Content-Type:application/x-www-form-urlencoded

l 支持格式:JSON

l 是否需要用户认证:是 (关于登录授权,参见OAuth1.0a授权说明)

l 请求参数:无

l 返回结果:操作成功时http状态为200,并返回笔记本列表;失败时http状态为500并返回错误码和错误信息,详见附录B。

结果示例:

[

{“path” : “/4AF64012E9864C”, // 笔记本的路径

“name” : “笔记本1”, // 笔记本的名称

“notes_num” : “3” // 该笔记本中笔记的数目

“create_time” : “1323310917” // 笔记本的创建时间,单位秒

“modify_time” : “1323310949” // 笔记本的最后修改时间,单位秒

},

{“path” : “/5AB0C6B33BD1162”,

“name” : “笔记本2”,

“notes_num” : “10”

“create_time” : “1323311244”

“modify_time”: “1323310349”

}

]

列出笔记本下的笔记

l 请求方式:POST

l Content-Type:application/x-www-form-urlencoded

l 支持格式:JSON

l 是否需要用户认证:是 (关于登录授权,参见OAuth1.0a授权说明)

l 请求参数:

参数名

参数说明

是否必须

数据类型/限制

notebook

笔记本路径

String

l 返回结果:操作成功时http状态为200,并返回该笔记本下的笔记列表(只有笔记路径,笔记内容需要通过笔记接口获取);失败时http状态500并返回错误码和错误信息,详见附录B。

结果示例:

[

“/4AF64012E9864C/123TDE3DC”, // 笔记路径

“/4AF64012E9864C/DC12FTDE3”,

“/4AF64012E9864C/FE23TDE3C”

]

创建笔记本

l 请求方式:POST

l Content-Type:application/x-www-form-urlencoded

l 支持格式:JSON

l 是否需要用户认证:是 (关于登录授权,参见OAuth1.0a授权说明)

l 请求参数:

参数名

参数说明

是否必须

数据类型/限制

name

笔记本名称

String

l 返回结果:操作成功时http状态200,并返回新创建笔记本的路径;失败时http状态500并返回错误码和错误信息,详见附录B。

结果示例:

{“path” : “/4AF64012E9864C”}

注:对于创建时间,主要作用在于对移动端的应用,笔记本的创建时间和同步时间可能差别较大,因此如果不指定该时间,笔记本的创建时间则会显示为同步时间而非本身的创建时间。

删除笔记本

l 请求方式:POST

l Content-Type:application/x-www-form-urlencoded

l 支持格式:JSON

l 是否需要用户认证:是 (关于登录授权,参见OAuth1.0a授权说明)

l 请求参数:

参数名

参数说明

是否必须

数据类型/限制

notebook

笔记本路径

String

modify_time

删除时间,单位为

秒,如果不指定则使

用系统时间

Long

l 返回结果:操作成功时http状态200,无返回数据;失败时http状态500并返回错误码和错误信息,详见附录B。

创建笔记

l 请求方式:POST

l Content-Type:multipart/form-data

l 支持格式:JSON

l 是否需要用户认证:是 (关于登录授权,参见OAuth1.0a授权说明)

l 请求参数:

参数名

参数说明

是否必须

数据类型/限制

source

笔记来源URL

String

author

笔记作者

String

title

笔记标题

String

content

笔记正文(笔记格式见附录A)

String

create_time

创建时间,单位为秒,如果不指定则使用系统时间

Long

notebook

该新建笔记所属的笔记本路径

String

l 返回结果:操作成功时http状态为200,并返回新建笔记的路径;失败时http状态为500并返回错误码和错误信息,详见附录B。

结果示例:

{“path” : “/4AF64012E9864C/FE89D12134E”}

注:

如果第三方应用没有指定notebook,则在该第三方应用对应的默认笔记本中创建该笔记。

对于创建时间,主要作用在于对移动端的应用,笔记的创建时间和同步时间可能差别较大,因此如果不指定该时间,笔记的创建时间则会显示为同步时间而非本身的创建时间。

查看笔记

l 请求方式:POST

l Content-Type:application/x-www-form-urlencoded

l 支持格式:JSON

l 是否需要用户认证:是 (关于登录授权,参见OAuth1.0a授权说明)

l 请求参数:

参数名

参数说明

是否必须

数据类型/限制

path

笔记路径

String

l 返回结果:操作成功时http状态为200,并返回该笔记的相关信息;失败时http状态为500并返回错误码和错误信息,详见附录B。

结果示例:

{

“title” : “工作记录”, // 笔记标题

“author” : “Tom”, // 笔记作者

“source” : “http://note.youdao.com”, // 笔记来源URL

“size” : “1024”, // 笔记大小,包括笔记正文及附件

“create_time” : “1323310917” // 笔记的创建时间,单位秒

“modify_time” : “1323310949” // 笔记的最后修改时间,单位秒

“content” : “

This is a test note

// 笔记正文

}

修改笔记

l 请求方式:POST

l Content-Type:multipart/form-data

l 支持格式:JSON

l 是否需要用户认证:是 (关于登录授权,参见OAuth1.0a授权说明)

l 请求参数:

参数名

参数说明

是否必须

数据类型/限制

path

修改笔记的路径

String

source

修改后的笔记来源URL

String

author

修改后的笔记作者

String

title

修改后的笔记标题

String

content

修改后的笔记正文(笔记格式见附录A)

String

modify_time

修改时间,单位为秒,如果不指定则使用系统时间

Long

l 返回结果:操作成功时http状态为200,无返回结果;失败时http状态为500并返回错误码和错误信息,详见附录B。

注:对于修改时间,主要作用在于对移动端的应用,笔记的修改时间和同步时间可能差别较大,因此如果不指定该时间,笔记的修改时间则会显示为同步时间而非本身的修改时间。

移动笔记

l 请求方式:POST

l Content-Type:application/x-www-form-urlencoded

l 支持格式:JSON

l 是否需要用户认证:是 (关于登录授权,参见OAuth1.0a授权说明)

l 请求参数:

参数名

参数说明

是否必须

数据类型/限制

path

想要移动的笔记原路径

String

notebook

目标笔记本的路径

String

l 返回结果:操作成功时http状态为200,返回移动后的笔记路径;失败时http状态为500并返回错误码和错误信息,详见附录B。

结果示例:

{“path”: “/5AB0C6B33BD1162/FE89D12134E”}

删除笔记

l 请求方式:POST

l Content-Type:application/x-www-form-urlencoded

l 支持格式:JSON

l 是否需要用户认证:是 (关于登录授权,参见OAuth1.0a授权说明)

l 请求参数:

参数名

参数说明

是否必须

数据类型/限制

modify_time

修改时间,单位为秒,如果不指定则使用系统时间

Long

path

想要删除的笔记原路径

String

l 返回结果:操作成功时http状态为200,无返回结果;失败时http状态为500并返回错误码和错误信息,详见附录B。

分享笔记链接

l 请求方式:POST

l Content-Type:application/x-www-form-urlencoded

l 支持格式:JSON

l 是否需要用户认证:是 (关于登录授权,参见OAuth1.0a授权说明)

l 请求参数:

参数名

参数说明

是否必须

数据类型/限制

path

想要分享的笔记的路径

String

l 返回结果:操作成功时http状态为200,并返回该分享笔记的链接;失败时http状态为500并返回错误码和错误信息,详见附录B。

结果示例:

{“url”: “http://note.youdao.com/share/?id=a5ae59ffda1e11caa43124288890b44d&type=note”}

注:通过这种方式分享的笔记,任何人都可以通过该链接查看该笔记

上传附件或图片

l 请求方式:POST

l Content-Type:multipart/form-data

l 支持格式:JSON

l 是否需要用户认证:是 (关于登录授权,参见OAuth1.0a授权说明)

l 请求参数:

参数名

参数说明

是否必须

数据类型/限制

file

上传的附件文件(包括附件的文件名、类型、大小、数据等)

Multipart File/附件大小限制25M

l 返回结果:操作成功时http状态为200,对于图片,返回该图片的链接URL,对于普通附件,服务器会为该附件生成一个图标文件,因此返回结果包括该附件对应的链接URL以及图标的URL;失败时http状态为500并返回错误码和错误信息,详见附录B。

示例:

图片附件

{"url" : "http://baseURL/yws/open/resource/28/d83f547f3055"}

普通附件

{

"url" : "http://baseURL/yws/open/resource/28/d83f547f3055" // 附件URL

"src": " http://baseURL/yws/open/resource/29/7f2bd6fa2795" // 图标URL

}

需要注意的是,在附件上传完成后,使用者应该紧接着更新对应的笔记,否则不被任何笔记引用的附件将被定期的空间回收所删除。

下载附件/图片/图标

l 请求方式:GET

l 是否需要用户认证:是 (关于登录授权,参见OAuth1.0a授权说明)

l 返回结果:操作成功时,response返回附件及图片的二进制流;失败时http状态为500并返回错误码和错误信息,详见附录B。

l 备注:

1.当打开笔记时,对于笔记中的附件及图片链接,只需要添加用户的OAuth认证信息即可以获取对应的附件及图片,同理在上传附件后,返回的附件及图片链接也可以通过这种方式进行访问。

2.附件及图片的下载支持断点续传

笔记内容的格式采用类HTML的标记语言,绝大部分格式相关tag均采用标准的HTML Tag,唯一需要不同的是附件及图片Tag。在格式上图片Tag与标准的img tag相同,一个图片资源的标记如下:

7f2bd6fa2795441c"

但是由于对应的接口需要用户认证,因此在获取图片资源时,需要加入OAuth的用户认证信息。

附件通常以图标在笔记中进行显示,因此我们扩展了图片Tag ,除了img本身的src属性,额外加入了一个属性path,其中src对应着该附件的图标URL,而path则为该附件的URL,如下所示:

7f2bd6fa2795441c"

同理,也需要加入OAuth的用户认证信息,才可以正常访问附件资源及其图标,如果第三方应用希望用户能够下载对应附件,则需要自行对用户的行为进行响应。

同理,当Open API的请求在执行时出现任何异常或错误时,系统将返回Http 500,应用程序可以根据此判断请求是否成功执行。当应用程序在进行OAuth认证,或者未经认证便调用Open API时,系统会返回OAuth错误信息,OAuth的错误码与错误信息将以json的格式进行返回,各个错误码及错误信息说明如下:

错误码

错误描述及可能原因

1001

token_rejected:consumer没有找到,consumerKey错误, consumer没有创建,或者request token或者access token 不存在于server中,或者没有获得授权的token,或者token过期

1002

parameter_rejected:这个会返回具体原因key是oauth_parameters_rejected, value是一个parameter列表

1003

version_rejected:OAuth版本号不是1.0

1004

timestamp_refused:timestamp 非5分钟内

1005

nonce_used:5分钟内该nonce被使用

1006

parameter_absent:有些参数没有发送给server

1007

signature_invalid:oauth签名异常,可能原因没有签名,签名方法和签名不一致等

1008

signature_method_rejected:oauth server没有提供该签名方法

1009

access_state_error:获取token时状态混乱,详细的信息会告知当前的状态 [AUTHORIZED | REQUEST | ACCESS | INVALID]

1010

consumer_rejected:该consumer在server中不存在,或者被禁掉。或者consumerKey改变,但是还没有反应到server的数据库中。

1011

accessor_rejected:由token得到的accessor构造异常,或者accessor中缺失某些属性,或者转换失败

1012

callback_error:request token传来的callback和以后的callback不一致。

1013

callback_domain_error:当限定callback后,发来的callback与原设置的callback的域不相同

1014

verifier_error:Verifier不一致错误

1015

permission_denied:无授权的token,或者授权后没有获取过access token

同理,当Open API的请求在后台执行出现异常或错误时,系统也将同时错误码与错误信息以json的格式一同返回,应用程序可以根据错误码得到相应的原因,常见的错误码说明如下:

错误码

错误描述及可能原因

206

UNKNOWN_URI:错误的URI请求

207

AUTHENTICATION_FAILURE:用户认证错误

209

RESOURCE_NOT_EXIST:请求的资源(笔记本、笔记、附件等)不存在

210

USER_SPACE_FULL:用户空间已满

214

INVALID_PARAMETER:错误的传入参数,必须的参数为空等

220

USER_NOT_EXISTS:用户不存在

221

USER_ALREADY_EXISTS:用户已经存在,不能重复注册

225

PARENT_NOT_EXIST:笔记本尚不存在,不能在该笔记本下创建笔记

231

RESOURCE_ALREADY_EXIST:该笔记或者附件已经存在,不能重复创建

304

NOTE_ALREADY_DELETED:笔记已经被删除

307

INVALID_APPLICATION:无效的第三方应用,未经过用户授权或者授权失败便通过OpenAPI访问用户数据.这个一般是使用测试环境得到了access_token,利用该access_token访问了线上环境。这两套环境是独立的。Access_token不能共用。

但是如果第三方应用未经过用户授权

示例:当查看笔记路径错误时

{

"error" : "209",

"message" : " Required note does not exist, path=/5AB0C6B33BD12/FE89D12134E"

}

Oauth 2.0错误说明

当Open API的请求在执行时出现任何异常或错误时,系统将返回Http 500,应用程序可以根据此判断请求是否成功执行。当应用程序在进行OAuth 2.0认证,或者未经认证便调用Open API时,系统会返回OAuth错误信息,OAuth的错误码与错误信息将以json的格式进行返回,各个错误码及错误信息说明如下:

错误码

错误描述及可能原因

1200

empty_clientId:请求参数中缺少了client_id参数 Key

1201

empty_clientSecret:请求参数中缺少了clientSecret参数

1202

client_id_miss_match:输入的client_id与期望值不一致

1203

expire_authorization_code:授权code已过期

1204

unsupported_response_type:不支持的response_type类型

1205

invalid_authorization_code:授权code无效

1206

redirectUri_has_fragment:redirect_uri中含有”#”

1207

invalid_redirectUri:redirect_uri不匹配

1208

empty_redirectUri:redirect_uri为空

1209

unauthorized_client:用户未对该应用授权

1210

unsupported_grant_type:不支持的grant_type类型

1211

unsupported_response_type:不支持的response_type类型

1212

empty_state:需要传入state参数

1213

token_secret_missing:通过OAuth 1.0a的access_token置换成OAuth 2.0可用的时候需要token_secret参数#”

1214

token_secret_miss_match:token_secret不匹配

1215

client_secret_miss_match:client_secret不匹配

开源类库

SDK

说明

签名的base string由以下内容组成:

请求方法名,例如 GET/POST等, 加密时方法名大写并进行特殊替换(详见3)。

URL (query parameter之前的部分,不包括 ?),http或者https需要全部小写, http如果带有80端口,或者https带有443端口,需要将其省略。其他端口则不能省略。例如:

http://local:9999/requestToken

> http://local:9999/requestToken

http://local:80/requestToken

> http://local/requestToken

https://local:443/requestToken

> https://local/requestToken

参数(query parameter中的参数以及OAuth参数),首先将这些参数进行特殊替换后,按字典序排序升序排列。如果两个key相同,则以value特殊替换后字典序为准。key与value之间使用”=”连接,如果value==null,则使用空字符串””替代,两个参数对之间使用”&”连接,连接后形成的最终字符串的开头和结尾没有”&”。将以上a,b,c三步进行特殊替换后,使用&连接就得到了签名的base string,最终形成的字符串的开头和结尾都没有”&”。

签名的key是ConsumerSecret + & + TokenSecret,如果TokenSecret还没有得到,则使用空字符串””。 ConsumerSecret和TokenSecret需先做特殊替换,然后再进行签名。

特殊替换是将String进行URL编码后,将”+”替换为”%20”,将”*”替换为”%2A”,将”%7E”替换为”~”.

签名方法可以使用HMAC-SHA1,PLAINTEXT, RSA_SHA1三种。其中PLAINTEXT为2中的key. 该方法不提倡使用。

得到签名内容后使用Base64进行编码,编码后的字符串即为oauth_signature。

Examples:

以获取request_token为例,该请求的基本信息如下:

请求方式:GET

OAuth参数:oauth_consumer_key,oauth_signature_method,oauth_timestamp,oauth_nonce,oauth_version

对应签名的base string为

GET&http%3A%2F%2Fnote.youdao.com%2Foauth%2Frequest_token&oauth_consumer_key%3D2456f9dd37e162ffe237c8b88739925f%26oauth_nonce%3D1209317042071280%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1343638182%26oauth_version%3D1.0

以创建笔记本为例,该请求的基本信息如下:

请求方式:POST

Content Type:application/x-www-form-urlencoded

请求参数:name=New_Notebook

OAuth参数:oauth_consumer_key,oauth_signature_method,oauth_timestamp,oauth_nonce,oauth_version

对应签名的base string为

POST&http%3A%2F%2Fnote.youdao.com%2Fyws%2Fopen%2Fnotebook%2Fcreate.json&name%3DNew_Notebook%26oauth_consumer_key%3D2456f9dd37e162ffe237c8b88739925f%26oauth_nonce%3D1209327240426679%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1343638192%26oauth_token%3D4948a9200d25424566682af4ac8b2c4b%26oauth_version%3D1.0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 有道云笔记-有道云笔记openAPI 的相关文章

  • 如何在 pygame 中显示平滑的加载栏?

    我目前在 pygame 上开发游戏 我想创建一个带有加载栏的加载窗口 就像软件 GIMP 一样 但我真的不知道如何优化它 这是我代码的一部分 显然它运行得不太好 你能帮助我吗 screen pygame display set mode 6
  • 获取列名,其中值是 pandas 数据框中的内容

    我试图在每个时间戳找到数据帧中的列名称 其值与同一时间戳的时间序列中的列名称相匹配 这是我的数据框 gt gt gt df col5 col4 col3 col2 col1 1979 01 01 00 00 00 1181 220328 9
  • Python 字符串不是不可变的吗?那为什么a + " " + b 会起作用呢?

    我的理解是 Python 字符串是不可变的 我尝试了以下代码 a Dog b eats c treats print a b c Dog eats treats print a b c Dog eats treats print a Dog
  • pandas 中的块总数

    在下面的脚本中 有没有办法找出总共有多少个 块 import pandas as pd import numpy as np data pd read csv data txt delimiter chunksize 50000 for c
  • 如何展平嵌套的Python字典?

    我正在尝试展平嵌套字典 dict1 Bob shepherd 4 6 3 collie 23 3 45 poodle 2 0 6 Sarah shepherd 1 2 3 collie 3 31 4 poodle 21 5 6 Ann sh
  • 子类化 multiprocessing.managers.BaseProxy

    我在尝试实施新的方法时遇到了一些麻烦defaultdict代理对象 这文档 https docs python org 3 library multiprocessing html multiprocessing managers Base
  • 下载变压器模型以供离线使用

    我有一个训练有素的 Transformer NER 模型 我想在未连接到互联网的机器上使用它 加载此类模型时 当前会将缓存文件下载到 cache 文件夹 要离线加载并运行模型 需要将 cache 文件夹中的文件复制到离线机器上 然而 这些文
  • matplotlib散点图颜色作为第三个变量的函数[重复]

    这个问题在这里已经有答案了 我想知道如何通过第三个变量使 matplotlib 的散点函数颜色点 问题matplotlib 中的 gnuplot linecolor 变量 https stackoverflow com questions
  • 如何仅在非整数时显示小数点?

    我用谷歌搜索过 但找不到正确的答案 假设我们有浮点数并得到它们的平均值 他们的平均值是这样的 3 5 2 5 5 7 所以我们有 4 个数字 不再在列表中的人 两个带小数的数字和两个整数 我想做的是 打印这些数字并保持这样 但我的问题是 当
  • python SMTP 未收到邮件

    你好 我正在尝试让 python 3 从 Ubuntu 发送一封简单的电子邮件 我启动了一个简单的 smtp 服务器 python m smtpd n c 调试服务器本地主机 1025 以下是我的电子邮件服务器的代码 import smtp
  • 借助 AWS SageMaker,是否可以使用 sagemaker SDK 部署预先训练的模型?

    我试图避免将现有模型训练过程迁移到 SageMaker 并避免创建自定义 Docker 容器来托管我们训练过的模型 我的希望是将我们现有的 经过训练的模型注入到 AWS 通过以下方式提供的预构建的 scikit learn 容器中 sage
  • Python argparse 切换标志

    argparse 有什么方法可以解析类似的标志 a b c d foo py s b 应该将 True 存储在dest of s和 False 中dest of b 很像 Windows 所做的attrib或Linuxchmod 目前 我正
  • 如何使用 PyArg_ParseTupleAndKeywords 来解析具有可选参数和关键字的元组?

    我到处都找过 但找不到例子PyArg ParseTupleAndKeywords 与元组一起使用 包含可选参数 and关键词 我发现的最接近的是这个问题 https stackoverflow com questions 10625865
  • 在其他列定义的窗口内累积应用

    我试图将函数累积地应用于由 开始 和 完成 列定义的窗口内的值 因此 开始 和 完成 定义了值处于 活动 的时间间隔 对于每一行 我想获得当时所有 活动 值的总和 这是一个 暴力 示例 它实现了我想要的功能 是否有更优雅 更快或更有效的内存
  • python子进程在引号前发送反斜杠

    我有一个字符串 它是一个应该在命令行中执行的框架命令 cmdToExecute TRAPTOOL a 字符串 ABC o 字符串 XYZ 我正在考虑该字符串具有应从命令提示符触发的整个命令 如果仔细查看字符串 cmdToExecute 您可
  • 调用 Pyramid 中的另一个视图

    我的目标 在 Pyramid 中 调用另一个可调用视图 并获得一个Response在不知道有关该视图可调用的任何详细信息的情况下拒绝返回 在我的 Pyramid 应用程序中 假设我有一个使用 view config 装饰器定义的视图 foo
  • 如何使用 Python 访问 Outlook 收件箱中的子文件夹

    我在 Outlook 中创建了一条规则 将来自特定发件人的所有传入邮件移至收件箱中的子文件夹 Like Inbox Subfolder 我写了一段代码 import win32com client outlook win32com clie
  • 如何从java类调用python脚本[重复]

    这个问题在这里已经有答案了 我有一个 java web 应用程序 我需要使用一个简单的网络爬虫从网页中读取 html 我在java中找不到任何简单的解决方案 但得到了一个非常简单的 python 脚本来解决我的问题 现在如何从我的 java
  • 如何计算scipy中曲线拟合的可能性?

    我有一个非线性模型拟合 如下所示 深色实线是模型拟合 灰色部分是原始数据 问题的简短版本 如何获得该模型拟合的可能性 以便我可以执行对数似然比测试 假设残差服从正态分布 我对统计学比较陌生 我目前的想法是 从曲线拟合中得到残差 并计算残差的
  • 在 Mako 模板中使用 from __future__ import

    I have 在我的模板文件的最顶部 我收到错误 SyntaxError from future imports must occur at the beginning of the file 这样做的正确方法是什么 你不能使用from f

随机推荐