重要提示:本文档是在 2012 年之前撰写的。身份验证选项 OAuth 1.0、AuthSub 和 ClientLogin) 已正式弃用 自 2012 年 4 月 20 日起不再提供。我们建议您迁移到 OAuth 2.0。
通过 Google 协作平台数据 API,客户端应用可以访问、发布和修改 Google 协作平台中的内容。 您的客户端应用还可以请求获取近期活动列表、提取修订历史记录以及下载附件。
除了提供有关协作平台数据 API 功能的一些背景信息之外,本指南还提供了与该 API 交互的示例。 使用 Python 客户端库。有关设置客户端库的帮助,请参阅 开始使用 Google 数据 Python 客户端库。如果您对 进一步了解 Python 客户端库用来与传统版 Google 协作平台 API 交互的基础协议,请参阅 协议指南。
受众群体
本文档适用于想要编写与 Google 协作平台交互的客户端应用程序的开发者 使用 Google 数据 Python 客户端库。
使用入门
要使用 Python 客户端库,您需要 Python 2.2 及更高版本以及 DependencyModules Wiki 页面上列出的模块。下载客户端库后, 有关安装和使用客户端的帮助信息,请参阅 Google 数据 Python 库使用入门。
运行示例
完整的工作示例位于项目的 Mercurial 代码库的 samples/sites
子目录中
(/samples/sites/sites_example.py).
按如下方式运行该示例:
python sites_example.py # or python sites_example.py --site [sitename] --domain [domain or "site"] --debug [prints debug info if set]
如果未提供必需的标志,应用将提示您输入这些值。该示例允许用户执行 演示了如何使用传统版 协作平台 API。因此,您需要进行身份验证才能执行某些操作(例如修改内容)。该计划将 还会提示您通过 AuthSub、OAuth 或 ClientLogin。
如需将本指南中的示例添加到您自己的代码中,您需要以下 import
语句:
import atom.data import gdata.sites.client import gdata.sites.data
您还需要设置一个 SitesClient
对象,以表示客户端与传统版 Google 协作平台 API 的连接。
传入您的应用程序名称和站点的网络空间名称(来自其网址):
client = gdata.sites.client.SitesClient(source='yourCo-yourAppName-v1', site='yourSiteName')
如要使用托管在 G Suite 网域上的网站,请使用 domain
参数设置网域:
client = gdata.sites.client.SitesClient(source='yourCo-yourAppName-v1', site='yourSiteName', domain='example.com')
在上述代码段中,source
参数是可选的,但建议将其用于日志记录。它应该
请采用以下格式:company-applicationname-version
注意:本指南的其余部分假定您在变量 client
中创建了一个 SitesClient
对象。
向传统版 Google 协作平台 API 进行身份验证
Python 客户端库可用于处理公开 Feed 或不公开 Feed。通过 Google 协作平台数据 API,您可以访问私有和公开 Feed,具体取决于网站的权限和您尝试执行的操作。例如,您可以读取 公开站点,但不对其进行更新 - 这需要通过身份验证的客户端。为此,您可以通过 ClientLogin 用户名/密码身份验证、AuthSub 或 OAuth。
有关 AuthSub、OAuth 和 ClientLogin 的详细信息,请参阅 Google Data API 身份验证概述。
用于网络应用程序的 AuthSub
网络应用的 AuthSub 身份验证应该由需要 Google 或 G Suite 账号对用户进行身份验证。运营商无需获取 Google 协作平台用户的用户名和密码,只需 AuthSub 令牌为必填项。
查看关于将 AuthSub 加入 Web 应用的说明
请求一次性令牌
当用户首次访问您的应用时,他们需要进行身份验证。通常,开发者会输出一些文本和一个指向用户的链接
到 AuthSub 批准页面,以验证用户身份并请求对其文档的访问权限。Google 数据 Python 客户端库提供了一个函数,
generate_auth_sub_url()
可生成此网址。以下代码设置了一个指向 AuthSubRequest 页面的链接。
import gdata.gauth def GetAuthSubUrl(): next = 'http://www.example.com/myapp.py' scopes = ['https://sites.google.com/feeds/'] secure = True session = True return gdata.gauth.generate_auth_sub_url(next, scopes, secure=secure, session=session) print '<a href="%s">Login to your Google account</a>' % GetAuthSubUrl()
如要对 G Suite 托管网域中的用户进行身份验证,请将域名传递给 generate_auth_sub_url()
:
def GetAuthSubUrl(): domain = 'example.com' next = 'http://www.example.com/myapp.py' scopes = ['https://sites.google.com/feeds/'] secure = True session = True return gdata.gauth.generate_auth_sub_url(next, scopes, secure=secure, session=session, domain=domain)
generate_auth_sub_url()
方法接受几个参数(对应于
AuthSubRequest 处理程序指定):
- next 网址 - Google 将重定向到的网址
在用户登录其账号并授予访问权限后;
上例中的
http://www.example.com/myapp.py
- 范围 -
https://sites.google.com/feeds/
- secure,一个布尔值,指示令牌是否将在安全和注册模式中使用;上例中的
True
- session:第二个布尔值,指示以后是否将一次性令牌交换为会话令牌;上例中的
True
升级为会话令牌
请参阅将 AuthSub 与 Google Data API 客户端库搭配使用。
检索有关会话令牌的信息
请参阅将 AuthSub 与 Google Data API 客户端库搭配使用。
撤消会话令牌
请参阅将 AuthSub 与 Google Data API 客户端库搭配使用。
提示:一旦您的应用成功获取了一个长期有效的会话令牌,
请将该令牌存储在您的数据库中,以便日后召回使用。无需在每次运行应用时将用户送回 AuthSub。
使用 client.auth_token = gdata.gauth.AuthSubToken(TOKEN_STR)
在客户端上设置现有令牌。
用于网络或安装版/移动应用的 OAuth
OAuth 可用作 AuthSub 的替代方案,适用于 Web 应用。 OAuth 类似于使用 AuthSub 的安全和注册模式 因为所有数据请求都必须进行数字签名,并且您必须注册自己的域名。
查看将 OAuth 加入已安装应用的说明
提取请求令牌
请参阅将 OAuth 与 Google Data API 客户端库搭配使用。
为请求令牌授权
请参阅将 OAuth 与 Google Data API 客户端库搭配使用。
升级为访问令牌
请参阅将 OAuth 与 Google Data API 客户端库搭配使用。
提示:您的应用成功获取 OAuth 访问令牌后,
请将该令牌存储在您的数据库中,以便日后召回使用。无需在每次运行应用时通过 OAuth 将用户送回。
使用 client.auth_token = gdata.oauth.OAuthToken(TOKEN_STR, TOKEN_SECRET)
在客户端上设置现有令牌。
安装版/移动应用程序的 ClientLogin
ClientLogin 应由需要 验证其用户的身份。首次运行时,您的应用会提示用户输入其用户名/密码。在后续请求中 引用了身份验证令牌。
查看关于将 ClientLogin 整合到已安装的应用的说明
要使用 ClientLogin,请调用
ClientLogin()
SitesClient
对象的方法,该方法继承自
GDClient
。指定电子邮件地址并
您的客户端发出请求时所代表的用户的密码。例如:
client = gdata.sites.client.SitesClient(source='yourCo-yourAppName-v1') client.ClientLogin('user@gmail.com', 'pa$$word', client.source);
提示:在您的应用首次成功对用户进行身份验证后,请将身份验证令牌存储在您的数据库中,以便日后重新使用。无需在每次运行应用时都提示用户输入密码。 如需了解详情,请参阅调用身份验证令牌。
如需详细了解如何在 Python 应用中使用 Dialogflow,请参阅将 Dialogflow 与 Google Data API 客户端库搭配使用。
站点 Feed
网站 Feed 可用于列出用户拥有或有权查看的 Google 协作平台。 该工具还可用于修改现有网站的名称。最后,对于 G Suite 网域,它还可用于创建和/或复制 。
列出网站
如需列出用户有权访问的网站,请使用客户端的 GetSiteFeed()
方法。该方法接受可选的
参数 uri
,您可以使用它来指定备用网站 Feed URI。默认情况下,GetSiteFeed()
使用在客户端对象上设置的网站名称和域。如需了解更多详情,请参阅使用入门部分
详细了解如何在客户端对象上设置这些值。
以下是获取已验证用户的网站列表的示例:
feed = client.GetSiteFeed() for entry in feed.entry: print '%s (%s)' % (entry.title.text, entry.site_name.text) if entry.summary.text: print 'description: ' + entry.summary.text if entry.FindSourceLink(): print 'this site was copied from site: ' + entry.FindSourceLink() print 'acl feed: %s\n' % entry.FindAclLink() print 'theme: ' + entry.theme.text
以上代码段会输出网站的标题、网站名称、复制来源网站及其 ACL Feed URI。
创建新网站
注意:此功能仅适用于 G Suite 网域。
您可以通过调用库的 CreateSite()
方法来配置新网站。
与 GetSiteFeed()
帮助程序类似,CreateSite()
也接受
可选参数 uri
,用于指定备用网站 Feed URI(在创建
(不是在 SitesClient
对象中设置的网域)下的网站)。
以下为创建主题为“可选广告”的新网站的示例并提供 商品名和(可选)说明:
client.domain = 'example2.com' # demonstrates creating a site under a different domain. entry = client.CreateSite('Title For My Site', description='Site to hold precious memories', theme='slate') print 'Site created! View it at: ' + entry.GetAlternateLink().href
以上请求将在 G Suite 网域 example2.com
下创建一个新网站。
因此,该网站的网址为 https://sites.google.com/a/example2.com/title-for-my-site。
如果网站成功创建,服务器将会返回 gdata.sites.data.SiteEntry
对象,其中填充了由服务器添加的元素:指向网站的链接、指向网站的 ACL 供稿的链接、
例如网站名称、标题、摘要等。
复制网站
注意:此功能仅适用于 G Suite 网域。
CreateSite()
也可用于复制现有网站。为此,请传入 source_site
关键字实参。
任何已复制的网站都具有此链接,可通过 entry.FindSourceLink()
访问。以下是复制网站的示例
在创建新网站部分中创建的网站:
copied_site = client.CreateSite('Copy of Title For My Site', description='My Copy', source_site=entry.FindSourceLink()) print 'Site copied! View it at: ' + copied_site.GetAlternateLink().href
要点:
- 只能复制经过身份验证的用户拥有的网站和网站模板。
- 也可以复制网站模板。如果“将此网站发布为模板”选项,则表示此网站是一个模板。设置。
- 您可以从其他网域复制网站,前提是您已被列为源网站的所有者。
更新网站的元数据
若要更新网站的标题或摘要,您需要一个包含相关网站的 SiteEntry
。这个
示例使用 GetEntry()
方法先提取 SiteEntry
,然后更改其标题、说明和类别标记:
uri = 'https://sites.google.com/feeds/site/example2.com/title-for-my-site' site_entry = client.GetEntry(uri, desired_class=gdata.sites.data.SiteEntry) site_entry.title.text = 'Better Title' site_entry.summary.text = 'Better Description' category_name = 'My Category' category = atom.data.Category( scheme=gdata.sites.data.TAG_KIND_TERM, term=category_name) site_entry.category.append(category) updated_site_entry = client.Update(site_entry) # To force the update, even if you do not have the latest changes to the entry: # updated_site_entry = client.Update(site_entry, force=True)
获取活动供稿
注意:您必须是网站的协作者或所有者才能访问此 Feed。 您的客户端必须使用 AuthSub、OAuth 或 ClientLogin 令牌进行身份验证。请参阅对 Google 协作平台服务进行身份验证。
您可以通过提取活动供稿来提取网站的近期活动(更改)。
通过该库的 GetActivityFeed()
方法,您可以访问此 Feed:
print "Fetching activity feed of '%s'...\n" % client.site feed = client.GetActivityFeed() for entry in feed.entry: print '%s [%s on %s]' % (entry.title.text, entry.Kind(), entry.updated.text)
调用 GetActivityFeed()
会返回一个包含所需列表的 gdata.sites.data.ActivityFeed
对象,
gdata.sites.data.ActivityEntry
。每个活动条目都包含有关
对网站所做的更改。
获取修订历史记录
注意:您必须是网站的协作者或所有者才能访问此 Feed。 您的客户端必须使用 AuthSub、OAuth 或 ClientLogin 令牌进行身份验证。请参阅对 Google 协作平台服务进行身份验证。
修订 Feed 提供任何内容条目的修订历史记录信息。GetRevisionFeed()
方法可用于提取指定内容条目的修订版本。该方法接受可选的 uri
接受 gdata.sites.data.ContentEntry
、内容条目的完整 URI 或内容条目 ID 的参数。
下例会查询内容 Feed,并提取第一个内容条目的修订版本 Feed:
print "Fetching content feed of '%s'...\n" % client.site content_feed = client.GetContentFeed() content_entry = content_feed.entry[0] print "Fetching revision feed of '%s'...\n" % content_entry.title.text revision_feed = client.GetRevisionFeed(content_entry) for entry in revision_feed.entry: print entry.title.text print ' new version on:\t%s' % entry.updated.text print ' view changes:\t%s' % entry.GetAlternateLink().href print ' current version:\t%s...\n' % str(entry.content.html)[0:100]
调用 GetRevisionFeed()
会返回一个包含所需列表的 gdata.sites.data.RevisionFeed
对象,
gdata.sites.data.RevisionEntry
。每个修订版本条目都包含
版本号,以及新版本的创建时间。
内容 Feed
检索内容 Feed
注意:内容 Feed 不一定会要求进行身份验证;具体取决于网站的共享权限。 如果网站为非公开网站,则您的客户端必须使用 AuthSub、OAuth 或 ClientLogin 令牌进行身份验证。请参阅 对 Google 协作平台服务进行身份验证。
内容 Feed 返回网站的最新内容。要访问它,可以调用库的
GetContentFeed()
方法,该方法接受可选的 uri
字符串参数来传递
自定义查询。
以下示例提取了整个内容 Feed 并输出了一些有趣的元素:
print "Fetching content feed of '%s'...\n" % client.site feed = client.GetContentFeed() for entry in feed.entry: print '%s [%s]' % (entry.title.text, entry.Kind()) # Common properties of all entry kinds. print ' content entry id: ' + entry.GetNodeId() print ' revision:\t%s' % entry.revision.text print ' updated:\t%s' % entry.updated.text if entry.page_name: print ' page name:\t%s' % entry.page_name.text if entry.content: print ' content\t%s...' % str(entry.content.html)[0:100] # Subpages/items will have a parent link. parent_link = entry.FindParentLink() if parent_link: print ' parent link:\t%s' % parent_link # The alternate link is the URL pointing to Google Sites. if entry.GetAlternateLink(): print ' view in Sites:\t%s' % entry.GetAlternateLink().href # If this entry is a filecabinet, announcementpage, etc., it will have a feed of children. if entry.feed_link: print ' feed of items:\t%s' % entry.feed_link.href print
提示:entry.Kind()
可用于确定条目的类型。
生成的 feed
对象是包含列表的 gdata.sites.data.ContentFeed
共 gdata.sites.data.ContentEntry
个。每个条目都代表 内的不同网页/项
网站,并且包含针对具体条目类型的元素。请参阅示例应用,更好地了解
每个条目种类中可用的一些属性。
内容 Feed 查询示例
您可以使用一些标准 Google Data API 查询参数来搜索内容 Feed。 以及传统版协作平台 API 特有的设置。如需了解更多详细信息和所支持参数的完整列表,请参阅 参考指南。
注意:本部分中的示例使用的是 gdata.sites.client.MakeContentFeedUri()
辅助方法
用于构建内容 Feed 的基本 URI。
检索特定条目种类
如需仅提取特定类型的条目,请使用 kind
参数。例如,此代码段仅返回 attachment
条目:
kind = 'webpage' print 'Fetching only %s entries' % kind uri = '%s?kind=%s' % (client.MakeContentFeedUri(), kind) feed = client.GetContentFeed(uri=uri)
如需返回多个类型,请使用英文逗号分隔每个 kind
。例如,此代码段会返回 filecabinet
和
listpage
个条目:
kind = ','.join(['filecabinet', 'listpage']) print 'Fetching only %s entries' % kind uri = '%s?kind=%s' % (client.MakeContentFeedUri(), kind) feed = client.GetContentFeed(uri=uri)
按路径检索网页
如果您知道 Google 网站中某个网页的相对路径,可以使用 path
参数提取该特定网页。
本示例将返回位于
http://sites.google.com/domainName/siteName/path/to/the/page
:
path = '/path/to/the/page' print 'Fetching page by its path: ' + path uri = '%s?path=%s' % (client.MakeContentFeedUri(), path) feed = client.GetContentFeed(uri=uri)
检索父页面下的所有条目
如果您知道某个网页的内容条目 ID(例如下例中的“1234567890”),则可以使用 parent
参数
来获取其所有子条目(如果有):
parent = '1234567890' print 'Fetching all children of parent entry: ' + parent uri = '%s?parent=%s' % (client.MakeContentFeedUri(), parent) feed = client.GetContentFeed(uri=uri)
如需了解其他参数,请参阅参考指南。
创建内容
注意:在为网站创建内容之前,请确保您已在客户端中设置您的网站。client.site = "siteName"
您可以使用 CreatePage()
创建新内容(网页、列表页、文件箱式页面、公告页等)。
此方法的第一个参数应该是要创建的网页类型,后跟标题和 HTML 内容。
如需查看支持的节点类型的列表,请参阅参考指南中的 kind
参数。
创建新的内容 / 页面
此示例会在顶级页面下创建一个新的 webpage
,其中包含一些用于页面正文的 XHTML,
并将标题标题设置为“New WebPage Title”:
entry = client.CreatePage('webpage', 'New WebPage Title', html='<b>HTML content</b>') print 'Created. View it at: %s' % entry.GetAlternateLink().href
如果请求成功,entry
会包含在服务器上创建的条目的副本,作为 gdata.sites.gdata.ContentEntry
。
如需创建在创建时填充的更复杂的条目种类(例如,带有列标题的 listpage
),您需要创建
手动 gdata.sites.data.ContentEntry
,填写所需的属性,然后调用 client.Post()
。
在自定义网址路径下创建项/网页
默认情况下,上述示例会在网址下方创建
http://sites.google.com/domainName/siteName/new-webpage-title
和
网页标题为“新网页标题”。也就是说,系统会将网址的标题标准化为 new-webpage-title
。
若要自定义页面的网址路径,您可以在内容条目上设置 page_name
属性。CreatePage()
帮助程序
将其作为可选的关键字参数提供。
本示例创建了一个标题为“File Storage”的新 filecabinet
页面,但创建了该页面
在网址 http://sites.google.com/domainName/siteName/files
下方
(而非 http://sites.google.com/domainName/siteName/file-storage
)
指定 page_name
属性。
entry = client.CreatePage('filecabinet', 'File Storage', html='<b>HTML content</b>', page_name='files') print 'Created. View it at: ' + entry.GetAlternateLink().href
在命名网页网址路径时,服务器会遵循以下优先规则:
page_name
(如果存在)。必须满足a-z, A-Z, 0-9, -, _
。title
,如果页面名称不存在,则不得为 null。规范化是去除多余空格并将其收缩为“-”和 移除与a-z, A-Z, 0-9, -, _
不匹配的字符。
创建子页面
如需在父页面下创建子页面(子页面),请使用 CreatePage()
的 parent
关键字参数。
parent
可以是 gdata.sites.gdata.ContentEntry
,也可以是表示
内容条目的完整自 ID。
下例会在内容 Feed 中查询 announcementpage
,并在找到的第一个 announcement
下创建一个新的 announcement
:
uri = '%s?kind=%s' % (client.MakeContentFeedUri(), 'announcementpage') feed = client.GetContentFeed(uri=uri) entry = client.CreatePage('announcement', 'Party!!', html='My place, this weekend', parent=feed.entry[0]) print 'Posted!'
上传文件
与在 Google 协作平台中一样,该 API 支持将附件上传至文件箱式页面或父页面。必须上传附件
父级页面。因此,您必须在尝试上传的 ContentEntry
上设置父级链接。如需了解详情,请参阅创建子页面。
客户端库的 UploadAttachment()
方法提供用于上传附件的接口。
正在上传附件
此示例将 PDF 文件上传到用户内容 Feed 中找到的第一个 filecabinet
。
该附件的标题为“新员工手册”以及(可选)说明“HR 包”。
uri = '%s?kind=%s' % (client.MakeContentFeedUri(),'filecabinet') feed = client.GetContentFeed(uri=uri) attachment = client.UploadAttachment('/path/to/file.pdf', feed.entry[0], content_type='application/pdf', title='New Employee Handbook', description='HR Packet') print 'Uploaded. View it at: %s' % attachment.GetAlternateLink().href
如果上传成功,attachment
会包含在服务器上创建的附件的副本。
将附件上传到文件夹
Google 协作平台支持文件夹中的文件箱式页面。UploadAttachment()
提供了一个额外的关键字,
参数 folder_name
,可用于将附件上传到 filecabinet
文件夹。只需指定该文件夹的名称:
import gdata.data ms = gdata.data.MediaSource(file_path='/path/to/file.pdf', content_type='application/pdf') attachment = client.UploadAttachment(ms, feed.entry[0], title='New Employee Handbook', description='HR Packet', folder_name='My Folder')
请注意,此示例将 gdata.data.MediaSource
对象传递给 UploadAttachment()
或文件路径中的文件它也不会传递内容类型。而是在 MediaSource 对象中指定内容类型。
Web 附件
Web 附件是一种特殊类型的附件。从本质上讲,这些文件是指向网络上其他文件的链接
您可以将其添加到自己的filecabinet
商品详情中。此功能类似于按网址添加文件上传方法。
注意:网络附件只能在 filecabinet
下创建。但不能上传到其他类型的网页。
此示例会在用户的内容 Feed 中找到的第一个 filecabinet
下创建网络附件。
其标题和(可选)说明设置为“GoogleLogo”“nice color”和“nice color”分别。
uri = '%s?kind=%s' % (client.MakeContentFeedUri(),'filecabinet') feed = client.GetContentFeed(uri=uri) parent_entry = feed.entry[0] image_url = 'http://www.google.com/images/logo.gif' web_attachment = client.CreateWebAttachment(image_url, 'image/gif', 'GoogleLogo', parent_entry, description='nice colors') print 'Created!'
此调用会创建一个指向“http://www.google.com/images/logo.gif”的图片的链接。在 filecabinet
中。
更新内容
更新网页的元数据和/或 HTML 内容
任何条目种类的元数据(标题、pageName 等)和页面内容均可修改
使用客户端的 Update()
方法。
以下示例展示了如何更新 listpage
并进行了以下更改:
- 标题已修改为“已更新标题”
- 该网页的 HTML 内容会更新为“已更新的 HTML 内容”
- 列表的第一列标题将更改为“所有者”
uri = '%s?kind=%s' % (client.MakeContentFeedUri(),'listpage') feed = client.GetContentFeed(uri=uri) old_entry = feed.entry[0] # Update the listpage's title, html content, and first column's name. old_entry.title.text = 'Updated Title' old_entry.content.html = 'Updated HTML Content' old_entry.data.column[0].name = 'Owner' # You can also change the page's webspace page name on an update. # old_entry.page_name = 'new-page-path' updated_entry = client.Update(old_entry) print 'List page updated!'
替换附件内容和元数据
您可以创建新的 MediaSource
对象来替换附件的文件内容
替换为新文件内容,并调用客户端的 Update()
方法。附件的
元数据(如标题和说明)也可以更新,或者只更新元数据。
以下示例演示了如何同时更新文件内容和元数据:
import gdata.data # Load the replacement content in a MediaSource. Also change the attachment's title and description. ms = gdata.data.MediaSource(file_path='/path/to/replacementContent.doc', content_type='application/msword') existing_attachment.title.text = 'Updated Document Title' existing_attachment.summary.text = 'version 2.0' updated_attachment = client.Update(existing_attachment, media_source=ms) print "Attachment '%s' changed to '%s'" % (existing_attachment.title.text, updated_attachment.title.text)
删除内容
要从 Google 协作平台中移除网页或项,请先检索内容条目,然后调用客户端的 Delete()
方法。
client.Delete(content_entry)
您也可以向 Delete()
方法传递内容条目的 edit
链接并/或强制删除:
# force=True sets the If-Match: * header instead of using the entry's ETag. client.Delete(content_entry.GetEditLink().href, force=True)
要详细了解 ETag,请参阅 Google Data API 参考指南。
下载附件
每个 attachment
条目都包含一个内容 src
链接,可用于下载文件内容。
Google 协作平台客户端包含可通过以下链接访问和下载文件的辅助方法:DownloadAttachment()
。
它的第一个参数接受 gdata.sites.data.ContentEntry
或下载 URI,以及用于保存附件的文件路径
用作第二个参数
以下示例提取特定附件条目(通过查询其 self
链接)并将文件下载到指定路径:
uri = 'https://sites.google.com/feeds/content/site/siteName/1234567890' attachment = client.GetEntry(uri, desired_class=gdata.sites.data.ContentEntry) print "Downloading '%s', a %s file" % (attachment.title.text, attachment.content.type) client.DownloadAttachment(attachment, '/path/to/save/test.pdf') print 'Downloaded!'
应用开发者需负责指定对附件内容类型有意义的文件扩展名。内容类型
可在 entry.content.type
中找到。
在某些情况下,您可能无法将文件下载到磁盘(例如,如果您的应用在 Google App Engine 中运行)。
对于这些情况,请使用 _GetFileContent()
提取文件内容并将其存储在内存中。
此示例下载内容是回忆中的附件。
try: file_contents = client._GetFileContent(attachment.content.src) # TODO: Do something with the file contents except gdata.client.RequestError, e: raise e
ACL 供稿
共享权限 (ACL) 概览
ACL 供稿中的每个 ACL 条目代表一个特定实体的访问角色,这些实体可以是用户、用户群组、网域 或默认访问权限(即公共站点)。系统只会为拥有明确访问权限的实体显示条目 - 系统会显示一个条目 每个电子邮件地址面板。因此,系统不会显示网域管理员 即使他们对某网站拥有隐式访问权限,也是如此。
角色
角色元素表示实体可以拥有的访问权限级别。gAcl:role
元素有以下四个可能的值:
- Reader - 查看者(等同于只读访问权限)。
- writer - 协作者(等同于读/写权限)。
- owner - 通常是网站管理员(相当于读/写权限)。
范围
范围元素表示具有此访问权限级别的实体。gAcl:scope
元素有四种可能的类型:
- user - 电子邮件地址值,如“user@gmail.com”。
- group - Google 群组电子邮件地址,例如“group@domain.com”。
- domain - G Suite 域名,例如“domain.com”。
- default - 只有一个可能的“default”类型范围(该范围没有任何值)
(例如
<gAcl:scope type="default">
)。此特定范围控制任何用户默认拥有的访问权限 放在公开网站上。
注意:域名不能包含 gAcl:role
值
设为“所有者”他们只能是读者或作者。
检索 ACL 供稿
ACL Feed 可用于控制网站的共享权限,并且可通过 GetAclFeed()
方法提取。
以下示例提取 SitesClient
对象中当前设置的网站的 ACL Feed,
并输出权限条目:
print "Fetching acl permissions of site '%s'...\n" % client.site feed = client.GetAclFeed() for entry in feed.entry: print '%s (%s) - %s' % (entry.scope.value, entry.scope.type, entry.role.value)
查询成功后,feed
将成为包含以下内容的 gdata.sites.data.AclFeed
对象:
gdata.sites.data.AclEntry
的商品详情。
如果您使用的是 SiteFeed 中的条目,则每个 SiteEntry
都包含指向其 ACL Feed 的链接。
例如,以下代码段会提取用户网站 Feed 中的第一个网站,并查询其 ACL Feed:
feed = client.GetSiteFeed() site_entry = feed.entry[0] print "Fetching acl permissions of site '%s'...\n" % site_entry.site_name.text feed = client.GetAclFeed(uri=site_entry.FindAclLink())
共享网站
注意:某些共享 ACL 只有在网域进行了配置的情况下才能实现 授予此类权限(例如,如果启用了 G Suite 网域与网域外的用户共享功能等)。
如需使用 API 共享 Google 网站,请使用所需的 gdata.sites.gdata.AclEntry
创建
gdata.acl.data.AclScope
和 gdata.acl.data.AclRole
值。请参阅
ACL Feed 概览部分,查看可能的 AclScope
和 AclRoles
值。
此示例向用户“user@example.com”授予对网站的读取权限:
import gdata.acl.data scope = gdata.acl.data.AclScope(value='user@example.com', type='user') role = gdata.acl.data.AclRole(value='reader') acl = gdata.sites.gdata.AclEntry(scope=scope, role=role) acl_entry = client.Post(acl, client.MakeAclFeedUri()) print "%s %s added as a %s" % (acl_entry.scope.type, acl_entry.scope.value, acl_entry.role.value)
群组和网域级别的共享
与与单个用户共享网站类似,您可以通过
Google 群组或 G Suite 网域。下面列出了必要的 scope
值。
共享到群组电子邮件地址:
scope = gdata.acl.data.AclScope(value='group_name@example.com', type='group')
与整个网域共享:
scope = gdata.acl.data.AclScope(value='example.com', type='domain')
只有 G Suite 网域以及托管网站的网域支持网域级共享。 例如,http://sites.google.com/a/domain1.com/siteA 只能与 domain1.com 共享整个协作平台,而非 domain2.com。会 未托管在 G Suite 网域上(例如 http://sites.google.com/site/siteB),则无法邀请网域。
修改共享权限
要访问网站上的现有共享权限,请先提取相关的 AclEntry
,然后修改权限
,然后调用客户端的 Update()
方法来修改服务器上的 ACL。
此示例修改了前面共享网站部分中的 acl_entry
,
方法是更新“user@example.com”成为一名作家(协作者):
acl_entry.role.value = 'writer' updated_acl = client.Update(acl_entry) # To force the update, even if you do not have the latest changes to the entry: # updated_acl = client.Update(acl_entrys, force=True)
要详细了解 ETag,请参阅 Google Data API 参考指南。
正在移除共享权限
如需移除共享权限,请先检索 AclEntry
,然后调用客户端的 Delete()
方法。
client.Delete(acl_entry)
您也可以向 Delete()
方法传递 acl 条目的 edit
链接并/或强制删除:
# force=True sets the If-Match: * header instead of using the entry's ETag. client.Delete(acl_entry.GetEditLink().href, force=True)
要详细了解 ETag,请参阅 Google Data API 参考指南。
特殊主题
重新检索供稿或条目
如果要检索以前检索过的供稿或条目,可以告诉系统, 自上次检索列表或条目后,列表或条目才发生变化。
如需执行此类条件式检索,请将 ETag 值传递给 GetEntry()
。例如,如果您当前有一个 entry
对象:
import gdata.client try: entry = client.GetEntry(entry.GetSelfLink().href, desired_class=gdata.sites.data.ContentEntry, etag=entry.etag) except gdata.client.NotModified, error: print 'You have the latest copy of this entry' print error
如果 GetEntry()
抛出 gdata.client.NotModified
异常,则该条目的
ETag 与服务器上的版本匹配,这意味着您拥有最新的副本。
但是,如果其他客户端/用户进行了修改,则 entry
中会返回新条目
并且不会抛出任何异常
要详细了解 ETag,请参阅 Google Data API 参考指南。