Руководство разработчика: 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 в целях тестирования. 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

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

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

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

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

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

Аутентификация прокси-сервера 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-кодировке).
безопасный
Указывает, запрашивает ли клиент безопасный токен.
сессия
Указывает, можно ли обменять возвращенный токен на многоразовый (сессионный) токен.

В приведенном выше примере показан вызов, который не запрашивает маркер безопасности (значение secureFalse ). Результирующий 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)

Вернуться наверх