Руководство разработчика: Python

API данных Blogger позволяет клиентским приложениям просматривать и обновлять контент Blogger в виде фидов API данных Google.

Ваше клиентское приложение может использовать API данных Blogger для создания новых сообщений в блогах, редактирования или удаления существующих сообщений в блогах и запроса сообщений в блогах, соответствующих определенным критериям.

В дополнение к некоторым сведениям о возможностях API данных Blogger в этом документе приводятся примеры основных взаимодействий API данных с использованием клиентской библиотеки Python . Если вам интересно узнать больше о базовом протоколе, используемом библиотекой, см. раздел « Протокол» этого руководства разработчика.

Содержание

Аудитория

Этот документ предназначен для программистов, которые хотят писать клиентские приложения Python, которые могут взаимодействовать с Blogger.

В этом документе предполагается, что вы понимаете общие идеи протокола API данных Google .

Общие справочные сведения об API данных Blogger см. в справочном руководстве по протоколу .

Начиная

Справку по настройке клиентской библиотеки см. в Руководстве по началу работы .

Для клиентской библиотеки Python требуется Python 2.2 или новее. После загрузки клиентской библиотеки вам также потребуется скачать и установить пакет ElementTree .

Создание учетной записи блогера

Вы можете зарегистрировать учетную запись Blogger в целях тестирования. Blogger использует учетные записи Google , поэтому, если у вас уже есть учетная запись Google, все готово.

Запуск примера кода

Полный рабочий пример клиента, содержащий весь пример кода, показанный в этом документе, доступен в файле BloggerExample.py в каталоге gdata-python-client/samples/blogger/ .

Образец клиента выполняет несколько операций в предоставленном блоге, чтобы продемонстрировать использование API данных Blogger.

Вы можете запустить образец со следующими аргументами:

python BloggerExample.py --email [email_address] --password [password]

Чтобы использовать примеры из этого документа в собственном коде, вам понадобятся следующие операторы import :

from gdata import service
import gdata
import atom

Аутентификация в службе Blogger

Вы можете получить доступ как к общедоступным, так и к частным фидам с помощью Blogger Data API. Публичные каналы не требуют аутентификации, но доступны только для чтения. Если вы хотите изменить блоги, ваш клиент должен пройти аутентификацию, прежде чем запрашивать частные каналы. Он может выполнять аутентификацию с использованием любого из трех подходов: аутентификация OAuth , аутентификация прокси-сервера AuthSub или аутентификация имени пользователя/пароля ClientLogin .

Дополнительные сведения об аутентификации с помощью Google Data API в целом см. в документации по аутентификации .

В большинстве примеров в последующих разделах этого документа предполагается, что у вас есть аутентифицированный экземпляр GDataService .

OAuth-аутентификация

Документацию по аутентификации OAuth с использованием библиотеки Python GData см. в разделе OAuth в клиентских библиотеках Google Data Protocol .

Аутентификация прокси-сервера AuthSub

Прокси-аутентификация AuthSub используется веб-приложениями, которым необходимо аутентифицировать своих пользователей в учетных записях Google. Оператор веб-сайта и клиентский код не имеют доступа к имени пользователя и паролю пользователя Blogger; вместо этого клиент получает специальные токены AuthSub, которые позволяют клиенту действовать от имени определенного пользователя. Более подробную информацию смотрите в документации AuthSub .

Когда пользователь впервые посещает ваше приложение, он еще не прошел аутентификацию. В этом случае вам нужно отобразить некоторую информацию и ссылку, направляющую пользователя на страницу Google для аутентификации вашего запроса на доступ к их блогам. Клиентская библиотека Python предоставляет функцию для создания URL-адреса страницы Google. Код ниже извлекает URL-адрес страницы AuthSubRequest:

def GetAuthSubUrl():
  next = 'http://www.example.com/welcome.pyc'
  scope = 'http://www.blogger.com/feeds/'
  secure = False
  session = True
  blogger_service = service.GDataService()
  return blogger_service.GenerateAuthSubURL(next, scope, secure, session);

authSubUrl = GetAuthSubUrl();
print '<a href="%s">Login to your Google account</a>' % authSubUrl

Метод GenerateAuthSubURL принимает следующие параметры (соответствующие параметрам запроса, используемым обработчиком AuthSubRequest):

