Ważne: ten dokument został napisany przed 2012 r. Opcje uwierzytelniania opisane w tym dokumencie (OAuth 1.0, AuthSub i ClientLogin) zostały oficjalnie wycofane 20 kwietnia 2012 roku i nie są już dostępne. Zachęcamy do jak najszybszego przejścia na OAuth 2.0.
Interfejs Google Sites Data API umożliwia aplikacjom klienckim uzyskiwanie dostępu do treści w Witrynie Google, ich publikowanie i modyfikowanie. Aplikacja klienta może też poprosić o listę ostatniej aktywności, pobrać historię zmian i pobrać załączniki.
Oprócz ogólnych informacji o możliwościach interfejsu Sites Data API ten przewodnik zawiera przykłady interakcji z interfejsem API przy użyciu biblioteki klienta Pythona. Informacje o konfigurowaniu biblioteki klienta znajdziesz w artykule Pierwsze kroki z biblioteką klienta w języku Python w Google Data. Jeśli chcesz dowiedzieć się więcej o podstawowym protokole używanym przez bibliotekę klienta Pythona do interakcji z klasycznym interfejsem API witryn, zapoznaj się z przewodnikiem po protokole.
Odbiorcy
Ten dokument jest przeznaczony dla programistów, którzy chcą pisać aplikacje klienckie, które będą wchodzić w interakcje z Google Sites za pomocą biblioteki klienta Google Data w Pythonie.
Pierwsze kroki
Aby korzystać z biblioteki klienta Pythona, musisz mieć język Python 2.2 lub nowszy oraz moduły wymienione na stronie wiki DependencyModules. Po pobraniu biblioteki klienta zapoznaj się z artykułem Pierwsze kroki z biblioteką Google Data dla Pythona, aby dowiedzieć się, jak zainstalować klienta i z niego korzystać.
Uruchamiam próbkę
Pełna wersja przykładowego kodu znajduje się w podkatalogu samples/sites
w repozytorium Mercurial projektu (/samples/sites/sites_example.py).
Uruchom ten przykład w ten sposób:
python sites_example.py # or python sites_example.py --site [sitename] --domain [domain or "site"] --debug [prints debug info if set]
Jeśli nie podasz wymaganych flag, aplikacja poprosi Cię o wpisanie tych wartości. Przykład ten pozwala użytkownikowi wykonać szereg operacji, które pokazują, jak korzystać z interfejsu API klasycznej wersji Witryn. W związku z tym, aby wykonać określone operacje (np. zmodyfikować treści), musisz się uwierzytelnić. Program poprosi Cię też o uwierzytelnienie się za pomocą AuthSub, OAuth lub ClientLogin.
Aby umieścić w swoim kodzie przykłady z tego przewodnika, potrzebujesz tych instrukcji import
:
import atom.data import gdata.sites.client import gdata.sites.data
Musisz też skonfigurować obiekt SitesClient
, który reprezentuje połączenie klienta z klasycznym interfejsem API witryn.
Przekaż nazwę aplikacji i nazwę witryny (z jej adresu URL):
client = gdata.sites.client.SitesClient(source='yourCo-yourAppName-v1', site='yourSiteName')
Aby pracować z witryną hostowaną w domenie G Suite, ustaw domenę za pomocą parametru domain
:
client = gdata.sites.client.SitesClient(source='yourCo-yourAppName-v1', site='yourSiteName', domain='example.com')
W powyższych fragmentach kodu argument source
jest opcjonalny, ale zalecany do celów rejestrowania. Powinien mieć format: company-applicationname-version
Uwaga: w dalszej części tego przewodnika przyjęliśmy założenie, że w zmiennej client
został utworzony obiekt SitesClient
.
Uwierzytelnianie w interfejsie API klasycznych Witryn
Biblioteki klienta dla języka Python można używać do pracy z publicznymi i prywatnymi plikami danych. Interfejs Sites Data API zapewnia dostęp do prywatnych i publicznych kanałów danych w zależności od uprawnień witryny i wykonywanej operacji. Można na przykład odczytywać kanał treści witryny publicznej, ale nie można jej aktualizować, co wymaga uwierzytelnionego klienta. Można to zrobić za pomocą uwierzytelniania ClientLogin (logowanie klienta) z hasłem i nazwą użytkownika, AuthSub lub OAuth.
Więcej informacji o protokole AuthSub, OAuth i ClientLogin znajdziesz w artykule Omówienie uwierzytelniania interfejsów API danych Google.
AuthSub w przypadku aplikacji internetowych
Uwierzytelnianie AuthSub w aplikacjach internetowych powinno być używane przez aplikacje klienckie, które muszą uwierzytelniać użytkowników na kontach Google lub G Suite. Operator nie musi mieć dostępu do nazwy użytkownika i hasła użytkownika Google Sites – wymagany jest tylko token AuthSub.
Zobacz instrukcje włączania AuthSub w aplikacji internetowej
Prośba o token jednorazowego użytku
Gdy użytkownik po raz pierwszy otworzy Twoją aplikację, musi się uwierzytelnić. Deweloperzy zwykle drukują tekst i link kierujący użytkownika na stronę zatwierdzania AuthSub, aby uwierzytelnić użytkownika i poprosić o dostęp do jego dokumentów. Biblioteka klienta Google Data w Pythonie udostępnia funkcję
generate_auth_sub_url()
do generowania tego adresu URL. Poniższy kod konfiguruje link do strony 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()
Jeśli chcesz uwierzytelniać użytkowników w domenie hostowanej w G Suite, podaj nazwę domeny jako parametr 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)
Metoda generate_auth_sub_url()
bierze pod uwagę kilka parametrów (odpowiadających parametrom zapytania używanym przez moduł obsługi AuthSubRequest):
- następny adres URL – adres URL, do którego Google przekieruje użytkownika po zalogowaniu się na konto i udzieleniu dostępu;
http://www.example.com/myapp.py
w przykładzie powyżej - zakres –
https://sites.google.com/feeds/
- secure: wartość logiczna wskazująca, czy token będzie używany w trybie bezpiecznym i zarejestrowanym;
True
w powyższym przykładzie - session, druga wartość logiczna wskazująca, czy token jednorazowy zostanie później zamieniony na token sesji;
True
w powyższym przykładzie.
Przechodzenie na token sesji
Zobacz Korzystanie z AuthSub w bibliotekach klienta interfejsu Google Data API.
Pobieranie informacji o tokenie sesji
Zobacz Korzystanie z AuthSub w bibliotekach klienta interfejsu Google Data API.
Unieważnianie tokena sesji
Zobacz Korzystanie z AuthSub w bibliotekach klienta interfejsu Google Data API.
Wskazówka: gdy aplikacja uzyska token sesji o długim czasie działania, zapisz go w bazie danych, aby można było go później użyć. Nie musisz wysyłać użytkownika z powrotem do AuthSub przy każdym uruchomieniu aplikacji.
Użyj client.auth_token = gdata.gauth.AuthSubToken(TOKEN_STR)
, aby ustawić istniejący token dla klienta.
OAuth w przypadku aplikacji internetowych lub zainstalowanych/mobilnych
OAuth może być używane jako alternatywa dla AuthSub i jest przeznaczone do aplikacji internetowych. OAuth jest podobne do korzystania z trybu bezpiecznego i zarejestrowanego w AuthSub, ponieważ wszystkie żądania danych muszą być podpisane cyfrowo, a musisz zarejestrować swoją domenę.
Instrukcje włączania OAuth w zainstalowanej aplikacji
Pobieranie tokena żądania
Zobacz Używanie protokołu OAuth z bibliotekami klienta interfejsu Google Data API.
Autoryzowanie tokena żądania
Zobacz Używanie protokołu OAuth z bibliotekami klienta interfejsu Google Data API.
Przejście na token dostępu
Zobacz Używanie OAuth z bibliotekami klienta interfejsu Google Data API.
Wskazówka: gdy aplikacja uzyska token dostępu OAuth, zapisz go w bazie danych, aby można było go później użyć. Nie musisz wysyłać użytkownika z powrotem do autoryzacji OAuth przy każdym uruchomieniu aplikacji.
Aby ustawić na kliencie istniejący token, użyj wartości client.auth_token = gdata.oauth.OAuthToken(TOKEN_STR, TOKEN_SECRET)
.
ClientLogin w przypadku zainstalowanych aplikacji lub aplikacji mobilnych
Interfejsu ClientLogin należy używać w przypadku zainstalowanych i mobilnych aplikacji, które muszą uwierzytelniać użytkowników na kontach Google. Przy pierwszym uruchomieniu aplikacja prosi użytkownika o podanie nazwy użytkownika i hasła. W kolejnych żądaniach przywoływany jest token uwierzytelniania.
Zobacz instrukcje włączania funkcji ClientLogin w zainstalowanej aplikacji
Aby użyć metody ClientLogin, wywołaj metodę ClientLogin()
obiektu SitesClient
, która jest dziedziczona z GDClient
. Podaj adres e-mail i hasło użytkownika, w imieniu którego klient wysyła żądania. Na przykład:
client = gdata.sites.client.SitesClient(source='yourCo-yourAppName-v1') client.ClientLogin('user@gmail.com', 'pa$$word', client.source);
Wskazówka: gdy aplikacja po raz pierwszy uwierzytelni użytkownika, przechowuj token uwierzytelniający w bazie danych, aby można go było później wykorzystać. Nie musisz prosić użytkownika o hasło przy każdym uruchomieniu aplikacji. Więcej informacji znajdziesz w artykule Przywoływanie tokena uwierzytelniania.
Więcej informacji o używaniu funkcji ClientLogin w aplikacjach Python znajdziesz w artykule Korzystanie z funkcji ClientLogin w bibliotekach klienta interfejsu Google Data API.
Kanał witryny
Plik danych o witrynach może zawierać listę witryn Google Sites, których użytkownik jest właścicielem lub do których ma uprawnienia do wyświetlania. Możesz też użyć go do zmiany nazwy istniejącej witryny. W przypadku domen G Suite możesz też użyć tej funkcji do utworzenia lub skopiowania całej witryny.
Strony z ofertami
Aby wyświetlić listę witryn, do których użytkownik ma dostęp, użyj metody GetSiteFeed()
klienta. Ta metoda korzysta z opcjonalnego argumentu uri
, którego możesz użyć do podania alternatywnego identyfikatora URI kanału witryny. Domyślnie GetSiteFeed()
używa nazwy witryny i domeny ustawionych w obiekcie klienta. Więcej informacji o ustawianiu tych wartości w obiekcie klienta znajdziesz w sekcji Wprowadzenie.
Oto przykład pobierania listy witryn uwierzytelnionego użytkownika:
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
Powyższy fragment kodu wypisuje tytuł witryny, nazwę witryny, z której została skopiowana, oraz identyfikator URI kanału ACL.
Tworzenie nowych witryn
Uwaga: ta funkcja jest dostępna tylko w domenach G Suite.
Nowe witryny można tworzyć, wywołując metodę CreateSite()
biblioteki.
Podobnie jak w przypadku pomocnika GetSiteFeed()
, CreateSite()
akceptuje również opcjonalny argument uri
, którego możesz użyć, aby podać alternatywny identyfikator URI kanału witryny (w przypadku utworzenia witryny w innej domenie niż ustawiona w obiekcie SitesClient
).
Oto przykład tworzenia nowej witryny z tematem „slate” oraz podawania tytułu i (opcjonalnie) opisu:
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
Powyższe żądanie spowoduje utworzenie nowej witryny w domenie G Suite example2.com
.
Adres URL witryny będzie więc mieć postać https://sites.google.com/a/example2.com/title-for-my-site.
Jeśli witryna zostanie utworzona, serwer w odpowiedzi prześle obiekt gdata.sites.data.SiteEntry
z elementami dodanymi przez serwer: linkiem do witryny, linkiem do pliku danych z listą kontroli dostępu witryny, nazwą witryny, tytułem, podsumowaniem itd.
Kopiowanie witryny
Uwaga: ta funkcja jest dostępna tylko w domenach G Suite.
CreateSite()
można też użyć do skopiowania istniejącej witryny. W tym celu przekaż argument słowa kluczowego source_site
.
Każda skopiowana witryna będzie miała ten link, który jest dostępny w sekcji entry.FindSourceLink()
. Oto przykład powielania witryny utworzonej w sekcji Tworzenie nowych witryn:
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
Ważne informacje:
- Można kopiować tylko te witryny i ich szablony, które należą do uwierzytelnionego użytkownika.
- Szablon witryny też można skopiować. Witryna jest szablonem, jeśli na stronie ustawień Witryn Google jest zaznaczone ustawienie „Opublikuj tę witrynę jako szablon”.
- Możesz skopiować witrynę z innej domeny, dopóki nie staniesz się jej właścicielem w witrynie źródłowej.
Aktualizowanie metadanych witryny
Aby zaktualizować tytuł lub podsumowanie witryny, musisz mieć SiteEntry
z odpowiednią witryną. W tym przykładzie użyliśmy metody GetEntry()
, aby najpierw pobrać SiteEntry
, a następnie zmienić jego tytuł, opis i tag kategorii:
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)
Pobieranie karty Aktywność
Uwaga: aby mieć dostęp do tego pliku danych, musisz być współpracownikiem lub właścicielem witryny. Klient musi się uwierzytelnić za pomocą tokena AuthSub, OAuth lub ClientLogin. Zobacz Uwierzytelnianie w usłudze Witryny.
Możesz pobrać ostatnią aktywność (zmiany) na stronie, pobierając kanał aktywności.
Metoda GetActivityFeed()
biblioteki zapewnia dostęp do tego pliku danych:
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)
Wywołanie funkcji GetActivityFeed()
zwraca obiekt gdata.sites.data.ActivityFeed
zawierający listę gdata.sites.data.ActivityEntry
. Każdy wpis o aktywności zawiera informacje
o zmianie wprowadzonej w Witrynie.
Pobieranie historii zmian
Uwaga: aby mieć dostęp do tego pliku danych, musisz być współpracownikiem lub właścicielem witryny. Klient musi się uwierzytelnić za pomocą tokena AuthSub, OAuth lub ClientLogin. Zobacz Uwierzytelnianie w usłudze Witryny.
Plik danych z rewizjami zawiera informacje o historii rewizji każdego wpisu z treściami. Metody GetRevisionFeed()
można używać do pobierania wersji określonego wpisu treści. Przyjmuje ona opcjonalny parametr uri
, który akceptuje identyfikator gdata.sites.data.ContentEntry
, pełny identyfikator URI wpisu treści lub identyfikator wpisu treści.
W tym przykładzie wysyłamy zapytanie do kanału treści i pobieramy plik danych z poprawkami dotyczący pierwszego wpisu treści:
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]
Wywołanie funkcji GetRevisionFeed()
zwraca obiekt gdata.sites.data.RevisionFeed
zawierający listę gdata.sites.data.RevisionEntry
. Każdy wpis dotyczący poprawki zawiera informacje takie jak treść w danej wersji, numer wersji i datę utworzenia nowej wersji.
Źródło treści
Pobieranie kanału treści
Uwaga: kanał danych o treściach może wymagać uwierzytelnienia lub nie, w zależności od uprawnień do udostępniania na stronie. Jeśli witryna nie jest publiczna, klient musi uwierzytelnić się przy użyciu tokena AuthSub, OAuth lub ClientLogin. Zapoznaj się z sekcją Uwierzytelnianie w usłudze Witryny.
Źródło treści zwraca najnowszą zawartość witryny. Można uzyskać do niego dostęp, wywołując metodę GetContentFeed()
biblioteki lib, która wykorzystuje opcjonalny parametr uri
ciągu znaków, by przekazać niestandardowe zapytanie.
Oto przykład pobierania całego pliku danych o treściach i wybierania z niego kilku interesujących elementów:
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
Wskazówka: za pomocą entry.Kind()
można określić typ wpisu.
Powstały obiekt feed
to obiekt gdata.sites.data.ContentFeed
zawierający listę obiektów gdata.sites.data.ContentEntry
. Każdy wpis reprezentuje inną stronę lub inny element w witrynie użytkownika i zawiera elementy specyficzne dla danego typu wpisu. Aby lepiej poznać niektóre właściwości dostępne w każdym typie wpisu, zapoznaj się z przykładową aplikacją.
Przykłady zapytań dotyczących źródła treści
W pliku danych o treściach możesz wyszukiwać informacje, korzystając z niektórych standardowych parametrów zapytania interfejsu Google Data API oraz parametrów specyficznych dla klasycznego interfejsu Sites API. Więcej szczegółowych informacji oraz pełną listę obsługiwanych parametrów znajdziesz w przewodniku po dokumentach referencyjnych.
Uwaga: przykłady w tej sekcji korzystają z metody pomocniczej gdata.sites.client.MakeContentFeedUri()
do tworzenia podstawowego identyfikatora URI kanału treści.
Pobieranie określonych rodzajów wpisów
Aby pobrać tylko określony typ wpisu, użyj parametru kind
. Na przykład ten fragment kodu zwraca tylko rekordy attachment
:
kind = 'webpage' print 'Fetching only %s entries' % kind uri = '%s?kind=%s' % (client.MakeContentFeedUri(), kind) feed = client.GetContentFeed(uri=uri)
Aby zwrócić więcej niż 1 typ, oddziel każdy kind
przecinkiem. Na przykład ten fragment kodu zwraca wpisy filecabinet
i listpage
:
kind = ','.join(['filecabinet', 'listpage']) print 'Fetching only %s entries' % kind uri = '%s?kind=%s' % (client.MakeContentFeedUri(), kind) feed = client.GetContentFeed(uri=uri)
Pobieranie strony według ścieżki
Jeśli znasz względną ścieżkę strony w Witrynach Google, możesz użyć parametru path
, by ją pobrać.
W tym przykładzie zwrócona zostanie strona o adresie 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)
Pobieranie wszystkich wpisów na stronie nadrzędnej
Jeśli znasz identyfikator wpisu treści strony (np. „1234567890” w poniższym przykładzie), możesz użyć parametru parent
, by pobrać wszystkie wpisy podrzędne (jeśli występują):
parent = '1234567890' print 'Fetching all children of parent entry: ' + parent uri = '%s?parent=%s' % (client.MakeContentFeedUri(), parent) feed = client.GetContentFeed(uri=uri)
Dodatkowe parametry znajdziesz w przewodniku po dokumentach.
Tworzenie treści
Uwaga: zanim utworzysz treść witryny, skonfiguruj ją w kliencie.client.site = "siteName"
Nowe treści (strony internetowe, strony list, teczki, strony z powiadomieniami itp.) można tworzyć za pomocą CreatePage()
.
Pierwszym argumentem tej metody powinien być rodzaj strony do utworzenia, a po nim tytuł i zawartość HTML.
Listę obsługiwanych typów węzłów znajdziesz w opisie parametru kind
w Przewodniku.
Tworzenie nowych elementów lub stron
W tym przykładzie tworzymy nowy obiekt webpage
poniżej najwyższego poziomu, zawiera on kod XHTML dla treści strony i nadaje tytuł nagłówka „Tytuł nowej strony internetowej”:
entry = client.CreatePage('webpage', 'New WebPage Title', html='<b>HTML content</b>') print 'Created. View it at: %s' % entry.GetAlternateLink().href
Jeśli żądanie zostanie spełnione, element entry
będzie zawierać kopię utworzonego na serwerze elementu gdata.sites.gdata.ContentEntry
.
Aby utworzyć bardziej złożony rodzaj wpisu, który jest wypełniany podczas tworzenia (np. listpage
z nagłówkami kolumn), musisz ręcznie utworzyć gdata.sites.data.ContentEntry
, podać odpowiednie właściwości i wywołać client.Post()
.
Tworzenie elementów/stron w niestandardowych ścieżkach URL
W przypadku poprzedniego przykładu strona zostanie utworzona pod adresem URL http://sites.google.com/domainName/siteName/new-webpage-title
i będzie mieć nagłówek „Nowy tytuł strony internetowej”. Oznacza to, że tytuł jest znormalizowany do new-webpage-title
.
Aby dostosować ścieżkę URL strony, możesz ustawić w danych treści właściwości page_name
. Pomocnik CreatePage()
udostępnia to jako opcjonalny argument słowa kluczowego.
W tym przykładzie tworzymy nową stronę filecabinet
z nagłówkiem „Pamięć plików”, ale tworzymy ją pod adresem URL http://sites.google.com/domainName/siteName/files
(zamiast http://sites.google.com/domainName/siteName/file-storage
), podając właściwość page_name
.
entry = client.CreatePage('filecabinet', 'File Storage', html='<b>HTML content</b>', page_name='files') print 'Created. View it at: ' + entry.GetAlternateLink().href
Aby nazwać ścieżkę adresu URL strony, serwer stosuje te reguły pierwszeństwa:
page_name
(jeśli występuje). Musi spełniać waruneka-z, A-Z, 0-9, -, _
.title
: nie może być równe null, jeśli nie ma nazwy strony. Normalizacja polega na przycięciu i zwijaniu spacji do znaku „-” oraz usunięciu znaków, które nie pasują doa-z, A-Z, 0-9, -, _
.
Tworzenie podstron
Aby utworzyć podstrony (podrzędne) pod stroną nadrzędną, użyj argumentu CreatePage()
parent
.
Wartość parent
może być wartością gdata.sites.gdata.ContentEntry
lub ciągiem tekstowym reprezentującym pełny identyfikator treści.
W tym przykładzie zapytanie dotyczące pliku danych treści dotyczy announcementpage
i tworzy nowy announcement
w ramach pierwszego znalezionego:
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!'
Przesyłanie plików
Podobnie jak w przypadku Google Sites, interfejs API obsługuje przesyłanie załączników na stronę magazynu plików lub stronę nadrzędną. Załączniki należy przesłać na stronę nadrzędną. Dlatego musisz ustawić link nadrzędny w ContentEntry
, który próbujesz przesłać. Więcej informacji znajdziesz w artykule Tworzenie stron podrzędnych.
Metoda UploadAttachment()
biblioteki klienta udostępnia interfejs do przesyłania załączników.
Przesyłam załączniki
W tym przykładzie plik PDF jest przesyłany do pierwszego filecabinet
znalezionego w strumieniach treści użytkownika.
Załącznik jest tworzony z tytułem „Nowy podręcznik pracownika” i (opcjonalnie) opisem „Pakiet 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
Jeśli przesyłanie się powiedzie, attachment
będzie zawierać kopię utworzonego załącznika na serwerze.
Przesyłanie załącznika do folderu
Szafki w Witrynach Google obsługują foldery. Pole UploadAttachment()
zawiera dodatkowy argument słowa kluczowego (folder_name
), którego możesz użyć do przesłania załącznika do folderu filecabinet
. Wystarczy, że podasz nazwę tego folderu:
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')
Zwróć uwagę, że ten przykład przekazuje do UploadAttachment()
obiekt gdata.data.MediaSource
zamiast ścieżki pliku. Nie przekazuje też typu treści. Zamiast tego typ treści jest określany w obiekcie MediaSource.
Załączniki internetowe
Załączniki internetowe to specjalne rodzaje załączników. Są to linki do innych plików w internecie, które możesz dodać do swoich informacji filecabinet
. Ta funkcja jest analogiczna do metody przesyłania „Dodaj plik za pomocą adresu URL” w interfejsie Witryn Google.
Uwaga: załączniki internetowe można tworzyć tylko w ramach filecabinet
. Nie można ich przesyłać na inne typy stron.
W tym przykładzie tworzymy załącznik internetowy w ramach pierwszego filecabinet
znalezionego w strumieniach treści użytkownika.
Jego tytuł i (opcjonalnie) opis mają odpowiednio wartości „GoogleLogo” i „ładne kolory”.
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!'
Wywołanie powoduje utworzenie linku wskazującego obraz pod adresem „http://www.google.com/images/logo.gif” w komponencie filecabinet
.
Aktualizowanie treści
Aktualizowanie metadanych lub zawartości HTML strony
Metadane (tytuł, pageName itp.) i zawartość strony dowolnego rodzaju można edytować przy użyciu metody Update()
klienta.
Poniżej przedstawiamy przykład aktualizacji obiektu listpage
z tymi zmianami:
- Tytuł zostaje zmieniony na „Zaktualizowany tytuł”.
- treść HTML strony jest aktualizowana na „Zaktualizowana treść HTML”;
- Nazwa pierwszej kolumny listy zmienia się na „Właściciel”.
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!'
Zastępowanie treści i metadanych załącznika
Treść pliku załącznika możesz zastąpić, tworząc nowy obiekt MediaSource
z nowym plikiem i wywołując metodę Update()
klienta. Można też zaktualizować metadane załącznika (np. tytuł i opis) lub tylko metadane.
Ten przykład pokazuje jednoczesne aktualizowanie treści i metadanych pliku:
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)
Usuwanie treści
Aby usunąć stronę lub element z Google Sites, najpierw pobierz wpis treści, a następnie wywołaj metodę Delete()
klienta.
client.Delete(content_entry)
Możesz też przekazać metodzie Delete()
link edit
z rekordu treści lub wymusić usunięcie:
# force=True sets the If-Match: * header instead of using the entry's ETag. client.Delete(content_entry.GetEditLink().href, force=True)
Więcej informacji o tagach ETag znajdziesz w przewodniku po interfejsach API danych Google.
Pobieranie załączników
Każdy wpis attachment
zawiera link src
do treści, za pomocą którego można pobrać zawartość pliku.
Klient Witryn zawiera metodę pomocniczą umożliwiającą dostęp do pliku i pobieranie go z tego linku: DownloadAttachment()
.
Akceptuje on identyfikator URI gdata.sites.data.ContentEntry
lub pobrany jako pierwszy argument oraz ścieżkę pliku do zapisania załącznika jako drugiego.
W tym przykładzie pobieramy konkretny wpis załącznika (poprzez wysłanie zapytania o jego link self
) i pobieramy plik do określonej ścieżki:
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!'
To deweloper aplikacji musi określić rozszerzenie pliku, które ma sens w przypadku typu załącznika. Typ treści można znaleźć w entry.content.type
.
W niektórych przypadkach nie można pobrać pliku na dysk (np. jeśli aplikacja działa w Google App Engine).
W takich sytuacjach użyj polecenia _GetFileContent()
, aby pobrać zawartość pliku i zapisać ją w pamięci.
Przykładowy plik do pobrania to załącznik do pamięci.
try: file_contents = client._GetFileContent(attachment.content.src) # TODO: Do something with the file contents except gdata.client.RequestError, e: raise e
Plik danych ACL
Omówienie uprawnień do udostępniania (listy kontroli dostępu)
Każdy wpis ACL w pliku danych ACL reprezentuje rolę dostępu określonego elementu, np. użytkownika, grupy użytkowników, domeny lub domyślnego dostępu (czyli witryny publicznej). Wpisy będą wyświetlane tylko w przypadku podmiotów z wyraźnym dostępem. Na panelu „Osoby z dostępem” w ekranie udostępniania w interfejsie Google Sites będzie widoczny po jednym wpisie dla każdego adresu e-mail. W rezultacie administratorzy domen nie będą widoczni, mimo że mają domyślny dostęp do witryny.
Role
Element role reprezentuje poziom dostępu, jaki może mieć dana encja. Element gAcl:role
może mieć 4 możliwe wartości:
- Odczytujący – wyświetlający (odpowiednik dostępu tylko do odczytu).
- writer (pisarz) – współpracownik (odpowiednik uprawnień do odczytu i zapisu).
- owner (właściciel) – zwykle administrator witryny (odpowiada to uprawnieniom do odczytu i zapisu).
Zakresy
Element zakresu reprezentuje element, który ma ten poziom dostępu. Element gAcl:scope
może mieć 4 typy:
- user – wartość adresu e-mail, np. „użytkownik@gmail.com”.
- grupa – adres e-mail grupy dyskusyjnej Google, np. „grupa@domena.com”.
- domena – nazwa domeny G Suite, np. „domena.com”.
- domyślny – istnieje tylko jeden możliwy zakres typu „domyślny”, który nie ma wartości (np.
<gAcl:scope type="default">
). Ten konkretny zakres kontroluje dostęp, który każdy użytkownik ma domyślnie w witrynie publicznej.
Uwaga: wartości gAcl:role
w domenie nie mogą mieć ustawienia „Właściciel”. Domeny mogą mieć tylko dostęp do odczytu lub zapisu.
Pobieranie pliku danych ACL
Pliku danych ACL można używać do kontrolowania uprawnień do udostępniania witryny i można go pobrać za pomocą metody GetAclFeed()
.
Poniższy przykład pobiera plik danych ACL dla witryny, która jest obecnie ustawiona w obiekcie SitesClient
, i wydrukuje wpisy uprawnień:
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)
Po przetworzeniu zapytania feed
będzie obiektem gdata.sites.data.AclFeed
zawierającym listę gdata.sites.data.AclEntry
.
Jeśli pracujesz z rekordami w pliku SiteFeed, każdy element SiteEntry
zawiera link do pliku danych ACL.
Na przykład ten fragment kodu pobiera pierwszą witrynę w pliku danych o witrynach użytkownika i wysyła zapytanie do pliku danych 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())
Udostępnianie witryny
Uwaga: niektóre uprawnienia dostępu do plików mogą być dostępne tylko wtedy, gdy domena jest skonfigurowana w taki sposób, aby zezwalać na takie uprawnienia (np. jeśli udostępnianie poza domeną w przypadku domen G Suite jest włączone).
Aby udostępnić witrynę Google za pomocą interfejsu API, utwórz element gdata.sites.gdata.AclEntry
z odpowiednimi wartościami gdata.acl.data.AclScope
i gdata.acl.data.AclRole
. Możliwe wartości AclScope
i AclRoles
znajdziesz w sekcji Przegląd pliku danych ACL.
W tym przykładzie użytkownik „użytkownik@example.com” otrzymuje uprawnienia do odczytu w witrynie:
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)
Udostępnianie na poziomie grupy i domeny
Podobnie jak w przypadku udostępniania witryny pojedynczemu użytkownikowi, możesz udostępnić witrynę grupie dyskusyjnej Google lub domenie G Suite. Wymagane wartości scope
znajdziesz poniżej.
Udostępnianie przy użyciu adresu e-mail grupy:
scope = gdata.acl.data.AclScope(value='group_name@example.com', type='group')
Udostępnianie całej domenie:
scope = gdata.acl.data.AclScope(value='example.com', type='domain')
Udostępnianie na poziomie domeny jest obsługiwane tylko w przypadku domen G Suite i tylko w przypadku domeny, w której hostowana jest witryna. Na przykład witryna http://sites.google.com/a/domain1.com/siteA może udostępniać całą witrynę tylko użytkownikom z domeny domain1.com, a nie z domeny domain2.com. Witryny, które nie są hostowane w domenie G Suite (np. http://sites.google.com/site/siteB), nie mogą zapraszać domen.
Modyfikowanie uprawnień do udostępniania
Aby uzyskać istniejące uprawnienia do udostępniania w witrynie, najpierw pobierz AclEntry
, którego dotyczy problem, zmień uprawnienia zgodnie z potrzebami, a następnie wywołaj metodę Update()
klienta, aby zmodyfikować listę kontroli dostępu (ACL) na serwerze.
W tym przykładzie zmieniamy poprzednią wartość acl_entry
w sekcji Udostępnianie witryny, aby użytkownik „użytkownik@example.com” stał się autorem (współautorem):
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)
Więcej informacji o tagach ETag znajdziesz w przewodniku po interfejsach API danych Google.
Usuwanie uprawnień do udostępniania
Aby usunąć uprawnienia do udostępniania, najpierw pobierz obiekt AclEntry
, a następnie wywołaj metodę Delete()
klienta.
client.Delete(acl_entry)
Możesz też przekazać metodę Delete()
linku edit
do wpisu listy kontroli dostępu i/lub wymusić usunięcie:
# force=True sets the If-Match: * header instead of using the entry's ETag. client.Delete(acl_entry.GetEditLink().href, force=True)
Więcej informacji o eTag znajdziesz w przewodniku po interfejsach Google Data API.
Tematy specjalne
Ponowne pobieranie pliku danych lub wpisu
Jeśli chcesz pobrać wcześniej pobrany kanał lub wpis, możesz zwiększyć wydajność, prosząc serwer o wysłanie listy lub wpisu tylko wtedy, gdy zmieniły się one od czasu ostatniego pobrania.
Aby wykonać takie wyszukiwanie warunkowe, prześlij do parametru GetEntry()
wartość ETag. Jeśli na przykład masz już obiekt 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
Jeśli GetEntry()
zgłosi wyjątek gdata.client.NotModified
, wartość ETag wpisu będzie zgodna z wersją na serwerze, co oznacza, że masz najbardziej aktualną kopię.
Jeśli jednak inny klient lub użytkownik wprowadził zmiany, nowy wpis zostanie zwrócony w elementach entry
, a nie zostanie rzucony żaden wyjątek.
Więcej informacji o eTag znajdziesz w przewodniku po interfejsach Google Data API.