Python 가이드

중요: 이 문서는 2012년 이전에 작성되었습니다. 이 문서에 설명된 인증 옵션(OAuth 1.0, AuthSub, ClientLogin)은 2012년 4월 20일부터 지원 중단되었으며 더 이상 사용할 수 없습니다. 가능한 한 빨리 OAuth 2.0으로 이전하는 것이 좋습니다.

Google Sites Data API를 사용하면 클라이언트 애플리케이션이 Google Sites 내의 콘텐츠에 액세스하고, 게시하고, 수정할 수 있습니다. 또한 클라이언트 애플리케이션에서 최근 활동 목록을 요청하고 업데이트 기록을 가져오며 첨부파일을 다운로드할 수 있습니다.

이 가이드에서는 Sites Data API의 기능에 관한 배경 정보를 제공할 뿐만 아니라 Python 클라이언트 라이브러리를 사용하여 API와 상호작용하는 예시를 제공합니다. 클라이언트 라이브러리 설정 방법은 Google Data Python 클라이언트 라이브러리 시작하기를 참고하세요. Python 클라이언트 라이브러리가 기존 Sites API와 상호작용하는 데 사용하는 기본 프로토콜에 대해 자세히 알아보려면 프로토콜 가이드를 참고하세요.

잠재고객

이 문서는 Google 데이터 Python 클라이언트 라이브러리를 사용하여 Google Sites와 상호작용하는 클라이언트 애플리케이션을 작성하려는 개발자를 대상으로 합니다.

시작하기

Python 클라이언트 라이브러리를 사용하려면 Python 2.2 이상과 DependencyModules 위키 페이지에 나열된 모듈이 필요합니다. 클라이언트 라이브러리를 다운로드한 후 클라이언트 설치 및 사용에 대한 도움말은 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]

필수 플래그가 제공되지 않으면 앱에서 해당 값을 입력하라는 메시지를 표시합니다. 이 샘플을 사용하면 기존 Sites API를 사용하는 방법을 보여주는 여러 작업을 실행할 수 있습니다. 따라서 특정 작업 (예: 콘텐츠 수정)을 수행하려면 인증해야 합니다. 또한 프로그램에서 AuthSub, OAuth 또는 ClientLogin을 통해 인증하라는 메시지를 표시합니다.

이 가이드의 예시를 자체 코드에 포함하려면 다음 import 문이 필요합니다.

import atom.data
import gdata.sites.client
import gdata.sites.data

기존 Sites API에 대한 클라이언트 연결을 나타내는 SitesClient 객체도 설정해야 합니다. 애플리케이션 이름과 사이트의 웹스페이스 이름(URL에서 가져옴)을 전달합니다.

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 객체를 만들었다고 가정합니다.

기존 사이트 도구 API 인증

Python 클라이언트 라이브러리는 공개 피드 또는 비공개 피드와 함께 사용할 수 있습니다. Sites Data API는 사이트의 권한과 수행하려는 작업에 따라 비공개 및 공개 피드에 대한 액세스를 제공합니다. 예를 들어 공개 사이트의 콘텐츠 피드를 읽을 수는 있지만 업데이트할 수는 없으며, 이를 위해서는 인증된 클라이언트가 필요합니다. ClientLogin 사용자 이름/비밀번호 인증, AuthSub 또는 OAuth를 통해 이를 수행할 수 있습니다.

AuthSub, OAuth, ClientLogin에 관한 자세한 내용은 Google Data API 인증 개요를 참고하세요.

웹 애플리케이션을 위한 AuthSub

웹 애플리케이션에 대한 AuthSub 인증은 사용자를 Google 또는 G Suite 계정으로 인증해야 하는 클라이언트 애플리케이션에서 사용해야 합니다. 운영자는 Google Sites 사용자의 사용자 이름과 비밀번호에 액세스할 필요가 없습니다. AuthSub 토큰만 있으면 됩니다.

