以前、XML-RPC を使って wordpress に投稿するツールを作ったのですが、画像も投稿できないと意味がないですよね…ということで、画像の投稿(というか、ファイルアップロード)のツールを作成しています。
XML-RPC wp ≪ WordPress Codex
http://codex.wordpress.org/XML-RPC_wp#wp.uploadFile
を見ると、データ形式が base64 になっていて、一見 BASE64 でエンコードをしないと駄目なような気がしますが、実は違います。これは XML-RPC 内で作られるフォーマットなので、BASE64 形式の文字列を送るのではなくて、バイナリを BASE64 で送る(CDATA を使う)っていう意味なんですね。
ちょっとハマりました。
ソースは抜粋だけアップしておきます。後で整理して、
- 記事本体の投稿(WpPost)
- 画像ファイルの投稿(WpUpFile)
の2つのツールを公開します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | /// <summary> /// 新しい画像を投稿する /// </summary> /// <param name="post">投稿記事</param> /// <returns>投稿した記事のID</returns> public RetUpFile NewImage(ImageFile post) { //プロキシクラスのインスタンスを作成 IBlogger proxy = (IBlogger) CookComputing.XmlRpc.XmlRpcProxyGen.Create( typeof (IBlogger)); //URLを指定 proxy.Url = this .Url; // ファイル名を小文字に変換 post.Filename = post.Filename.ToLower(); // UpFile を生成 UpFile upfile = new UpFile(); upfile.name = post.Filename; upfile.type = "image/jpeg" ; upfile.bits = null ; upfile.overwrite = true ; // ファイルを読み込む long len = new FileInfo(post.Filename).Length; byte [] data = new byte [len]; BinaryReader rd = new BinaryReader( File.OpenRead( post.Filename )); rd.Read(data, 0, ( int )len); rd.Close(); // BASE64に変換しない // upfile.bits = Convert.ToBase64String(data); upfile.bits = data; // ファイルタイプを変更 if ( upfile.name.EndsWith( ".jpg" ) || upfile.name.EndsWith( ".jpeg" ) ) { upfile.type = "image/jpeg" ; } else if ( upfile.name.EndsWith( ".png" ) ) { upfile.type = "image/png" ; } else if ( upfile.name.EndsWith( ".gif" )) { upfile.type = "image/gif" ; } RetUpFile ret; try { //blogger.getRecentPostsを呼び出す ret = proxy.uploadFile( "1" , // 念のため1にしておく this .Username, this .Password, upfile ); } catch (Exception ex) { Console.WriteLine( "エラー:" + ex.Message); return null ; } return ret; } } |
この手のツールを作っているのは、実は wordpress で 300 ページ位の記事をアップできないか?と考えたわけです。
ブログを適度に書くぐらいであれば、ブラウザ上でもいいのですが、ある程度まとまった記事であればオフラインで書きたい。
そこでオフラインエディタの BlogWrite や Windows Live Writer などを使っていたのですが、どうも記事本体の編集だけに集中できない。様々な装飾が邪魔なんですね。
記事を書くときには、2つのタイプがあって、
- 記事本体(本文)に集中するためにエディタで書く。
- 記事のレイアウトを整えるために GUI ベースのツールを使う。
例えば、書籍で云えば、最初のが「著者」、次のが「編集者」あるいは「DTP」ってことです。
BlogWrite なんかのツールは、文章を書くことと、レイアウトと整えることが同時にできる、のが非常に利点なのですが、逆に画像がどうのレイアウトがどうの、と気になってしまったときには「著者」の頭に切り替えづらいという欠点があります。
ま、どのようなタイプの本を書くのかというで別かもしれませんが、BlogWrite を使っているときの問題として、
コードを表示するプラグインのタグ [ code]…[/code] を非常に書きづらい、
という大きな欠点があります。今までブラウザ上でちまちま直したり、Windows Live Writer に切り替えてみたりとしたのですが、本来 HTML タグではないものは(当たり前ですが)オフラインのブログエディタが認識しないので、無理といえば無理な話ですよね。
という訳で、もう一度、エディタに立ち返ってみよう、という感じです。
そんな訳で、
1.QX エディタで文章を書く。
2.perl を使って HTML タグに変換([ code]タグなんかは残す)
3.WpPost, WpUpfile のようなツールで wordpress にアップロード
な流れで現在書いています。
ローテクですが、枯れた技術(テキストエディタ、perl)を使うとそれなりに作れますね。コマンドライン版ですがw
~~
wordpres の独自タグを使わずに、<code>…</code>で記述した後に、wordpress 側で Javascript で判別、なんてことでもいいんですけど、プラグイン作成時のお手軽さが失われるのが残念でして。
wordpress の拡張タグのプラグインは非常に簡単にできて、
1 2 3 4 5 | function manabook_index( $attss ) { ... return $links ; } add_shortcode( 'manabook_index' , 'manabook_index' ); |
な感じでショートコードを作成して plugins に放り込んでおけば、
記事に [manabook_index] と書いておくだけで、目次に展開してくれるというプラグインが作れます。こっちは別の記事で紹介します。
同じところではまっていましたが、このページのお蔭で助かりました。
base64エンコードしなくてよかったんですね・・・またお邪魔します。