共享笔记
与个人或所有人共享笔记
一个用户可以和特定的用户,一组用户或整个世界共享笔记或笔记本(印象笔记目前不支持和一组用户或整个世界共享笔记或笔记本)。
这个图表展示了印象笔记中不同的共享选项:
共享选项
[1] 生成一个唯一的 URL,任何知道这个 URL 的人都有访问权限
[2] 向特定的印象笔记用户授予特定笔记本的访问权限
[3] 把一个笔记本设置成公开的,这样全世界都可以访问这个笔记本(印象笔记暂时不支持此选项)
共享一条笔记
通过公开链接来共享一条笔记
你可以生成一个公开链接来共享一条笔记。任何知道这个 URL 的人都可以在浏览器中查看这条笔记。这个 URL 总是共享笔记当前的内容,所以如果笔记在被共享后发生修改,收件人可以看到这些修改。
注意
一个应用只能在用户显式地选择共享时(例如点击“共享”按钮)才能共享一个笔记。如果没有用户的同意,你不应该打开共享功能。
该功能只能在Evernote International下使用,印象笔记无法生成公开链接。
如果要通过公开链接共享笔记,你必需先通过 shareNote 打开共享功能。这个函数会生成一个 share key,你可以使用这个 key 在生成共享 URL:
https://host.evernote.com/shard/shardId/sh/noteGuid/noteKey
例如:
在上面的 URL 中,shardId 为 s1,笔记的 GUID 为 3554a82b-54d3-4673-8641-2bbcac94bbff,并且 share key 为 D368012bd2c3ce342c709fefd26355a7。
$noteGuid = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
$shareKey = $noteStore->shareNote($authToken, $noteGuid);
$url = "https://www.evernote.com/shard/" + $shardId + "/sh/" + $noteGuid + "/" + $shareKey;
可以使用 stopSharingNote 来关闭对一条笔记的共享。一旦调用了 stopSharingNote,原来共享的 URL 将会失效。如果后面重新共享了这条笔记,那么将会生成一个新的 share key 和一个新的共享 URL。
如果一个应用得到了公开链接中的各个组成部分,那么它就可以读取这条共享笔记。这里展示了如何读取我上面共享的笔记:
$sharedGuid = "3554a82b-54d3-4673-8641-2bbcac94bbff";
$sharedKey = "d368012bd2c3ce342c709fefd26355a7";
$sharedShard = "s1";
// 为笔记拥有者所在的 shard 新建一个 NoteStore client
// 这个 shard 可能与在你的应用中登陆印象笔记服务的用户所在的 shard 不同
$trans = new THttpClient(NOTESTORE_HOST, NOTESTORE_PORT, '/edam/note/' . $sharedShard, 'https');
$prot = new TBinaryProtocol($trans);
$sharedNoteStore = new NoteStoreClient($prot, $prot);
$sharedAuthResult = $ExternalNoteStore->authenticateToSharedNote($sharedGuid, $sharedKey);
$sharedAuthToken = $sharedAuthResult->authenticationToken;
$note = $sharedNoteStore->getNote($sharedAuthToken, $sharedNoteGuid, true, true, false, false);
共享整个笔记本
用户也可以向特定的收件人或所有人共享整个笔记本。共享给特定收件人的笔记本可以选择是否需要收件人在查看共享笔记本之前登陆印象笔记。高级版用户可以允许收件人在共享笔记本中编辑笔记。因为存在这些设置,所以共享笔记本相对复杂一些。
有两个数据模型涉及共享笔记本 - SharedNotebook 和 LinkedNotebook。SharedNotebook 对象存在于笔记本拥有者的帐户中 - 把它想像成一个查看特定笔记本的邀请。LinkedNotebook 对象存在于共享接收人的账户中,并且它代表一个指向拥有者帐户中的笔记本的持久链接。因为用户可以不登陆印象笔记就可以查看共享笔记本(如果笔记本拥有者允许这么做),所以不需要每个 SharedNotebook 都有 LinkedNotebook。
共享一个笔记本
要共享一个笔记本,你需要在笔记本拥有者的帐户中创建一个 SharedNotebook 对象。一个 SharedNotebook 只把笔记本共享给一个电子邮件地址,所以如果要把笔记本共享给三个人,你需要创建三个 SharedNotebook 对象。
$sharedNotebook = new edam_type_SharedNotebook();
// 接收共享笔记本的接收人电子邮件
$sharedNotebook->email = "recipient@email.com";
// 接收人查看笔记本之前是否需要登陆印象笔记?
$sharedNotebook->requireLogin = true;
// 接收人是否可以在共享笔记本中创建或更改笔记?
$sharedNotebook->notebookModifiable = false;
// 要共享的笔记本的 GUID
$sharedNotebook->notebookGuid = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
$sharedNotebook = $noteStore->createSharedNotebook($accessToken, $sharedNotebook);
创建一个 SharedNotebook 并不会自动生成给接收人的邀请。如果你通过创建一个 SharedNotebook 来共享一个笔记本,那么你需要接收人收到用来访问共享笔记本的信息。类似地,LinkedNotebooks 不会被自动创建。印象笔记服务在用户使用浏览器查看一个共享笔记本邀请时会创建一个 LinkedNotebook,或者你的应用可以在程序中接收这个邀请并在接收人帐户中创建一个 LinkedNotebook。
从链接的笔记本(linked notebooks)中读取笔记
当你的应用通过云 API 访问用户的印象笔记帐户时,你可以得到一个 LinkedNotebooks 列表 - 别人拥有的但是共享给你的用户的笔记。一旦你有了这个列表,你就可以在笔记拥有者的笔记本中访问这些笔记。要做到这点,你需要创建另外一个 NoteStore 连接,因为拥有者的帐户和接收人的帐户可能在不同的 shard 上。使用这个 NoteStore 连接,你就可以获取允许你访问共享笔记本内容的另外一个认证 token。
$linkedNotebooks = $noteStore->listLinkedNotebooks($authToken);
$linkedNotebook = current($linkedNotebooks);
$parts = parse_url($linkedNotebook->noteStoreUrl);
if (!isset($parts['port'])) {
if ($parts['scheme'] === 'https') {
$parts['port'] = 443;
} else {
$parts['port'] = 80;
}
}
$sharedNoteStoreHttpClient =
new THttpClient($parts['host'], $parts['port'], $parts['path'], $parts['scheme']);
$sharedNoteStoreProtocol = new TBinaryProtocol($sharedNoteStoreHttpClient);
$sharedNoteStore = new NoteStoreClient($sharedNoteStoreProtocol, $sharedNoteStoreProtocol);
$sharedAuthResult =
$sharedNoteStore->authenticateToSharedNotebook($linkedNotebook->shareKey, $authToken);
$sharedAuthToken = $sharedAuthResult->authenticationToken;
$sharedNotebook = $sharedNoteStore->getSharedNotebookByAuth($sharedAuthToken);
// 现在我们得到了共享给我们的 Notebook 对象的 GUID
$filter = new edam_notestore_NoteFilter();
$filter->notebookGuid = $sharedNotebook->notebookGuid;
$noteList = $sharedNoteStore->findNotes($sharedAuthToken, $filter, 0, 10);
print "Found " . $noteList->totalNotes . " shared notes\n";
一旦你有了读取共享笔记本的认证 token,你就可以使用任何 NoteStore 函数来操作那个笔记本中的笔记。上面的示例代码使用 findNotes 来获取共享笔记本中的所有笔记。注意,当你在共享笔记本上使用 findNotes 和 findNotesMetadata 时,你必须设置 NoteFilter.notebookGuid 为这个共享笔记本的 GUID。
同步链接的笔记本
要查看完整的同步链接笔记本的说明,请下载同步说明。