【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.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);