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

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

ただいまの
回答率

90.48%

  • C#

    7451questions

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

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

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,103
退会済みユーザー

退会済みユーザー

いつもお世話になります。
以前に、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点、よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/15 23: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 12: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;
    }
    }
    }
    }

    キャンセル

  • 2015/06/17 15:02

    WordPressでベーシック認証のパラメータつけてPOSTしたことないので、401の原因が何かは分かりませんでした。

    POST先のURLは post.php?post=41&action=edit ではなく、post.php だと思います。
    記事番号の指定は、post.php の POSTデータに、post_ID:41 というパラメータを追加すればよいのかと。
    他にもPOSTに必要なパラメータはあると思います。

    キャンセル

0

こんにちは。

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/15 23:01

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

    キャンセル

関連した質問

同じタグがついた質問を見る

  • C#

    7451questions

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