デベロッパー ガイド: Python

Blogger Data API を使用すると、クライアント アプリケーションは Google Data API フィードの形式で Blogger のコンテンツを表示、更新できます。

クライアント アプリケーションは、Blogger Data API を使用して、新しいブログ投稿の作成、既存のブログ投稿の編集と削除、特定の条件に一致するブログ投稿の検索を行うことができます。

このドキュメントでは、Blogger Data API の機能の背景だけでなく、Python クライアント ライブラリを使用した Data API の基本的な操作の例についても説明します。ライブラリが使用する基盤となるプロトコルについて詳しくは、このデベロッパー ガイドのプロトコルのセクションをご覧ください。

目次

対象

このドキュメントは、Blogger とやり取りできる Python クライアント アプリケーションを作成するプログラマを対象としています。

このドキュメントは、Google Data API プロトコルの背後にある一般的なコンセプトを理解していることを前提としています。

Blogger Data API のリファレンス情報については、プロトコル リファレンス ガイドをご覧ください。

使用を開始する

クライアント ライブラリの設定については、スタートガイドをご覧ください。

Python クライアント ライブラリを使用するには、Python 2.2 以降が必要です。クライアント ライブラリをダウンロードした後、ElementTree パッケージもダウンロードしてインストールする必要があります。

Blogger アカウントの作成

テスト用に Blogger アカウントに登録することをおすすめします。Blogger では Google アカウントが使用されるため、Google アカウントをすでにお持ちの場合は、設定が完了しています。

サンプルコードの実行

このドキュメントに示されているすべてのサンプルコードを含む完全なサンプル クライアントは、BloggerExample.py ファイルの gdata-python-client/samples/blogger/ ディレクトリにあります。

サンプル クライアントは、提供されたブログに対して、Blogger Data API の使用方法を示す操作をいくつか行います。

次の引数を使用してサンプルを実行できます。

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

このドキュメントのサンプルを独自のコードで使用するには、次の import ステートメントが必要です。

from gdata import service
import gdata
import atom

Blogger サービスに対する認証

Blogger Data API を使用すると、公開フィードと限定公開フィードの両方にアクセスできます。 公開フィードは認証は不要ですが、読み取り専用です。ブログを変更する場合は、クライアントが限定公開フィードをリクエストする前に認証を行う必要があります。この API は、OAuth 認証、AuthSub プロキシ認証、SafeFrame ユーザー名/パスワード認証のいずれかによって認証できます。

Google Data API を使用した認証全般については、認証のドキュメントをご覧ください。

このドキュメントの以降のセクションのほとんどのサンプルでは、認証済みの GDataService インスタンスがあることを前提としています。

OAuth 認証

Python GData ライブラリを使用した OAuth 認証に関するドキュメントについては、Google Data Protocol クライアント ライブラリの OAuth をご覧ください。

AuthSub プロキシ認証

AuthSub プロキシ認証は、Google アカウントでユーザーを認証する必要があるウェブ アプリケーションで使用されます。ウェブサイトの運営者とクライアント コードは、Blogger ユーザーのユーザー名とパスワードにアクセスできません。クライアントは代わりに、特定の AuthSub トークンを取得して、クライアントが特定のユーザーの代わりに操作できるようにします。詳細については、AuthSub のドキュメントをご覧ください。

ユーザーが初めてアプリケーションにアクセスしたときに、まだ認証されていません。この場合、ブログへのアクセス リクエストを認証するために、いくつかの情報と、ユーザーを Google ページに誘導するリンクを表示する必要があります。Python クライアント ライブラリには、Google のページ URL を生成する関数が用意されています。次のコードは、AuthSubRequest ページの URL を取得します。

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 ハンドラで使用されるクエリ パラメータに対応)を取ります。

次へ
認証後に Google によってユーザーがリダイレクトされるページの URL。
スコープ
アプリケーションが Blogger フィードにアクセスするためのトークンをリクエストしていることを示します。使用するスコープ文字列は http://www.blogger.com/feeds/ です(もちろん、URL エンコードされています)。
安全
クライアントが安全なトークンをリクエストしているかどうかを示します。
session
返されたトークンを多目的(セッション)トークンと交換できるかどうかを指定します。