웹 애플리케이션에 AuthSub 통합 안내 보기

일회용 토큰 요청

사용자가 애플리케이션을 처음 방문할 때 인증을 받아야 합니다. 일반적으로 개발자는 사용자를 인증하고 문서에 대한 액세스를 요청하기 위해 사용자를 AuthSub 승인 페이지로 안내하는 텍스트와 링크를 인쇄합니다. Google 데이터 Python 클라이언트 라이브러리는 이 URL을 생성하는 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 핸들러가 사용하는 쿼리 매개변수에 해당하는 여러 매개변수를 사용합니다.

  • 다음 URL: 사용자가 계정에 로그인하고 액세스 권한을 부여한 후 Google에서 리디렉션할 URL입니다. 위 예에서는 http://www.example.com/myapp.py입니다.
  • 범위https://sites.google.com/feeds/
  • secure. 토큰이 보안 및 등록 모드에서 사용될지 여부를 나타내는 불리언입니다. 위 예에서는 True입니다.
  • session: 일회용 토큰이 나중에 세션 토큰으로 교환될지 여부를 나타내는 두 번째 불리언. 위 예에서는 True입니다.

세션 토큰으로 업그레이드

Google Data API 클라이언트 라이브러리에서 AuthSub 사용을 참고하세요.

세션 토큰에 대한 정보 검색

Google Data API 클라이언트 라이브러리에 AuthSub 사용을 참조하세요.

세션 토큰 취소

Google Data API 클라이언트 라이브러리에서 AuthSub 사용을 참고하세요.

도움말: 애플리케이션이 장기 세션 토큰을 성공적으로 획득한 후에는 나중에 사용할 수 있도록 데이터베이스에 해당 토큰을 저장합니다. 애플리케이션을 실행할 때마다 사용자를 AuthSub로 다시 전송할 필요는 없습니다. client.auth_token = gdata.gauth.AuthSubToken(TOKEN_STR)를 사용하여 클라이언트에 기존 토큰을 설정합니다.

웹 또는 설치된/모바일 애플리케이션용 OAuth

OAuth는 AuthSub의 대안으로 사용할 수 있으며 웹 애플리케이션용입니다. OAuth는 모든 데이터 요청을 디지털 서명해야 하고 도메인을 등록해야 한다는 점에서 AuthSub의 보안 및 등록된 모드를 사용하는 것과 유사합니다.

설치된 애플리케이션에 OAuth를 통합하는 방법에 대한 안내 보기

요청 토큰 가져오기

Google 데이터 API 클라이언트 라이브러리에 OAuth 사용을 참조하세요.

요청 토큰 승인

Google Data API 클라이언트 라이브러리에서 OAuth 사용을 참고하세요.

액세스 토큰으로 업그레이드

Google Data API 클라이언트 라이브러리에서 OAuth 사용을 참고하세요.

도움말: 애플리케이션에서 OAuth 액세스 토큰을 가져오면 나중에 사용할 수 있도록 데이터베이스에 해당 토큰을 저장합니다. 애플리케이션을 실행할 때마다 사용자를 OAuth를 통해 다시 전송할 필요는 없습니다. client.auth_token = gdata.oauth.OAuthToken(TOKEN_STR, TOKEN_SECRET)를 사용하여 클라이언트에 기존 토큰을 설정합니다.

설치된/모바일 애플리케이션의 ClientLogin

ClientLogin은 사용자를 Google 계정에 인증해야 하는 설치된 애플리케이션 또는 모바일 애플리케이션에서 사용해야 합니다. 처음 실행 시 애플리케이션은 사용자에게 사용자 이름/비밀번호를 요청합니다. 후속 요청에서 인증 토큰이 참조됩니다.

설치된 애플리케이션에 ClientLogin을 통합하기 위한 안내 보기

