ここでは何をするのか
ここでは無料ブログサービスやWordPressによるブログへの記事の自動投稿処理について記述していく。
最初に断っておくと記事の自動作成ではない。予め作成した記事をブログに投稿すると言うものだ。
ブログの自動投稿と言っても可能な手法が幾つかあり、ブログによってどれが可能か異なる。
ここでは大きく5つの手法を書いておく。
1.Atom Pubを使う方法
2.XML-RPCを使う方法
3.REST APIを使う方法
4.メール投稿を使う方法
5.WEBページを操作する方法
ここでは1.から3.について簡単に見ておく。
最初に断っておくと記事の自動作成ではない。予め作成した記事をブログに投稿すると言うものだ。
ブログの自動投稿と言っても可能な手法が幾つかあり、ブログによってどれが可能か異なる。
ここでは大きく5つの手法を書いておく。
1.Atom Pubを使う方法
2.XML-RPCを使う方法
3.REST APIを使う方法
4.メール投稿を使う方法
5.WEBページを操作する方法
ここでは1.から3.について簡単に見ておく。
Atom Pubを使う方法
Atom PubはAtom Publishing Protocolの略称で、WEBのリソースを公開・編集するためのプロトコル(規約や手順)の仕様を取りまとめたものになる。
ブログもAtom Pubに準拠することで開発が効率化されるメリットがある。(ただ、最近だと余り新規にブログを作成することってあるんだろうか疑問ではあるけれど。)
またAtom Pubに則った機能を実装しているブログに対してはAtom Pubに則って外部からアクセスすることでブログに記事を投稿したり編集削除したりすることが比較的簡単に出来る。
このAtom Pubに準拠しているブログとしてははてなブログやlivedoorブログがある
ここではAtom Punを使ってはてなブログに記事を投稿することを目標として、考え方をまとめておく。
はてなブログのAtom Pubについては下記に詳細が記載されているので参考にするとよい。
はてなブログAtomPub
基本的にブログにAtomPubで記事を投稿するためにはブログに対してHTTPのPOSTメソッドでデータを送信する必要がある。
WEBサイトにHTTPでPOSTするための基本的な手順を下記に記載しておく
//WEBサイトへのリクエストの準備
1.WebRequestクラスによりHTTPのリクエストオブジェクトを作成
//POSTするための設定
2.リクエストのMethodプロパティに「POST」を設定
3.ContentTypeプロパティに「application/x-www-form-urlencoded」を設定
ここでバイナリファイルを送りたい場合は、multipart/form-dataを指定しますがここでは解説しないので必要なら別途ググって欲しい。
4.ContentLengthプロパティに送信するポスト・データの長さを設定
//POSTするためのstreamの作成
5.リクエストのGetRequestStream()メソッドで書き込みのためのstreamオブジェクトを作成
//streamを使ってデータをWEBサイトに送信する
6.streamオブジェクトのwriteメソッドでデータをサイトに送信
//WEBサイトからレスポンスを取得する
7.リクエストのGetResponse()メソッドでレスポンスオブジェクトを作成
8.レスポンスのGetResponseStream()メソッドでレスポンスに対するstreamオブジェクトを作成
9.上記で得たstreamオブジェクトとエンコード情報を使ってStreamReaderオブジェクトを作成する
10.StreamRederオブジェクトのReadToEnd()メソッドでWEBサイトからのレスポンスを取得する
このうち2.〜6.がPOSTのための処理でWEBサイトに対してGET処理を行う場合には実はこの2.〜6.を省いた処理を行うことで可能だ。
以上がHTTPによるPOST処理の概略だ。
AtomPubによるデータ送信の仕組みは以上だけれども、その仕組みを使って送るデータはXMLにより作成する。
ブログに記事を投稿するにはブログ操作のためのエンドポイントに対して上記の様に記事データをPOSTによって送信する。
AtomPubでは記事の新規投稿以外にも記事一覧の取得や記事の編集削除などが可能になっている。
記事の新規投稿や一覧取得などのブログの操作にはブログの操作のためのエンドポイント、ブログ記事の編集や削除のためにはブログメンバー操作のためのエンドポイントが用意されて、それぞれのエンドポイントに対してHTTPのGETやPOSTすることでブログをコントロールする。
ブログもAtom Pubに準拠することで開発が効率化されるメリットがある。(ただ、最近だと余り新規にブログを作成することってあるんだろうか疑問ではあるけれど。)
またAtom Pubに則った機能を実装しているブログに対してはAtom Pubに則って外部からアクセスすることでブログに記事を投稿したり編集削除したりすることが比較的簡単に出来る。
このAtom Pubに準拠しているブログとしてははてなブログやlivedoorブログがある
ここではAtom Punを使ってはてなブログに記事を投稿することを目標として、考え方をまとめておく。
はてなブログのAtom Pubについては下記に詳細が記載されているので参考にするとよい。
はてなブログAtomPub
基本的にブログにAtomPubで記事を投稿するためにはブログに対してHTTPのPOSTメソッドでデータを送信する必要がある。
WEBサイトにHTTPでPOSTするための基本的な手順を下記に記載しておく
//WEBサイトへのリクエストの準備
1.WebRequestクラスによりHTTPのリクエストオブジェクトを作成
//POSTするための設定
2.リクエストのMethodプロパティに「POST」を設定
3.ContentTypeプロパティに「application/x-www-form-urlencoded」を設定
ここでバイナリファイルを送りたい場合は、multipart/form-dataを指定しますがここでは解説しないので必要なら別途ググって欲しい。
4.ContentLengthプロパティに送信するポスト・データの長さを設定
//POSTするためのstreamの作成
5.リクエストのGetRequestStream()メソッドで書き込みのためのstreamオブジェクトを作成
//streamを使ってデータをWEBサイトに送信する
6.streamオブジェクトのwriteメソッドでデータをサイトに送信
//WEBサイトからレスポンスを取得する
7.リクエストのGetResponse()メソッドでレスポンスオブジェクトを作成
8.レスポンスのGetResponseStream()メソッドでレスポンスに対するstreamオブジェクトを作成
9.上記で得たstreamオブジェクトとエンコード情報を使ってStreamReaderオブジェクトを作成する
10.StreamRederオブジェクトのReadToEnd()メソッドでWEBサイトからのレスポンスを取得する
このうち2.〜6.がPOSTのための処理でWEBサイトに対してGET処理を行う場合には実はこの2.〜6.を省いた処理を行うことで可能だ。
以上がHTTPによるPOST処理の概略だ。
AtomPubによるデータ送信の仕組みは以上だけれども、その仕組みを使って送るデータはXMLにより作成する。
ブログに記事を投稿するにはブログ操作のためのエンドポイントに対して上記の様に記事データをPOSTによって送信する。
AtomPubでは記事の新規投稿以外にも記事一覧の取得や記事の編集削除などが可能になっている。
記事の新規投稿や一覧取得などのブログの操作にはブログの操作のためのエンドポイント、ブログ記事の編集や削除のためにはブログメンバー操作のためのエンドポイントが用意されて、それぞれのエンドポイントに対してHTTPのGETやPOSTすることでブログをコントロールする。
XML-RPCを使う方法
XML-RPCはXML形式のデータを使って外部からサイト内の手続きを呼び出すためのプロトコルでデータの転送にはHTTPを使用する。
ただ過去にあるブログシステムの実装で脆弱性が指摘されたりXML-RPCを利用した攻撃が多発したこともあり最近はXML-RPCの詳細がなかなか見つからない。
なので実際に使う場合は、色々な所に残った記述をたどっていくしかない。
AtomPubでは幾つかの作業用にエンドポイントが用意され、それぞれのエンドポイントに対して決められた操作を行うことでブログをコントロールした。
一方でXML-RPCは一つのエンドポイントのみ用意されて全ての操作はそのエンドポイントに対して処理をXML化したデータをHTTPでPOSTすることでサイトの手続きを呼び出す。
Seesaaブログ、FC2ブログなどの無料ブログでXML-RPCが提供されている。またWordPressでもXML−RPCが利用可能になっている。
またおなじXML-RPCと言っても色々なAPIがある。
ブログによってサポートしているAPIに違いがある。
基本的にBlogger APIとmetaWeblog APIをサポートしているブログが多い様に見える。
ただこのうちBlogger APIは私のパラメータの渡し方が悪かったのかタイトルが上手く表示されない。
そこで、ここではmetaWeblogによる新規投稿について記載しておく。
準備として
CookComputing.XmlRpc
をNuGetのパッケージ管理で入手しておく
そしてMetaWeblogのInterfaceを定義しておく
publishはtrueで投稿、falseで下書きになる
ここでPost構造体は、下記の様なもの
実際にブログに記事を投稿するステップは下記の様な感じになる
ここでSeesaaブログの様に同一ユーザーIDに対して複数ブログが開設できる場合は個々のブログをBlogIdで識別する
またSeesaaブログは戻り値がstringだがJUGEMやFC2はIntと細かい点で違いがある。
ただ過去にあるブログシステムの実装で脆弱性が指摘されたりXML-RPCを利用した攻撃が多発したこともあり最近はXML-RPCの詳細がなかなか見つからない。
なので実際に使う場合は、色々な所に残った記述をたどっていくしかない。
AtomPubでは幾つかの作業用にエンドポイントが用意され、それぞれのエンドポイントに対して決められた操作を行うことでブログをコントロールした。
一方でXML-RPCは一つのエンドポイントのみ用意されて全ての操作はそのエンドポイントに対して処理をXML化したデータをHTTPでPOSTすることでサイトの手続きを呼び出す。
Seesaaブログ、FC2ブログなどの無料ブログでXML-RPCが提供されている。またWordPressでもXML−RPCが利用可能になっている。
またおなじXML-RPCと言っても色々なAPIがある。
ブログによってサポートしているAPIに違いがある。
基本的にBlogger APIとmetaWeblog APIをサポートしているブログが多い様に見える。
ただこのうちBlogger APIは私のパラメータの渡し方が悪かったのかタイトルが上手く表示されない。
そこで、ここではmetaWeblogによる新規投稿について記載しておく。
準備として
CookComputing.XmlRpc
をNuGetのパッケージ管理で入手しておく
そしてMetaWeblogのInterfaceを定義しておく
public interface IMetaWeblog : IXmlRpcProxy
{
[XmlRpcMethod("metaWeblog.newPost")]
string newPost(string blog_id, string username, string password, Post content, bool publish);
}
publishはtrueで投稿、falseで下書きになる
ここでPost構造体は、下記の様なもの
public struct Post
{
public string title; //タイトル
public string description; //記事本文
public DateTime dateCreated; //投稿日時
public string[] categories; //カテゴリ
}
実際にブログに記事を投稿するステップは下記の様な感じになる
// Interfaceへのプロクシーを宣言してブログのエンドポイントURLを設定する
IMetaWeblog proxy = (IMetaWeblog)XmlRpcProxyGen.Create(typeof(IMetaWeblog));
proxy.Url = エンドポイントURLt;
//投稿記事を設定
Post post = new Post
{
dateCreated = 投稿日付,
title =タイトル,
description = 記事本文,
};
try
{
proxy.newPost(BlogId, UserName, PassWord, post, true);
}
catch (Exception ex)
{
MsgBox.Show(ex.Message);
}
ここでSeesaaブログの様に同一ユーザーIDに対して複数ブログが開設できる場合は個々のブログをBlogIdで識別する
またSeesaaブログは戻り値がstringだがJUGEMやFC2はIntと細かい点で違いがある。
RES APIを使う方法
REST APIとは、外部のシステムがRESTful Web サービスと通信を行うための手続き・規約である。
RESTfulなサービスとは、下記を満たすサービスのことを指す。
1.ステートレス
セッションの管理を行わない。そのため要求が独立して処理される。
2.統一インターフェース
全ての情報がURI/URLで一意に決められている
つまり全ての要求が統一したエンドポイントに対して行われ、AtomPubの様に操作に応じてエンドポイントが異なるようなことはない。
3.情報を操作する命令体系があらかじめ決められている
操作はHTTPにより行われ、要求や応答はJSON等を通して行われる
4.情報の一部に別の状態や別の情報への参照を含めることができる
詳細は、下記などを参考にして欲しい。
REST APIとは
ただRESTfulという考え方は厳密に言うと規約ではなく設計思想のようなものである。
ブログへの投稿と言う面ではWordPressがこのREST APIを実装し、WordPress.orgがC#用にWordPressPCLというLibraryも提供している。
ここではWordPressPCLを使ってRST APIを利用して新規投稿する方法の概略を記載する。
なお内容は下記による。
REST API Handbook
まずWordPressPCLの利用の前提として認証にJWT Authentication for WP REST APIプラグインを導入しておく。
プラグイン自体は直ぐに導入できるがWordPressの環境自体に下記の変更を行う。
1..htaccess の変更
.htaccessに下記の一文を追加しておく
2.wp-config.phpへの追加
次の2文をwp-config.phpの先頭に追加しておく
先頭におかないとプログラム実行時にエラーとなるので注意しておくこと
なおJWT_AUTH_SECRET_KEY は、https://api.wordpress.org/secret-key/1.1/salt/ を使って取得して書き換える。
また、パーマリンクをデフォルトにしているとなぜかエラーになるので変更しておくこと。
次にWordPressPCLをNuGetパッケージマネージャーを使ってVisual Studioにインストールし、usingにWordPressPCL、WordPressPCL.Modelsを追加しておく
エンドポイントのURLは、ブログのURL/wp-jsonになる
処理自体は比較的簡単で下記の様な流れになる(エラー処理は省いている)
RESTfulなサービスとは、下記を満たすサービスのことを指す。
1.ステートレス
セッションの管理を行わない。そのため要求が独立して処理される。
2.統一インターフェース
全ての情報がURI/URLで一意に決められている
つまり全ての要求が統一したエンドポイントに対して行われ、AtomPubの様に操作に応じてエンドポイントが異なるようなことはない。
3.情報を操作する命令体系があらかじめ決められている
操作はHTTPにより行われ、要求や応答はJSON等を通して行われる
4.情報の一部に別の状態や別の情報への参照を含めることができる
詳細は、下記などを参考にして欲しい。
REST APIとは
ただRESTfulという考え方は厳密に言うと規約ではなく設計思想のようなものである。
ブログへの投稿と言う面ではWordPressがこのREST APIを実装し、WordPress.orgがC#用にWordPressPCLというLibraryも提供している。
ここではWordPressPCLを使ってRST APIを利用して新規投稿する方法の概略を記載する。
なお内容は下記による。
REST API Handbook
まずWordPressPCLの利用の前提として認証にJWT Authentication for WP REST APIプラグインを導入しておく。
プラグイン自体は直ぐに導入できるがWordPressの環境自体に下記の変更を行う。
1..htaccess の変更
.htaccessに下記の一文を追加しておく
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
2.wp-config.phpへの追加
次の2文をwp-config.phpの先頭に追加しておく
先頭におかないとプログラム実行時にエラーとなるので注意しておくこと
define('JWT_AUTH_SECRET_KEY', 'your-top-secrect-key');
define('JWT_AUTH_CORS_ENABLE', true);
なおJWT_AUTH_SECRET_KEY は、https://api.wordpress.org/secret-key/1.1/salt/ を使って取得して書き換える。
また、パーマリンクをデフォルトにしているとなぜかエラーになるので変更しておくこと。
次にWordPressPCLをNuGetパッケージマネージャーを使ってVisual Studioにインストールし、usingにWordPressPCL、WordPressPCL.Modelsを追加しておく
エンドポイントのURLは、ブログのURL/wp-jsonになる
処理自体は比較的簡単で下記の様な流れになる(エラー処理は省いている)
var client = new WordPressClient(REST APIのエンドポイントのURL);
client.AuthMethod = AuthMethod.JWT;
client.RequestJWToken(ユーザーID, パスワード).Wait();
//認証を行う
var isValidToken = client.IsValidJWToken().Result;
client.SetJWToken(client.GetToken());
//認証が正しく実行されたら場合に
if (await client.IsValidJWToken())
{
Post entry = new Post();
entry.Title = new Title(タイトル);
entry.Content = new Content(記事内容);
var post = await client.Posts.Create(entry);