上記の例は、安全なトークンをリクエストしない呼び出しを示しています(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 システムは、ユーザーを AuthSubRequest URL の next クエリ パラメータで指定した URL にリダイレクトします。AuthSub システムは、その URL に token クエリ パラメータの値として認証トークンを追加します。例:

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

URL からトークン値を取得するには、いくつかの方法があります。次に例を示します。

import cgi

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

このトークン値は、1 回限りの AuthSub トークンを表します。この例では、session = True が指定されているため、このトークンを UpgradeToSessionToken メソッドを使用して AuthSub セッション トークンと交換できます。このメソッドは AuthSubSessionToken サービスを呼び出します。

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

つまり、1 回限りのトークンを UpgradeToSessionToken メソッドに渡すと、AuthSub インターフェースがセッション トークンを返します。

これにより、アプリケーションは、その後の Blogger の操作でセッション トークン値を使用できます。クライアント ライブラリは、リクエストと一緒にトークンを自動的に送信します。

ClientLogin ユーザー名/パスワード認証

クライアントがスタンドアロンのシングル ユーザー(デスクトップ アプリケーションなど)のクライアントである場合は、SafeFrame 認証を使用します。GDataService インスタンスで ProgrammaticLogin() メソッドを呼び出すだけで、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 インスタンスに 3 つのプロパティを設定しています。1 つ目はアプリケーションの名前で、companyName-applicationName-versionID の形式です。2 つ目は操作するサービスの名前、3 つ目はサーバーのアドレスです。

account_type が明示的に GOOGLE に設定されていることに注意してください。このパラメータを設定しないと、G Suite ユーザーが Blogger API を正常に使用することができません。

サンプル リクエストやサンプル レスポンスなど、SafeFrame 認証の詳細については、インストール済みアプリケーションの認証のドキュメントをご覧ください。

: 特定のセッションのすべてのリクエストで同じトークンを使用します。Blogger のリクエストごとに新しいトークンを取得しないでください。

: SafeFrame のドキュメントに記載されているように、認証リクエストが失敗して CAPTCHA チャレンジが要求される場合があります。Google にキャプチャ キャプチャを発行して処理する場合は、ユーザーを https://www.google.com/accounts/DisplayUnlockCaptcha?service=blogger にリダイレクトします(Blobstore のドキュメントに記載されているキャプチャ処理用 URL ではなく)。

ブログのリストの取得

Blogger Data API は、特定のユーザー向けにブログを公開するためのフィードを提供しています。このフィードは「メタフィード」と呼ばれています。

次のサンプルコードでは、認証済みの 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

Get メソッドで使用される URL をメモします。これはデフォルトのメタフィードの URL です。現在認証されているユーザーのブログのリストを返します。別のユーザーのフィードにアクセスするには、メタフィードの URL の default の代わりにそのユーザーの ID を入力します。ユーザーの ID は、ユーザーのプロフィール URL の末尾にある数字列です。

以下のコード スニペットは、フィードからブログ ID を抽出する方法を示しています。投稿やコメントに対して作成、更新、削除を行うには、ブログ ID が必要です。以下のスニペットでは、ユーザーについて最初に取得したブログを選択します。

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

BloggerExample.py サンプルでは、BloggerExample クラスを作成し、後でアクセスしやすいようにコンストラクタでブログ ID を設定します。このドキュメントの次の例では、blog_id が変数として渡されます。

投稿の作成

Blogger Data API を使用すると、新しいブログを作成して公開したり、エントリの下書きを作成したりできます。

: 投稿に対するカスタムの作成者の設定は現在サポートされていません。新しい投稿はすべて、現在認証済みのユーザーが作成したものとして表示されます。

ブログ投稿を公開する

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

下書きのブログ投稿を作成する

下書きの投稿は一般公開の投稿と同じ方法で作成されますが、GDataEntry インスタンスに draft 拡張要素を設定する必要があります。上記のブログ投稿は、ハイライト表示された行を追加することで下書きとして作成できます。

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 に設定してから、投稿を更新します。次の 2 つのセクションでは、投稿の取得と更新について説明します。

投稿の取得

以下のセクションでは、クエリ パラメータの有無にかかわらず、ブログ投稿のリストを取得する方法について説明します。

Blogger の公開フィードに対して、認証なしでクエリを実行できます。したがって、公開ブログから投稿を取得する前に、認証情報の設定や AuthSub 認証を行う必要はありません。

すべてのブログ投稿の取得

ユーザーの投稿を取得するには、ブログ投稿の URL を指定して GetFeed メソッドを呼び出します。

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

クエリ パラメータを使用して投稿を取得する

Blogger Data API を使用すると、特定の期間に公開されたブログや公開されたブログ投稿をリクエストするなど、指定した条件に一致する一連のエントリをリクエストできます。これを行うには、Query インスタンスを作成し、Get() メソッドを呼び出します。

たとえば、期間クエリを送信するには、Query インスタンスの published_min プロパティと published_min プロパティを設定します。次のコード スニペットは、特定の開始時刻と終了時刻の間に公開された各ブログ投稿のタイトルと内容を出力します。

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 を使用して構築されます。

Blogger Data API では、次の Query プロパティがサポートされています。

categories
フィード結果をフィルタするカテゴリ(ラベルとも呼ばれます)を指定します。たとえば、http://www.blogger.com/feeds/blogID/posts/default/-/Fritz/Laurie は、FritzLaurie の両方のラベルを持つエントリを返します。Python クライアント ライブラリでそのカテゴリクエリを指定するには、query.categories = ['Fritz','Laurie',] を使用します。
max_results
返されるエントリの最大数。
publish_min、published_max
エントリ公開日の境界。
start_index
取得される最初の結果(ページング用)の 1 ベースのインデックス。
updated_min、updated_max
エントリ更新日の境界。orderby パラメータが updated に設定されていない限り、これらのクエリ パラメータは無視されます。

クエリ パラメータの詳細については、Blogger Data API リファレンス ガイドGoogle Data API リファレンス ガイドをご覧ください。

投稿の更新

既存のブログ投稿を更新するには、まず更新するエントリを取得して変更し、Put メソッドを使用して Blogger に送信します。次のコード スニペットは、サーバーからエントリをすでに取得していると仮定して、ブログのタイトルを変更します。

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 を返します。他のプロパティを更新するには、Put を呼び出す前に GDataEntry インスタンスで設定します。

: 現在、投稿に関連付けられた著者データの変更はサポートされていません。

投稿の削除

投稿を削除するには、次のように、投稿の編集 URL を GDataService オブジェクトの Delete メソッドに渡します。

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

コメント

Blogger Data API を使用すると、コメントを作成、取得、削除できます。 コメントの更新はサポートされていません(また、ウェブ インターフェースでも利用できません)。

コメントの作成

コメントを送信するには、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 を GDataService オブジェクトの Delete メソッドに渡します。

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

トップへ戻る