ClientLogin을 사용하려면 GDClient에서 상속된 SitesClient 객체의 ClientLogin() 메서드를 호출합니다. 클라이언트가 대신 요청을 수행하는 사용자의 이메일 주소와 비밀번호를 지정합니다. 예를 들면 다음과 같습니다.

client = gdata.sites.client.SitesClient(source='yourCo-yourAppName-v1')
client.ClientLogin('user@gmail.com', 'pa$$word', client.source);

: 애플리케이션에서 사용자를 처음으로 인증한 후에는 데이터베이스에 인증 토큰을 저장하여 나중에 사용할 수 있도록 호출합니다. 애플리케이션을 실행할 때마다 사용자에게 비밀번호를 묻지 않아도 됩니다. 자세한 내용은 인증 토큰 다시 호출을 참조하세요.

Python 애플리케이션에서 ClientLogin을 사용하는 방법에 관한 자세한 내용은 Google Data API 클라이언트 라이브러리에서 ClientLogin 사용을 참고하세요.

맨 위로

사이트 피드

사이트 피드는 사용자가 소유하거나 보기 권한이 있는 Google Sites를 나열하는 데 사용할 수 있습니다. 기존 사이트의 이름을 수정하는 데도 사용할 수 있습니다. 마지막으로 G Suite 도메인의 경우 전체 사이트를 만들거나 복사하는 데도 사용할 수 있습니다.

등록처 사이트

사용자가 액세스할 수 있는 사이트를 나열하려면 클라이언트의 GetSiteFeed() 메서드를 사용합니다. 이 메서드는 대체 사이트 피드 URI를 지정하는 데 사용할 수 있는 선택적 인수 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 피드 URI를 출력합니다.

새 사이트 만들기

참고: 이 기능은 G Suite 도메인에서만 사용할 수 있습니다.

라이브러리의 CreateSite() 메서드를 호출하여 새 사이트를 프로비저닝할 수 있습니다. GetSiteFeed() 도우미와 마찬가지로 CreateSite()는 선택적 인수 uri도 허용합니다. 이 인수는 대체 사이트 피드 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 아래에 새 사이트를 만듭니다. 따라서 사이트의 URL은 https://sites.google.com/a/example2.com/title-for-my-site입니다.

사이트가 성공적으로 생성되면 서버는 사이트 링크, 사이트 ACL 피드 링크, 사이트 이름, 제목, 요약 등 서버에서 추가한 요소로 채워진 gdata.sites.data.SiteEntry 객체를 응답으로 반환합니다.

사이트 복사

참고: 이 기능은 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

중요사항:

  • 인증된 사용자가 소유한 사이트와 사이트 템플릿만 복사할 수 있습니다.
  • 사이트 템플릿도 복사할 수 있습니다. Google Sites 설정 페이지에서 '이 사이트를 템플릿으로 게시' 설정이 선택된 사이트는 템플릿입니다.
  • 소스 사이트에 소유자로 등록되어 있는 경우 다른 도메인에서 사이트를 복사할 수 있습니다.

사이트의 메타데이터 업데이트

사이트의 제목이나 요약을 업데이트하려면 해당 사이트가 포함된 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)

맨 위로

활동 피드 가져오기

참고: 이 피드에 액세스하려면 사이트의 공동작업자 또는 소유자여야 합니다. 클라이언트는 AuthSub, OAuth 또는 ClientLogin 토큰을 사용하여 인증해야 합니다. Sites 서비스 인증을 참고하세요.

활동 피드를 가져오면 사이트의 최근 활동 (변경사항)을 가져올 수 있습니다. lib의 GetActivityFeed() 메서드는 이 피드에 대한 액세스를 제공합니다.

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.ActivityEntry 목록이 포함된 gdata.sites.data.ActivityFeed 객체가 반환됩니다. 각 활동 항목에는 사이트에 적용된 변경사항에 대한 정보가 포함됩니다.

맨 위로

업데이트 기록을 가져오는 중

