俺氏、本を読む

30歳になるまでに本を読んで勉強しようかと。主に啓発、お金についての本を読むつもり。一応プログラマーなのでその辺のことも。あと、せどり(転売)の仕入れ見込み商品をリサーチして仕入先と一緒に投稿します

【C#】XML-RPCでWordPressに記事と画像を投稿するサンプル

C#WordPressに記事と画像を投稿するサンプルコードです。
 
VSのバージョンと.NET Frameworkのバージョンは以下です。
Microsoft Visual Studio Express 2013 for Windows Desktop
.NET Framework 4.0(4.5だと確かうまく動かなかった記憶があるので)
 
プロジェクトの参照設定に「System.Web」「System.Drawing」を追加する必要があります。

あと、以下のページから「xml-rpc.net.2.5.0.zip」をダウンロードして使っています。

XML-RPC.Net - Downloads

ダウンロード後、解凍したら「xml-rpc.net.2.5.0」フォルダの中に
「bin」フォルダがあると思うので、その中の「CookComputing.XmlRpcV2.dll」を
プロジェクトの参照設定に追加してください。

エラーハンドリングとかは適当で動作確認もしてないですが、
動かなくても惜しいところまではいけるはずなので参考までに_(._.)_

XML-RPC用のクラスを作成

public class XmlRpcMgr
{

    public string DomainName;
    public string UserName;
    public string PassWord;

    public XmlRpcMgr()
    {
        DomainName = "";
        UserName = "";
        PassWord = "";
    }

    public XmlRpcMgr(string dName, string uName, string pass)
    {
        DomainName = dName;
        UserName = uName;
        PassWord = pass;
    }

    public struct WpContent
    {
        public string post_title;           // タイトル
        public string post_content;         // 本文
        public XmlRpcStruct terms_names;    // タクソノミー(分類)
        public string post_status;          // 投稿状態
        public DateTime post_date;          // 公開日付
    }

    public struct WpUploadFileData
    {
        public string name;     // ファイル名
        public string type;     // MIMEタイプ
        public byte[] bits;     // バイナリデータ
        public bool overwrite;  // 上書き
        public int post_id;     // 関連付ける記事のID?
    }

    public struct WpUploadFileResult
    {
        public string id;       // ID
        public string file;     // ファイル名
        public string url;      // URL
        public string type;     // MIMEタイプ
    }

    public interface IWordpress : IXmlRpcProxy
    {
        [XmlRpcMethod("wp.uploadFile")]
        WpUploadFileResult uploadFile(int blog_id, string username, string password, WpUploadFileData data);

        [XmlRpcMethod("wp.newPost")]
        string newPost(int blog_id, string username, string password, WpContent content);
    }

    public string XmlRpcMediaUp( string filePath, byte[] imgBytes)
    {
        string ret = "";


        //プロキシクラスのインスタンスを作成
        IWordpress proxy = XmlRpcProxyGen.Create<IWordpress>();
        proxy.Url = string.Format("http://{0}/xmlrpc.php", DomainName);

        WpUploadFileData data = new WpUploadFileData()
        {
            name = DateTime.Now.ToString("yyyyMMddHHmmssfff") + Path.GetFileName(filePath),
            type = "image/jpeg",
            bits = imgBytes
        };

        WpUploadFileResult result = proxy.uploadFile(1, UserName, PassWord, data);

        ret = result.url;

        return ret;
    }

    public bool XmlRpcAddEntry(string title, string body, string more, string cat, List<string> tagList)
    {
        bool ret = false;
        IWordpress proxy = XmlRpcProxyGen.Create<IWordpress>();
        proxy.Url = string.Format("http://{0}/xmlrpc.php", DomainName);

        WpContent content = new WpContent()
        {
            post_title = title,
            post_content = body + "<!--more-->" + more,
            terms_names = new XmlRpcStruct(),
            post_status = "publish",
            post_date = DateTime.UtcNow,
        };
        content.terms_names.Add("category", new string[] { cat });

        content.terms_names.Add("post_tag", tagList.ToArray());

        content.post_date = DateTime.UtcNow;

        proxy.newPost(1, UserName, PassWord, content);

        return ret;

    }
}

あとは以下のような使い方で、画像のアップロードと
記事の投稿ができる(はず)。

string domainName = "WordPressのドメイン名";
string userName = "WordPressの管理画面にログインするユーザー名";
string pass = "WordPressの管理画面にログインするパスワード";

string title = "記事タイトル";
string cat = "カテゴリ名";
List<string> tags = new List<string>() { "タグ1", "タグ2" };
string body = "記事本文";
string more = "記事追記";

string filePath = "画像のパス";
byte[] imgBytes;

using (FileStream fs = new FileStream(filePath, FileMode.Open))
using (Bitmap bmpData = new Bitmap(Image.FromStream(fs)))
using (MemoryStream memStm = new MemoryStream())
{
    // 保存フォーマットは任意
    bmpData.Save(memStm, System.Drawing.Imaging.ImageFormat.Jpeg);
    imgBytes = memStm.ToArray();

    memStm.Close();
    fs.Close();
}

// XML-RPC投稿用のクラスのインスタンス作成(接続用の情報もセット)
XmlRpcMgr xmlRpcMgr = new XmlRpcMgr(domainName, userName, pass);
// 画像ファイルをアップロード
string imgUrl = xmlRpcMgr.XmlRpcMediaUp(filePath, imgBytes);
// 記事にアップロード画像表示用のimgタグを設定
body += "<img src=\"" + imgUrl + "\">";
// 記事を投稿
xmlRpcMgr.XmlRpcAddEntry(title, body, more, cat, tags);