質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

2回答

2801閲覧

C#からPOSTでWordPRESSに投稿したい。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2015/06/14 07:33

いつもお世話になります。
以前に、WebBrowser(VisualStudio2010Express+Windows7+WindowsForm)のdocumentCompletedを使ってWordPRESSのセレクタを操作したい、(けれど失敗した)、という質問をした続きです。
https://teratail.com/questions/9341

その後も失敗していて、結局POSTで操作するしかないのかな、と考えています。
前回は、

記事投稿したいだけであればHTTP POST処理をC#側でしてあげればいいだけなのでは…?
System.Net名前空間にその手の処理に便利なクラスがたくさんあります。
通常利用であれば.NETクラスライブラリのWebClientクラスで必要十分な機能が得られます。

というようなご回答をいただきました。ありがとうございました。

そこで、POST処理について考えてみたいので、アドバイスをいただければと。

(1)POST処理をしている状態を確認するには、たとえばChromeを使うとどうすれば見ることができるか?
(2)C#のPOST処理のかんたんな実装のガイドになるようなURLを教えてほしい。
http://www.atmarkit.co.jp/fdotnet/dotnettips/318webpost/webpost.html
を見つけたのですが、これGoogle翻訳が新しくなっていてじっさいには現在は動作せず、動かして試すことができずにおります。
http://dobon.net/vb/dotnet/internet/webrequestpost.html
にはざっくり目を通しました。
あとは、(1)がわかればよいのかなとも思っているのですが、まったく初めてなので、取っかかりがない状態です。
ちなみにこのdobon.netの場合、試してみたところ「リモートサーバーに接続できません」とエラーになり、これもじっさいには現時点(2015/06/14現在)動作しないようです。