참고: 이 피드에 액세스하려면 사이트의 공동작업자 또는 소유자여야 합니다. 클라이언트는 AuthSub, OAuth 또는 ClientLogin 토큰을 사용하여 인증해야 합니다. Sites 서비스 인증을 참고하세요.

업데이트 피드는 모든 콘텐츠 항목의 업데이트 기록에 관한 정보를 제공합니다. GetRevisionFeed() 메서드를 사용하여 지정된 콘텐츠 항목의 버전을 가져올 수 있습니다. 이 메서드는 gdata.sites.data.ContentEntry, 콘텐츠 항목의 전체 URI 또는 콘텐츠 항목 ID를 허용하는 선택적 uri 매개변수를 사용합니다.

이 예에서는 콘텐츠 피드를 쿼리하고 첫 번째 콘텐츠 항목의 버전 피드를 가져옵니다.

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.RevisionEntry 목록이 포함된 gdata.sites.data.RevisionFeed 객체가 반환됩니다. 각 버전 항목에는 해당 버전의 콘텐츠, 버전 번호, 새 버전이 생성된 시기와 같은 정보가 포함됩니다.

맨 위로

콘텐츠 피드

콘텐츠 피드 가져오기

참고: 사이트의 공유 권한에 따라 콘텐츠 피드에 인증이 필요할 수도 있고 필요하지 않을 수도 있습니다. 사이트가 비공개인 경우 클라이언트는 AuthSub, OAuth 또는 ClientLogin 토큰을 사용하여 인증해야 합니다. Sites 서비스 인증을 참고하세요.

콘텐츠 피드는 사이트의 최신 콘텐츠를 반환합니다. 이 인스턴스에는 lib의 GetContentFeed() 메서드를 호출하여 액세스할 수 있습니다. 이 메서드는 맞춤설정된 쿼리를 전달하기 위한 선택적 uri 문자열 매개변수를 취합니다.

다음은 전체 콘텐츠 피드를 가져와 흥미로운 요소를 출력하는 예입니다.

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.ContentEntry 목록이 포함된 gdata.sites.data.ContentFeed입니다. 각 항목은 사용자 사이트 내의 서로 다른 페이지/항목을 나타내며 항목 유형에 따라 고유한 요소가 있습니다. 각 항목 유형에서 사용할 수 있는 일부 속성을 자세히 알아보려면 샘플 애플리케이션을 참고하세요.

맨 위로

콘텐츠 피드 쿼리 예시

표준 Google Data API 쿼리 매개변수 중 일부와 기존 Sites API에만 해당하는 매개변수를 사용하여 콘텐츠 피드를 검색할 수 있습니다. 자세한 내용과 지원되는 매개변수의 전체 목록은 참조 가이드를 참고하세요.

참고: 이 섹션의 예에서는 gdata.sites.client.MakeContentFeedUri() 도우미 메서드를 사용하여 콘텐츠 피드의 기본 URI를 구성합니다.

특정 항목 종류 검색

특정 유형의 항목만 가져오려면 kind 매개변수를 사용하세요. 예를 들어 다음 스니펫은 attachment 항목만 반환합니다.

kind = 'webpage'

print 'Fetching only %s entries' % kind
uri = '%s?kind=%s' % (client.MakeContentFeedUri(), kind)
feed = client.GetContentFeed(uri=uri)

두 개 이상의 유형을 반환하려면 각 kind를 쉼표로 구분합니다. 예를 들어 다음 스니펫은 filecabinetlistpage 항목을 반환합니다.

kind = ','.join(['filecabinet', 'listpage'])

print 'Fetching only %s entries' % kind
uri = '%s?kind=%s' % (client.MakeContentFeedUri(), kind)
feed = client.GetContentFeed(uri=uri)

경로로 페이지 검색

Google Sites로 만든 페이지의 상대 경로를 알고 있다면 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을 포함하며 제목을 '새 웹페이지 제목'으로 설정합니다.

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()를 호출해야 합니다.