следующий
URL-адрес страницы, на которую Google должен перенаправить пользователя после аутентификации.
сфера
Указывает, что приложение запрашивает токен для доступа к фидам Blogger. Используемая строка области видимости — http://www.blogger.com/feeds/ (разумеется, в кодировке URL).
безопасный
Указывает, запрашивает ли клиент маркер безопасности.
сеанс
Указывает, можно ли обменять возвращенный токен на многоцелевой (сеансовый) токен.

В приведенном выше примере показан вызов, который не запрашивает безопасный токен (значение secure равно False ). Результирующий URL-адрес запроса может выглядеть следующим образом:

https://www.google.com/accounts/AuthSubRequest?scope=http%3A%2F%2Fwww.blogger.com%2Ffeeds%2F&session=1&secure=0&next=http%3A%2F%2Fwww.example.com%2Fwelcome.pyc

Пользователь переходит по ссылке на сайт Google и аутентифицируется в своей учетной записи Google.

После аутентификации пользователя система AuthSub перенаправляет его на URL-адрес, указанный в next параметре запроса URL-адреса AuthSubRequest. Система AuthSub добавляет токен проверки подлинности к этому URL-адресу в качестве значения параметра запроса token . Например:

http://www.example.com/welcome.pyc?token=yourAuthToken

Есть несколько способов получить значение токена из URL-адреса; Например:

import cgi

parameters = cgi.FieldStorage()
authsub_token = parameters['token']

Это значение токена представляет одноразовый токен AuthSub. В этом примере, поскольку было указано session = True , этот токен можно обменять на токен сеанса AuthSub с помощью метода UpgradeToSessionToken , который вызывает сервис AuthSubSessionToken :

blogger_service = service.GDataService()
blogger_service.auth_token = authsub_token
blogger_service.UpgradeToSessionToken()

То есть вы передаете свой одноразовый токен методу UpgradeToSessionToken , а интерфейс AuthSub возвращает токен сеанса.

Затем ваше приложение может использовать значение токена сеанса при последующих взаимодействиях с Blogger. Клиентская библиотека автоматически отправляет токен вместе с запросами.

Аутентификация имени пользователя/пароля ClientLogin

Используйте аутентификацию ClientLogin, если ваш клиент является автономным, однопользовательским «установленным» клиентом (например, настольным приложением). Просто вызовите метод ProgrammaticLogin() в своем экземпляре GDataService , и все последующие взаимодействия с Blogger будут аутентифицированы:

blogger_service = service.GDataService('user@example.com', 'secretPassword')
blogger_service.source = 'exampleCo-exampleApp-1.0'
blogger_service.service = 'blogger'
blogger_service.account_type = 'GOOGLE'
blogger_service.server = 'www.blogger.com'
blogger_service.ProgrammaticLogin()

В приведенном выше фрагменте мы устанавливаем три свойства экземпляра GDataService . Первый — это имя нашего приложения в виде companyNameapplicationNameversionID . Второе — это имя службы, с которой мы хотим взаимодействовать; третий адрес сервера.

Обратите внимание, что для account_type явно задано значение GOOGLE . Если этот параметр не задан, пользователи G Suite не смогут успешно использовать Blogger API.

Дополнительные сведения об аутентификации ClientLogin, включая примеры запросов и ответов, см. в документации по аутентификации для установленных приложений .

Примечание . Используйте один и тот же токен для всех запросов в данном сеансе; не приобретайте новый токен для каждого запроса Blogger.

Примечание . Как описано в документации ClientLogin, запрос аутентификации может завершиться ошибкой и запросить проверку CAPTCHA. Если вы хотите, чтобы Google выдавал и обрабатывал запрос CAPTCHA, отправьте пользователя на https://www.google.com/accounts/DisplayUnlockCaptcha?service=blogger (а не на URL-адрес обработки CAPTCHA, указанный в документации ClientLogin).

Получение списка блогов

API данных Blogger предоставляет фид, в котором перечислены блоги определенного пользователя; этот канал известен как «метаканал».

В следующем примере кода используется аутентифицированный экземпляр GDataService для получения метаканала, а затем печатается заголовок каждого блога.

def PrintUserBlogTitles(blogger_service):
  query = service.Query()
  query.feed = '/feeds/default/blogs'
  feed = blogger_service.Get(query.ToUri())

  print feed.title.text
  for entry in feed.entry:
    print "\t" + entry.title.text

