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
は、Fritz
とLaurie
の両方のラベルを持つエントリを返します。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)