커스텀 URL 경로에서 항목/페이지 만들기

기본적으로 위 예시는 http://sites.google.com/domainName/siteName/new-webpage-title URL 아래에 생성되며 페이지 제목은 '새 웹페이지 제목'입니다. 즉, 제목은 URL의 new-webpage-title로 정규화됩니다. 페이지의 URL 경로를 맞춤설정하려면 콘텐츠 항목에서 page_name 속성을 설정하면 됩니다. CreatePage() 도우미는 이를 선택적 키워드 인수로 제공합니다.

이 예에서는 제목이 '파일 저장소'인 새 filecabinet 페이지를 만들지만 page_name 속성을 지정하여 http://sites.google.com/domainName/siteName/file-storage 대신 http://sites.google.com/domainName/siteName/files URL 아래에 페이지를 만듭니다.

entry = client.CreatePage('filecabinet', 'File Storage', html='<b>HTML content</b>', page_name='files')
print 'Created. View it at: ' + entry.GetAlternateLink().href

서버는 페이지의 URL 경로 이름을 지정할 때 다음 우선순위 규칙을 사용합니다.

  1. page_name(있는 경우) a-z, A-Z, 0-9, -, _을 충족해야 합니다.
  2. title, 페이지 이름이 없는 경우 null이 아니어야 합니다. 정규화는 공백을 자르고 '-'로 축소하며 a-z, A-Z, 0-9, -, _와 일치하지 않는 문자를 삭제하는 것입니다.

하위 페이지 만들기

상위 페이지 아래에 하위 페이지(하위 요소)를 만들려면 CreatePage()parent 키워드 인수를 사용합니다. parentgdata.sites.gdata.ContentEntry이거나 콘텐츠 항목의 전체 자체 ID를 나타내는 문자열일 수 있습니다.

이 예에서는 콘텐츠 피드에서 announcementpage를 쿼리하고 발견된 첫 번째 항목 아래에 새 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 Sites와 마찬가지로 API는 자료실 페이지 또는 상위 페이지로의 첨부파일을 업로드할 수 있도록 지원합니다. 첨부파일은 상위 페이지에 업로드해야 합니다. 따라서 업로드하려는 ContentEntry에 상위 링크를 설정해야 합니다. 자세한 내용은 하위 페이지 만들기를 참고하세요.

클라이언트 라이브러리의 UploadAttachment() 메서드는 첨부파일 업로드를 위한 인터페이스를 제공합니다.

첨부파일 업로드 중

이 예에서는 사용자의 콘텐츠 피드에서 발견된 첫 번째 filecabinet에 PDF 파일을 업로드합니다. 첨부파일은 '신규 직원 핸드북'이라는 제목과 '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 Sites의 파일 캐비닛은 폴더를 지원합니다. UploadAttachment()filecabinet 폴더에 첨부파일을 업로드하는 데 사용할 수 있는 추가 키워드 인수 folder_name를 제공합니다. 해당 폴더의 이름을 지정하기만 하면 됩니다.

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 객체에 지정됩니다.

웹 첨부파일

웹 첨부파일은 특별한 종류의 첨부파일입니다. filecabinet 등록정보에 추가할 수 있는 웹의 다른 파일로 연결되는 링크입니다. 이 기능은 Google Sites UI의 'URL로 파일 추가' 업로드 방법과 유사합니다.

참고: 웹 첨부파일은 filecabinet 아래에서만 만들 수 있습니다. 다른 유형의 페이지에는 업로드할 수 없습니다.

이 예에서는 사용자의 콘텐츠 피드에서 발견된 첫 번째 filecabinet 아래에 웹 첨부파일을 만듭니다. 제목과 (선택사항) 설명은 각각 'GoogleLogo' 및 'nice colors'로 설정됩니다.

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!'

이 호출은 filecabinet의 'http://www.google.com/images/logo.gif'에 있는 이미지를 가리키는 링크를 만듭니다.