(3)WordPRESSへの投稿処理の大部分(テキスト書き込みとかcheckboxのチェックは、DocumentCompletedを使い、セレクタのみPOST処理というようなことは可能なのでしょうか? それとも全部POSTで作り直す必要あり?

以上3点、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。

「結局POSTで操作するしかないな」とのことですので、
やりたいこととしては、Webブラウザを介さずに自前のアプリケーションからWordpressの記事投稿などを行いたいという解釈で宜しいでしょうか?

やったことないのですが、WordpressにはWebAPIが用意されているようです。
http://wpdocs.osdn.jp/XML-RPC_WordPress_API

パケットの解析を行いながらWebブラウザコントロールでゴリゴリやっても出来るとは思いますが、
takutokさんが仰っているようにログインを行う必要がありますし、きっとクッキー/セッションなども意識しないといけない気がします。
WebAPIを叩くだけで投稿など出来るのあれば、こちらのほうが正攻法のような気がします。

#今はもうこのAPI使えないよ!なんてことであれば申し訳ないですが。

投稿2015/06/15 02:21

編集2015/06/15 02:31
Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/06/15 14:01

こんにちは。 コメントありがとうございます。いつもありがとうございます。 おっしゃるとおり、WordPRESSにはWebAPIがあります。 じつは、だいぶ前にたしかfc2blogだったか用に、投稿用のソフトを作ったことがあります。 ただ、これの問題は、そのWordPRESSにログインだったかアクセスするのだったかに、管理者権限が必要で、今回作ろうとしているものにわたしは管理者権限を持っていないので、残念ながら使えそうにない、という感じです。 おっしゃるとおりで、APIを叩くだけで投稿できるのなら、それがいちばん簡単で、正攻法だと思います。ログインやクッキー/セッションに関しては頭痛いのですが…。 現状で、WebBrowserを使って投稿とチェックボックスはできていて、できていないのがセレクタと画像のアップロード。ログインを引き継いで、POSTでセレクタの設定ができるのなら、そのくらいならPOSTでなんとかならないかな~、というのが現在のほのかな展望です。 まずはすこしPOSTで遊んでみて、それでやっぱりダメということになったら、またいろいろ相談しようと考えています。
guest

0

(1)デベロッパーツールでPOSTしたデータを確認できます。
http://blog.shutto.com/?p=1573

(2) (1)でPOSTデータとURLが分かれば動作確認できるのでは?

(3)DocumentCompletedを使ってもいいですし、データをPOSTするのも出来ます。どう作るかはアプリケーションをどう使用したいか次第ではないでしょうか。全部POSTで作るのであれば、WordPressにログインする部分も作る必要があります。

投稿2015/06/15 02:11

takutok

総合スコア392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/06/15 14:32

こんにちは。コメントありがとうございます。 (1)Chromeを使って、WordPRESSにアクセスしてみました。 ・Chromeを使って、WordPRESSにアクセスした。新規投稿を追加。 ・デベロッパーツールを起動する。 ・Networkタブを選択する。MethodはすべてGET。POSTはなし。 ・セレクタを選択する。とくにPOSTは増えず。 ・[下書きとして保存]してみる。 ・MethodにPOSTがひとつ増え、Nameはpost.phpとなった。 ・下記のようなWebページの項目に対して、次のようにPOSTしていることがわかった。 <select name="main_post_category[]" class="category_form_select" id="main-parent"> <option value="">-----------</option> <option value="2532">item1</option> <option value="2530">item2</option> <option value="2528" selected="selected">item3</option> </select> <select name="main_post_category[]" class="category_form_select" id="main-children-2528" style="display:block;"> <option value="">-----------</option> <option value="2936">subitem1</option> <option value="57" selected="selected">subitem2</option> <option value="317">subitem3</option> </select> ・POSTデータの該当部分。 post_category[]:57 the_post_category:57 main_post_category[]:2528 main_post_category[]: main_post_category[]: main_post_category[]: main_post_category[]:57 main_post_category[]: 以下くり返し なるほど。数字は入っているようだ。ただし、main_post_category[]:が複数回出ていて、大部分は空。なぜ大部分が空なのだろう。ひょっとして、大項目×小項目の数だけデータの有無に関係なく空のデータをPOSTする必要があるのかも。その場合、順番(つまり57を送信する順番)が重要なのかも。 次の疑問点。これを具体的にPOSTするにはどうしたらよいか? つまり、(2)の疑問ですね。 まだPOSTデータとURLはわかっても、動作確認に至らず、です。 また時間のあるとき自分でも試してみます。 今日はここまで。ありがとうございました。
退会済みユーザー

退会済みユーザー

2015/06/17 03:53

投稿してみました。テストで使用したコードは下記の通りです。 webBrowserとDocumentComletedを使ったWordPRESSへの投稿は成功しています。 いくつか手作業をしているところがあります。 (1)まず、DocumentCompletedから、直接category(string url)を呼んでみました。 //category(webBrowser.Url.ToString());//ここで投稿するとUrlに記事番号が入らない。 というコメントアウトしたところです。 コメントの通りで、webBrowser.Url.ToString()では、Urlには、記事番号(post=数字)の番号(41)が入らないのです。 (2)そこで、一度投稿し、そのあと、Loadで、webBrowser.Navigateをコメントアウトし、該当する記事のURLを貼って、categoryメソッドを手動で起動しています。 (3)それで、 private void Form1_Load(object sender, EventArgs e) { //URLにidとpwを入れる。 if (URL != "") URL = URL.Replace("//", "//" + basicID + ":" + basicpw + "@"); category(URL+ "?post=41&action=edit"));//記事番号付き } として実行すると、try-catchでエラーになり、 exception.Message = "リモート サーバーがエラーを返しました: (401) 許可されていません" ということでした。 POSTデータとURLはわかっているつもりなのですが、どこが違っているのでしょう。 ・URLにID/PWを入れた状態ではログインができないのか? ・そもそもWordPRESSはPOST操作を許可していないのか? ・送信するデータ(フィールド名と値の組み合わせ)を間違えているのか? ・それともまったく違う原因なのか? アドバイスいただければ幸いです。 using System; using System.Windows.Forms; namespace wpaccess { public partial class Form1 : Form { string URL = "http://server/wp-admin/post-new.php" public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //URLにidとpwを入れる。 if (URL != "") URL = URL.Replace("//", "//" + basicID + ":" + basicpw + "@"); webBrowser.Navigate(URL); //category(URL+ "?post=41&action=edit"));//記事番号付き } private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { //タイトル HtmlElementCollection titles = webBrowser.Document.All.GetElementsByName("post_title"); titles[0].InnerText = "[test]test[test]" + DateTime.Now.ToLongDateString() + DateTime.Now.ToLongTimeString(); //本文 HtmlElement textarea = webBrowser.Document.GetElementById("content"); textarea.InnerText = "[test]content send test[test]"; //保存 HtmlElementCollection inputs = webBrowser.Document.GetElementsByTagName("input"); foreach (HtmlElement input in inputs) { if (input.GetAttribute("value") == "下書きとして保存"){ input.InvokeMember("click"); break; } } //ここまでは正常に動作し、WordPRESSに投稿できる。 //category(webBrowser.Url.ToString());//ここで投稿するとUrlに記事番号が入らない。 Close(); } private void category(string url) { try { System.Net.WebClient wc = new System.Net.WebClient(); //NameValueCollectionの作成 System.Collections.Specialized.NameValueCollection ps = new System.Collections.Specialized.NameValueCollection(); //送信するデータ(フィールド名と値の組み合わせ)を追加 ps.Add("post_category[]", "57"); ps.Add("the_post_category[]", "57"); ps.Add("main_post_category[]", "2528"); //データを送信する byte[] resData = wc.UploadValues(url, ps); wc.Dispose(); } catch (Exception exception) { string error = url + exception.Message; } } } }
takutok

2015/06/17 06:02

WordPressでベーシック認証のパラメータつけてPOSTしたことないので、401の原因が何かは分かりませんでした。 POST先のURLは post.php?post=41&action=edit ではなく、post.php だと思います。 記事番号の指定は、post.php の POSTデータに、post_ID:41 というパラメータを追加すればよいのかと。 他にもPOSTに必要なパラメータはあると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問