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

Важно : Это старая версия этой страницы. Для получения последней версии используйте ссылки на левой панели навигации.

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

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

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

Содержание

Аудитория

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

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

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

Начиная

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

Чтобы использовать клиентскую библиотеку .NET, вам потребуется среда выполнения .NET 1.1, а также вы должны быть в курсе всех исправлений. После загрузки клиентской библиотеки вы найдете библиотеки DLL, необходимые для начала работы, в подкаталоге lib/Release дистрибутива.

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

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

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

Полный рабочий пример клиента, содержащий весь пример кода, показанный в этом документе, доступен в проекте клиентской библиотеки .NET. Образец находится в /trunk/clients/cs/samples/blogger/ConsoleSample.cs на вкладке «Источник» репозитория SVN.

Перед компиляцией и запуском этого примера обновите значения username , password , blogName и postId соответствующими значениями. Значения username и password представляют собой учетные данные, используемые для входа в Blogger. Значение blogName — это начало URL-адреса блога вашего блога.

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

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

using Google.GData.Client;
using System.Net;
using System.Xml;
using System.Text.RegularExpressions;

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

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

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

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

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

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

Предположим, что на вашей странице определена следующая гиперссылка ASP:

<asp:HyperLink ID="GotoAuthSubLink" runat="server"/>

Затем, чтобы создать URL-адрес AuthSubRequest для вашего приложения, вызовите клиентскую библиотеку .NET следующим образом:

GotoAuthSubLink.Text = "Login to your Google Account";
GotoAuthSubLink.NavigateUrl =
  AuthSubUtil.getRequestUrl("http://www.example.com/RetrieveToken",
  "http://www.blogger.com/feeds/",
  false,
  true);