Обратите внимание на URL-адрес, используемый методом Get . Это URL метафида по умолчанию; он возвращает список блогов для текущего аутентифицированного пользователя. Чтобы получить доступ к каналу для другого пользователя, вы можете указать идентификатор пользователя вместо значения по default в URL-адресе метаканала. Идентификатор пользователя — это строка цифр в конце URL-адреса профиля пользователя.

Фрагмент кода ниже демонстрирует, как извлечь идентификатор блога из фида. Идентификатор блога понадобится вам для создания, обновления и удаления сообщений и комментариев. Фрагмент ниже выбирает первый блог, полученный для пользователя.

blog_id = feed.entry[0].GetSelfLink().href.split("/")[-1]

В образце BloggerExample.py создается класс BloggerExample , а идентификатор блога задается в конструкторе для быстрого доступа в дальнейшем. В большинстве следующих примеров в этом документе blog_id передается как переменная.

Создание постов

API данных Blogger позволяет создавать и публиковать новые записи в блогах, а также создавать черновики записей.

Примечание . Установка собственного автора для сообщений в настоящее время не поддерживается. Все новые сообщения будут отображаться так, как если бы они были созданы текущим аутентифицированным пользователем.

Публикация сообщения в блоге

Вы можете использовать клиентскую библиотеку Python для публикации новых записей в блоге.

Сначала создайте экземпляр GDataEntry для представления сообщения в блоге. Затем вы можете установить заголовок, содержание и другие атрибуты сообщения в блоге. Наконец, используйте экземпляр GDataService , чтобы вставить сообщение. Вот пример того, как опубликовать новую запись в блоге:

def CreatePublicPost(blogger_service, blog_id, title, content):
  entry = gdata.GDataEntry()
  entry.title = atom.Title('xhtml', title)
  entry.content = atom.Content(content_type='html', text=content)
  return blogger_service.Post(entry, '/feeds/%s/posts/default' % blog_id)

blogEntry = CreatePublicPost(blogger_service, blog_id,
    title='I have the answer', content='Eureka! It is 42!')

Создание черновика сообщения в блоге

Черновики сообщений создаются так же, как общедоступные сообщения, но вам необходимо установить элемент расширения draft в экземпляре GDataEntry . Пост в блоге выше можно создать как черновик, добавив выделенные строки:

def CreateDraftPost(blogger_service, blog_id, title, content):
  entry = gdata.GDataEntry()
  entry.title = atom.Title('xhtml', title)
  entry.content = atom.Content(content_type='html', text=content)

  control = atom.Control()
  control.draft = atom.Draft(text='yes')
  entry.control = control

  return blogger_service.Post(entry, '/feeds/%s/posts/default' % blog_id)

draftEntry = CreateDraftPost(blogger_service, blog_id,
    title='I have the question',
    content='What do you get if you multiply six by nine?')

Вы можете превратить существующий черновик сообщения в блоге в опубликованное сообщение, получив черновик сообщения, установив для атрибута черновика значение no , а затем обновив сообщение. Мы рассмотрим получение и обновление сообщений в следующих двух разделах.

Получение сообщений

В следующих разделах описано, как получить список сообщений блога с параметрами запроса и без них.

Вы можете запросить общедоступную ленту Blogger без аутентификации. Поэтому вам не нужно задавать учетные данные или выполнять аутентификацию AuthSub перед получением сообщений из общедоступного блога.

Получение всех сообщений в блоге

Чтобы получить сообщения пользователя, вызовите метод GetFeed с URL-адресом ленты сообщений блога:

def PrintAllPosts(blogger_service, blog_id):
  feed = blogger_service.GetFeed('/feeds/' + blog_id + '/posts/default')

  print feed.title.text
  for entry in feed.entry:
    print "\t" + entry.title.text
    print "\t" + entry.content.text
    print "\t" + entry.updated.text
  print

Получение сообщений с использованием параметров запроса

API данных Blogger позволяет запрашивать набор записей, соответствующих заданным критериям, например, запрашивать сообщения в блоге, опубликованные или обновленные в указанном диапазоне дат. Для этого вы создаете экземпляр Query , а затем вызываете метод Get() .

Например, чтобы отправить запрос диапазона дат, задайте свойства published_min и published_min экземпляра Query . Следующий фрагмент кода выводит заголовок и содержание каждого поста в блоге, опубликованного между заданным временем начала и временем окончания:

def PrintPostsInDateRange(blogger_service, blog_id, start_time='2007-04-01', end_time='2007-04-25'):
  query = service.Query()
  query.feed = '/feeds/' + blog_id + '/posts/default'
  query.published_min = start_time
  query.published_max = end_time
  feed = blogger_service.Get(query.ToUri())

  print feed.title.text + " posts between " + start_time + " and " + end_time
  for entry in feed.entry:
    print "\t" + entry.title.text
    print "\t" + entry.content.text
    print "\t" + entry.updated.text
  print

Обратите внимание, что объект Query создан с использованием того же URL-адреса канала сообщений, который используется для получения сообщений.

API данных Blogger поддерживает следующие свойства Query :

категории
Задает категории (также известные как метки) для фильтрации результатов веб-канала. Например, http://www.blogger.com/feeds/ blogID /posts/default/-/Fritz/Laurie возвращает записи с ярлыками Fritz и Laurie . Чтобы указать этот запрос категории в клиентской библиотеке Python, вы можете использовать query.categories = ['Fritz','Laurie',]
max_results
Максимальное количество возвращаемых записей.
опубликовано_мин, опубликовано_макс.
Границы дат публикации записей.
start_index
Отсчитываемый от 1 индекс первого извлекаемого результата (для разбиения по страницам).
обновлено_мин, обновлено_макс.
Границы дат обновления записей. Эти параметры запроса игнорируются, если для параметра orderby не задано значение updated .

Дополнительные сведения о параметрах запроса см. в Справочном руководстве по API данных Blogger и Справочном руководстве по API данных Google .

Обновление сообщений

Чтобы обновить существующую запись в блоге, сначала извлеките запись, которую хотите обновить, затем измените ее, а затем отправьте в Blogger с помощью метода Put . Следующий фрагмент кода изменяет заголовок записи блога, предполагая, что вы уже получили запись с сервера.

def UpdatePostTitle(blogger_service, entry_to_update, new_title='The REAL answer'):
  entry_to_update.title = atom.Title('xhtml', new_title)
  return blogger_service.Put(entry_to_update, entry_to_update.GetEditLink().href)

Приведенный выше код возвращает GDataEntry , содержащий всю недавно обновленную запись. Чтобы обновить любые другие свойства, просто установите их в экземпляре GDataEntry перед вызовом Put .

Примечание . Изменение данных об авторе, связанных с сообщениями, в настоящее время не поддерживается.

Удаление сообщений

Чтобы удалить сообщение, передайте URL-адрес редактирования сообщения методу Delete вашего объекта GDataService , например:

def DeletePost(blogger_service, edit_link_href):
  blogger_service.Delete(edit_link_href)

Комментарии

API данных Blogger позволяет создавать, извлекать и удалять комментарии. Обновление комментариев не поддерживается (и недоступно в веб-интерфейсе).

Создание комментариев

Чтобы опубликовать комментарий, создайте объект GDataEntry и вставьте его следующим образом:

def CreateComment(blogger_service, blog_id, post_id, comment_text='Mostly harmless'):
  feed_uri = '/feeds/' + blog_id + '/' + post_id + '/comments/default'

  entry = gdata.GDataEntry()
  entry.content = atom.Content(content_type='xhtml', text=comment_text)
  return blogger_service.Post(entry, feed_uri)

Примечание . В настоящее время вы можете публиковать комментарии только в блоге, принадлежащем авторизованному пользователю.

Примечание . В настоящее время установка собственного автора для комментариев не поддерживается. Все новые комментарии будут отображаться так, как если бы они были созданы пользователем, прошедшим проверку подлинности в данный момент.

Получение комментариев

Вы можете получить комментарии к определенному сообщению по URL-адресу фида комментариев к сообщению:

def PrintAllComments(blogger_service, blog_id, post_id):
  feed_url = '/feeds/' + blog_id + '/' + post_id + '/comments/default'
  feed = blogger_service.Get(feed_url)

  print feed.title.text
  for entry in feed.entry:
    print "\t" + entry.title.text
    print "\t" + entry.updated.text
  print 

Или вы можете получить комментарии ко всем сообщениям, используя URL-адрес фида комментариев блога:

http://www.blogger.com/feeds/blogID/comments/default

Удаление комментариев

Чтобы удалить комментарий, передайте URL-адрес редактирования комментария методу Delete вашего объекта GDataService следующим образом:

def DeleteComment(blogger_service, post_id, comment_id):
  feed_url = '/feeds/' + post_id + '/comments/default/' + comment_id
  blogger_service.Delete(feed_url)

Вернуться к вершине