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

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

ただいまの
回答率

89.07%

C#のWebブラウザを使って、WordPRESSを操作したいと思っています。

受付中

回答 1

投稿

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

退会済みユーザー

VisualStudio2010 C#でWindows7で開発しています。

C#のWebブラウザを使って、WordPRESSを操作したいと思っています。
DocumentCompletedのイベントで、

//タイトル
HtmlElementCollection titles = webBrowser.Document.All.GetElementsByName("post_title");
if (0 < titles.Count)
    titles[0].InnerText = ''タイトル";

//セレクター
HtmlElementCollection selectors = webBrowser.Document.GetElementsByTagName("select");
foreach (HtmlElement selector in selectors) {
    if (selector.GetAttribute("id").Contains("main-selector")) {
        selector.SetAttribute("selectedindex", "3");

//チェックボックス
HtmlElement checkbox = webBrowser.Document.GetElementById("category");
if (checkbox != null) {
    //checkbox.InvokeMember("click");
    checkbox.SetAttribute("checked", "");
}

//保存
HtmlElementCollection inputs = webBrowser.Document.GetElementsByTagName("input");
foreach (HtmlElement input in inputs) {
    if (input.GetAttribute("value") == "下書きとして保存") {
        input.InvokeMember("click");
        break;
    }
}
というように処理をしています。
これで、タイトルの書き込みと保存はできているのですが、セレクタの選択と、チェックボックスのチェックができないでいます。

原因究明or手順などのアドバイスをいただければ助かります。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • Tak1wa

    2015/05/03 01:46

    WordPressのどの部分でしょうか。記事投稿ですか?

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2015/05/03 20:37

    はい。記事投稿です。

    キャンセル

回答 1

+1

大雑把にしか試していないので何ともですが、おそらくセレクタの件はselectedindexという存在しない属性に設定しようとしているからだと思います。
selectedIndexはJavaScriptにおいてHTMLSelectElementが持つプロパティの一つだったと記憶しています。
HtmlElementCollection selectors = webBrowser.Document.GetElementsByTagName("select");
foreach (HtmlElement selector in selectors)
{ 
    if (selector.GetAttribute("id").Contains("main-selector"))
    {
        // コメントノード等含まれている場合に備えて
        // Cast<T> よりも OfType<T> の方がいいかもしれません。
        var options = selector.Children.Cast<HtmlElement>().ToArray();
        if (options.Length > 4)
            options[3].SetAttribute("selected", "true");
    }
}

チェックボックスについても、おそらくHTMLのノリで
<input type="checkbox" id="category" checked>
となることを期待したのでしょうが、XHTMLでは
<input type="checkbox" id="category" checked="checked"/>
となる必要があります。
従って、
HtmlElement checkbox = webBrowser.Document.GetElementById("category");
if (checkbox != null) {
    checkbox.SetAttribute("checked", "checked");
}
こうなります。
一応これで必要最低限のHTMLで書いた環境では問題なく動きましたが、いかがでしょうか。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/05/03 23:29

    takeshi2015さんのコメントを読み返して思ったのですが、
    記事投稿したいだけであればHTTP POST処理をC#側でしてあげればいいだけなのでは…?
    WP使ったことがないので具体的な通信内容は知りませんが、POSTでパラメータを投げれば普通に考えて投稿できるはずです。
    System.Net名前空間にその手の処理に便利なクラスがたくさんあります。

    キャンセル

  • 2015/05/04 13:48

    htsignさん、コメント&検証ありがとうございます。

    思いつく限り、("", "false"、コメントアウトしておいたInvokeMember-clickなど)いろいろ試したのですが、どうしてもうまくいかないのです。

    最初に書いたとおり、タイトル(や本文など)は埋め込みできて、投稿できているのですが、このセレクタとチェックボックスだけうまくいかず、結局C#のソフトである程度本文を書いて投稿したあと、WordPRESSでセレクタを選んだりというのを手作業しています。(あと画像も手作業してますね)。
    WordPRESS+ブラウザは動作が不安定で重たく、スクロールしないと全貌が見えず、手作業が多すぎるので、できるだけ楽したい、というのがC#から投稿したいという意図です。

    JavaScrpitコードを埋め込む、というのもなるほどと思いました。なるほど。

    基本的には投稿したいだけです。
    POST処理はいちども使ったことがなく、おっしゃるとおり、いろいろあることは漠然と知っているだけで、いまのところ取っかかりがない感じです。

    いろいろ感謝します。ありがとうございます。

    キャンセル

  • 2015/05/04 13:58

    そのシステムの内容にもよるのですが、よくあるものとしては、
    認証画面に対してユーザIDとパスワードのセットをPOSTするとトークンが返ってくるので、そのトークンを使って投稿したい内容と一緒にPOSTする、という感じです。
    通信内容に関しては、通常のウェブブラウザの開発者コンソール(通常F12で表示できます)を使ったり、Fiddler等のローカルプロキシを間に挟んだりして見られます。
    ブラウザでいつも通り投稿すれば一連の通信内容がログに溜まっていきます。
    そしてこれらをC#で再現すれば同じような投稿が可能になります。
    私はこの手の処理にはHttpWebRequest/HttpWebResponseを自分でラップした独自クラスを使っていますが、通常利用であれば.NETクラスライブラリのWebClientクラスで必要十分な機能が得られます。

    キャンセル

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

  • ただいまの回答率 89.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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