はてなブログ AtomPub をラップする .NET Standard 1.3 ライブラリです。
/* OAuth 認証 */
var session = await OAuth.AuthorizeAsync(consumerKey, consumerSecret); // アプリケーションの認証
Process.Start(session.AuthorizationUri); // ブラウザで認証ページを開く
var verifier = Console.ReadLine(); // 確認コードをコンソールから入力
var token = await session.GetTokenAsync(verifier); // 確認コードからアクセストークンを取得
var blog = token.GetBlog(blogId); // ブログ ID で操作対象のブログを指定
/* ブログエントリ一覧の取得 */
blog.GetEntriesAsObservable() // IObservable<Entry>
.Where(entry => entry.IsDraft && entry.Categories.Contains("C#")) // カテゴリに C# が含まれている下書き
.Subscribe(entry =>
{
Console.WriteLine($"# {entry.Title} {entry.UpdateTime}");
Console.WriteLine(entry.Summary); // タイトルと更新日時、要約をコンソールに出力
});
/* ブログエントリの新規投稿 */
await blog.PostAsync(new Entry
{
Title = "Hateblo を公開しました",
Categories = { "はてなブログ", "AtomPub", "C#", ".NET Standard" },
Content = { Text = "はてなブログ AtomPub をラップする .NET Standard 1.3 ライブラリです。" },
});
- ブログエントリ一覧の取得
- ブログエントリの新規投稿 / 取得 / 更新 / 削除
- カテゴリ一覧の取得
NuGet から Hateblo をインストールしてください。
OAuth 認証、WSSE 認証、Basic 認証に対応しています。通常は OAuth 認証をおすすめします。
あらかじめ アプリケーション登録 が必要です。「アプリケーションを登録して consumer key を取得する」を参考にして、Consumer Key と Consumer Secret を取得しておいてください。
はてなブログ AtomPub では、すべての操作で read_private と write_private の scope が必要です。これらが許可されていない場合は認証に失敗します。
新規にアクセストークンを取得する場合は、次のようにします。
// リクエストトークンを取得
var session = await OAuth.AuthorizeAsync(consumerKey, consumerSecret);
// 確認コードを取得
// 例 (ブラウザを起動し、標準入力から取得):
// Process.Start(session.AuthorizationUri);
// var verifier = Console.ReadLine();
// アクセストークンを取得
var token = await session.GetTokenAsync(verifier);
var blog = token.GetBlog(blogId);
Token.GetBlog
メソッドが要求するブログ ID には、ブログのドメイン (例:"kuretchi.hateblo.jp"
) を指定してください。
OAuth 認証で取得したアクセストークンは、Token
インスタンスを DataContractSerializer
等でシリアライズするか、Token.AccessToken
と Token.AcceessTokenSecret
を保存しておくことで再利用できます。
後者の場合、Token
インスタンスを再び生成するには次のようにします。
var token = new Token(consumerKey, consumerSecret, accessToken, accessTokenSecret);
はてな ID と API キーを用いた認証方式です。API キーはブログの詳細設定から確認できます。
var token = new WseeToken(hatenaId, apiKey);
var blog = token.GetBlog(blogId);
はてな ID と API キーを用いた簡易な認証方式です。
var token = new BasicToken(hatenaId, apiKey);
var blog = token.GetBlog(blogId);
ブログエントリの一覧は、GetEntries
メソッドで取得できます。
var entries = blog.GetEntries(); // IEnumerable<Entry>
foreach (var entry in entries) Console.WriteLine(entry.Title);
GetEntriesAsObservable
メソッドを用いて、非同期で取得することもできます。戻り値は IObservable<Entry>
型で、Reactive Extensions を活用することができます。
var entries = blog.GetObaservableEntries(); // IObservable<Entry>
entries.Subscribe(entry => Console.WriteLine(entry.Title));
ブログエントリは更新日時 (Entry.UpdateTime
) が新しい順に列挙されます。
これらのメソッドは、取得されるブログエントリ数に比例する回数のリクエストをサーバーに送信します。サーバーへの負荷を軽減するため、規定ではリクエスト毎に 1 秒間の待機を行います。この待機時間を指定するために、TimeSpan
を受け取るオーバーロードが用意されています。
var entries = blog.GetEntriesAsObservable(TimeSpan.FromMilliseconds(500)); // リクエスト毎に 500 ms の間隔を空ける
ブログエントリは ID からも取得できます。ブログエントリ ID は Entry.Id
プロパティから取得できます。
var entry = await blog.GetEntryAsync(entryId);
Console.WriteLine(entry.Title);
Entry
クラスのインスタンスを作成し、PostAsync
メソッドで投稿します。投稿に成功すると、同時に取得できる Entry.Id
などのプロパティがすべて設定されます。
var entry = new Entry
{
Title = "ブログタイトル",
Content = { Text = "ブログエントリの新規投稿のテストです。" },
Categories = { "サンプル", "テスト" },
};
await blog.PostAsync(entry);
取得したブログエントリを編集し、UpdateAsync
メソッドで更新します。
entry.Title += " (MM/DD 追記)";
entry.Content.Text += " \nほげほげ";
entry.Categories.Remove("サンプル");
entry.Categories.Add("sample");
await blog.UpdateAsync(entry);
更新日時をその時点の日時に変更するには、Entry.UpdateTime
に現在時刻を設定しておくか、もしくは null
を設定すると更新時のサーバーの日時が自動的に設定されます。
entry.UpdateTime = new HatenaDateTime(DateTimeOffset.Now); // 現在時刻を設定
entry.UpdateTime = null; // 更新時のサーバーの日時を自動で設定
RemoveAsync
メソッドで削除します。
await blog.RemoveAsync(entry);
ブログエントリ ID を指定して削除することもできます。
await blog.RemoveAsync(entryId);
GetCategories
メソッド、または非同期の GetCategoriesAsObservable
メソッドで取得できます。
var categories = blog.GetCategories(); // IEnumerable<string>
var observableCategories = blog.GetCategoriesAsObservable(); // IObservable<string>
- 不具合報告やご提案は Issues までお気軽にどうぞ。
- Pull Request も歓迎します。
- このライブラリの主要な部分は MIT License です。
- neuecc/AsyncOAuth のコードを一部利用しており、これは MIT License に従います。