wordpres に XML-RPC で画像を投稿する

以前、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] と書いておくだけで、目次に展開してくれるというプラグインが作れます。こっちは別の記事で紹介します。

カテゴリー: 開発, Wordpress パーマリンク

wordpres に XML-RPC で画像を投稿する への1件のコメント

  1. ロイズキッス のコメント:

    同じところではまっていましたが、このページのお蔭で助かりました。
    base64エンコードしなくてよかったんですね・・・またお邪魔します。

コメントは停止中です。