맨 위로



콘텐츠 업데이트

페이지의 메타데이터 및/또는 html 콘텐츠 업데이트

모든 항목 유형의 메타데이터(title, 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 링크가 포함되어 있습니다. 사이트 클라이언트에는 이 링크(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 항목은 사용자, 사용자 그룹, 도메인 또는 기본 액세스(공개 사이트) 중 특정 항목의 액세스 역할을 나타냅니다. 항목은 명시적인 액세스 권한이 있는 법인에 대해서만 표시됩니다. Google Sites UI의 공유 화면에 있는 '액세스 권한이 있는 사용자' 패널의 이메일 주소별로 항목이 하나씩 표시됩니다. 따라서 도메인 관리자는 사이트에 대한 암시적 액세스 권한이 있더라도 표시되지 않습니다.

역할

역할 요소는 항목이 가질 수 있는 액세스 수준을 나타냅니다. gAcl:role 요소의 가능한 값은 네 가지가 있습니다.

  • reader: 뷰어(읽기 전용 액세스와 동일)입니다.
  • writer: 공동작업자(읽기/쓰기 액세스와 동일)
  • 소유자: 일반적으로 사이트 관리자(읽기/쓰기 액세스와 동일)

범위

범위 요소는 이 액세스 수준을 가진 항목을 나타냅니다. gAcl:scope 요소에는 다음과 같은 4가지 유형이 있습니다.

  • user — 이메일 주소 값(예: 'user@gmail.com')입니다.
  • group: Google 그룹 이메일 주소(예: 'group@domain.com')입니다.
  • domain — G Suite 도메인 이름(예: 'domain.com')입니다.
  • default — 값이 없는 'default' 유형의 가능한 범위는 하나만 있습니다(예: <gAcl:scope type="default">). 이 특정 범위는 공개 사이트에서 사용자가 기본적으로 갖는 액세스 권한을 제어합니다.

참고: 도메인에는 gAcl:role 값을 '소유자' 액세스 권한으로 설정할 수 없으며 리더 또는 작성자만 가능합니다.

ACL 피드 검색

ACL 피드는 사이트의 공유 권한을 제어하는 데 사용할 수 있으며 GetAclFeed() 메서드를 사용하여 가져올 수 있습니다.

다음 예에서는 현재 SitesClient 객체에 설정된 사이트의 ACL 피드를 가져와 권한 항목을 출력합니다.

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)

쿼리가 성공하면 feedgdata.sites.data.AclEntry 목록이 포함된 gdata.sites.data.AclFeed 객체가 됩니다.

SiteFeed에서 항목으로 작업하는 경우 각 SiteEntry에는 ACL 피드에 대한 링크가 포함됩니다. 예를 들어 다음 스니펫은 사용자 사이트 피드의 첫 번째 사이트를 가져와서 ACL 피드를 쿼리합니다.

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 Sites를 공유하려면 원하는 gdata.acl.data.AclScopegdata.acl.data.AclRole 값으로 gdata.sites.gdata.AclEntry를 만듭니다. 가능한 AclScopeAclRoles 값은 ACL 피드 개요 섹션을 참고하세요.

다음은 '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는 domain2.com이 아닌 domain1.com과만 전체 사이트를 공유할 수 있습니다. G Suite 도메인에 호스팅되지 않은 사이트(예: http://sites.google.com/site/siteB)는 도메인을 초대할 수 없습니다.

공유 권한 수정하기

사이트의 기존 공유 권한에 대해 먼저 해당 AclEntry를 가져오고 원하는 대로 권한을 수정한 다음 클라이언트의 Update() 메서드를 호출하여 서버의 ACL을 수정합니다.

이 예에서는 'user@example.com'을 작성자(공동작업자)로 업데이트하여 사이트 공유 섹션의 이전 acl_entry를 수정합니다.

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 참조 가이드를 참고하세요.

맨 위로