Метод getRequestUrl принимает следующие параметры (соответствующие параметрам запроса, используемым обработчиком 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%2FRetrieveToken

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

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

http://www.example.com/RetrieveToken?token=yourAuthToken

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

SessionsessionToken = AuthSubUtil.exchangeForSessionToken(Request.QueryStringtoken, null);

То есть вы передаете свой одноразовый токен методу exchangeForSessionToken вместе с null значением (для незарегистрированного режима) или закрытым ключом (для зарегистрированного режима), а интерфейс AuthSub возвращает токен сеанса. Дополнительные сведения о зарегистрированных приложениях и закрытых ключах см. в разделе « Подписание запросов » документации AuthSub.

Затем ваше приложение может использовать значение токена сеанса при последующих взаимодействиях с Blogger. Чтобы указать клиентской библиотеке .NET автоматически отправлять заголовок авторизации (содержащий токен сеанса) с каждым запросом, выполните следующие действия.

GAuthSubRequestFactory authFactory = new GAuthSubRequestFactory("blogger", "BloggerSampleApp");
authFactory.Token = SessionsessionToken.ToString();
Service service = new Service(authFactory.ApplicationName);
service.RequestFactory = authFactory;

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

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

Service service = new Service("blogger", "exampleCo-exampleApp-1");
service.Credentials = new GDataCredentials("user@example.com", "secretPassword");
GDataGAuthRequestFactory factory = (GDataGAuthRequestFactory) service.RequestFactory;
factory.AccountType = "GOOGLE";

В приведенном выше фрагменте мы передаем два параметра конструктору Service . Первый параметр — это имя службы, с которой мы хотим взаимодействовать. Второй параметр — это имя нашего приложения в виде companyNameapplicationNameversionID . Мы также настроили Service.RequestFactory для использования только типа учетной записи GOOGLE , чтобы обеспечить правильную аутентификацию для пользователей G Suite .

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

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

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

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

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

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

query.Uri = new Uri("http://www.blogger.com/feeds/default/blogs");
AtomFeed feed = null;
try
{
  feed = service.Query(query);
  foreach (AtomEntry entry in feed.Entries)
  {
    Console.WriteLine("Blog Title: " + entry.Title.Text);
  }
}

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

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

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

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

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

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

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

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

AtomEntry newPost = new AtomEntry();
newPost.Title.Text = "Marriage!";
newPost.Content = new AtomContent();
newPost.Content.Content = "<div xmlns='http://www.w3.org/1999/xhtml'>" +
  "<p>Mr. Darcy has <em>proposed marriage</em> to me!</p>" +
  "<p>He is the last man on earth I would ever desire to marry.</p>" +
  "<p>Whatever shall I do?</p>" +
  "</div>";
newPost.Content.Type = "xhtml";

Uri blogFeedUri = new Uri("http://www.blogger.com/feeds/" + blogId + "/posts/default");
AtomEntry createdEntry = service.Insert(blogFeedUri, newPost);

Метод Insert принимает в качестве параметра URL-адрес сообщения службы. Затем метод возвращает запись в том виде, в каком она была сохранена в Blogger. Возвращается та же запись, которую вы отправили, но она также содержит различные элементы, добавленные Blogger, например идентификатор сообщения.

Если по какой-либо причине ваш запрос не будет выполнен, Blogger может вернуть другой код состояния. Информацию о кодах состояния см. в справочном документе по протоколу API данных Google .

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

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

AtomEntry newPost = new AtomEntry();
newPost.Title.Text = "Marriage!";
newPost.Content = new AtomContent();
newPost.Content.Content = "<div xmlns='http://www.w3.org/1999/xhtml'>" +
    "<p>Mr. Darcy has <em>proposed marriage</em> to me!</p>" +
    "<p>He is the last man on earth I would ever desire to marry.</p>" +
    "<p>Whatever shall I do?</p>" +
    "</div>";
newPost.Content.Type = "xhtml";
newPost.IsDraft = true;

Uri blogFeedUri = new Uri("http://www.blogger.com/feeds/" + blogId + "/posts/default");
AtomEntry createdEntry = service.Insert(blogFeedUri, newPost);

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

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

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

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

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

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

query.Uri = new Uri("http://www.blogger.com/feeds/" + blogId + "/posts/default");
feed = service.Query(query);
Console.WriteLine(feed.Title.Text);
foreach (AtomEntry entry in feed.Entries)
{
  Console.WriteLine("Entry Title: " + entry.Title.Text);
}

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

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

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

FeedQuery query = new FeedQuery();
query.Uri = new Uri("http://www.blogger.com/feeds/" + blogId + "/posts/default");
query.MinPublication = new DateTime(2006, 1, 1);
query.MaxPublication = new DateTime(2007, 4, 12);
AtomFeed feed = service.Query(query);
foreach (AtomEntry entry in feed.Entries)
{
  Console.WriteLine("  Entry Title: " + entry.Title.Text);
}

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

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

альтернативный
Тип возвращаемого фида, например, atom (по умолчанию) или rss .
/category
Укажите категории (также известные как метки) для фильтрации результатов фида. Например, http://www.blogger.com/feeds/ blogID /posts/default/-/Fritz/Laurie возвращает записи с ярлыками Fritz и Laurie .
максимальные результаты
Максимальное количество возвращаемых записей.
Сортировать по
Порядок, в котором возвращаются записи, такие как lastmodified (по умолчанию), starttime или updated .
опубликовано-мин., опубликовано-макс.
Границы дат публикации записей.
начальный индекс
Отсчитываемый от 1 индекс первого извлекаемого результата (для разбиения по страницам).
обновлено-минимум, обновлено-макс.
Границы дат обновления записей. Эти параметры запроса игнорируются, если для параметра orderby не задано значение updated .

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

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

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

static AtomEntry EditEntry(AtomEntry toEdit)
{
  // Edit the entry by changing the Title and calling Update().
  if (toEdit != null)
  {
    toEdit.Title.Text = "Marriage Woes!";
    toEdit = toEdit.Update();
  }
  return toEdit;
}

Приведенный выше код возвращает AtomEntry , содержащий всю недавно обновленную запись. Чтобы обновить любые другие свойства, просто установите их в объекте AtomEntry перед вызовом Update() .

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

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

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

static void DeleteEntry(AtomEntry toDelete)
{
  // Delete the edited entry
  if (toDelete != null)
  {
    toDelete.Delete();
  }
}

Комментарии

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

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

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

AtomEntry comment;
comment = new AtomEntry();
comment.Title.Text = "This is my first comment";
comment.Content.Content = "This is my first comment";
Uri commentPostUri = new Uri("http://www.blogger.com/feeds/" + blogId + "/" + entryId + "/comments/default");
postedComment = service.Insert(commentPostUri, comment);

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

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

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

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

static void ListEntryComments(Service service, Uri commentUri)
{
  if (commentUri != null)
  {
    // Retrieve all comments on a blog entry
    FeedQuery query = new FeedQuery();
    query.Uri = commentUri;
    AtomFeed feed = service.Query(query);
    foreach (AtomEntry entry in feed.Entries)
    {
      Console.WriteLine("  Comment Title: " + entry.Title.Text);
    }
  }
}

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

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

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

Чтобы удалить комментарий, вызовите метод Delete() для существующего объекта комментария AtomEntry следующим образом:

static void DeleteComment(AtomEntry commentEntry)
{
  if (commentEntry != null)
  {
    // Delete the comment.
    commentEntry.Delete();
  }
}

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