ページ 11

C#の言語からAjax通信

Posted: 2014年9月09日(火) 00:51
by akai777suzu
http://detail.chiebukuro.yahoo.co.jp/qa ... 1135200026

上記のサイトでも質問したのですが、C#の言語からAjax通信を送信する方法を知りたいという内容です。

FireFoxのFirebugというソフトである処理を解析した結果Ajax通信(XMLHttpRequest)を行っていることがわかりました。
Firebugのツールを使用している時でもURLを再送信できたので何かしらの方法で行えばできるのかなと考えています。

もしかすると間違った話かもしれませんが回答の方よろしくお願いします。

Re: C#の言語からAjax通信

Posted: 2014年9月09日(火) 03:36
by YuO
akai777suzu さんが書きました:C#の言語からAjax通信を送信する方法を知りたいという内容です。
FireFoxのFirebugというソフトである処理を解析した結果Ajax通信(XMLHttpRequest)を行っていることがわかりました。
Firebugのツールを使用している時でもURLを再送信できたので何かしらの方法で行えばできるのかなと考えています。
AjaxやXMLHttpRequestであることにこだわりはあるのでしょうか。
Ajax (Asynchronized, JAvascript, Xml) にこだわるなら,WebBrowserコントロールに JavaScript (というかJScript) で XHR を操作するようなコードを送り込んで,データを取得することになりますが,
単純に情報を取得するだけであれば,のようなクラスを使えば取得できますし,非同期であることも,これらのクラス群の非同期取得系メソッド (HttpClient では非同期しかありませんが) を呼び出すことで非同期取得が可能です。
また,これらのクラスの非同期系メソッドはTaskを返すものが用意されているので,async/awaitを使った記述も可能です。

Re: C#の言語からAjax通信

Posted: 2014年9月09日(火) 07:13
by akai777suzu
回答ありがとうございます。



string script = @"var ajax = null;
ajax = new XMLHttpRequest();
ajax.open('GET','https://nextool.travel.yahoo.co.jp/room ... 0909',true);
ajax.send(null);";

webBrowser.Url = new Uri(string.Format(@"javascript:{0}", script));

Re: C#の言語からAjax通信

Posted: 2014年9月09日(火) 07:23
by akai777suzu
回答ありがとうございます。

私の希望としてはWebBrowserクラスを使ってどうにか実装できないかと考えています。

それはなぜかというと、一度HttpWebRequestクラスのCookieContenerを使って実装した際、不具合らしきものでYahooサイトの自動ログインができませんでした。
その他2つのクラスは試したことがないのでわかりませんが、もし自動ログインからXMLHttpRequest送信ができるサンプルがありましたらよろしくお願いします。

本題のWebBrowserの件ですが実は以下のソースを一度試したのですがうまくいきませんでした。
YuO 様が想定されているjavascriptを送るというのはどのような形のコーディングなのでしょうか。
申し訳ないですができたら返信お願いします。
string script = @"var ajax = null;
ajax = new XMLHttpRequest();
ajax.open('GET','https://nextool.travel.yahoo.co.jp/room ... pdate_byid?                      BKG_COUNT=0&FROM=20140909&ROOM_CD=RM0000009748&SELLING_FLG=1&STOCK=2&TO=20140909',true);
ajax.send(null);";

webBrowser.Url = new Uri(string.Format(@"javascript:{0}", script));

Re: C#の言語からAjax通信

Posted: 2014年9月09日(火) 08:32
by ookami
webBrowser.Navigate("javascript:スクリプト")
ではどうでしょうか?

Re: C#の言語からAjax通信

Posted: 2014年9月09日(火) 10:27
by akai777suzu
>ookami様

先程その方法も試してみましたが、できませんでした。
以前からURLにjavascript入力して実行するとjavascriptが実行されるという所までは調べていたのですが、ブラウザからではXMLHttpRequestの処理は実行できませんでした。

もしかするとなのですが、javascriptのコードそのものに原因があるのではないかと少し考えています。

ただ、Ajaxは未経験なため間違っている可能性もありますが。。。

Re: C#の言語からAjax通信

Posted: 2014年9月09日(火) 11:43
by YuO
基本的には System.Windows.Controls.WebBrowser.NavigateToStringを使って,文字列によるHTMLをWebBrowserに渡すことで実行することを想定していました。
ただし,実質的にクロスドメインリクエストですから,Cross-Origin Resource Sharing (CORS) の仕様に沿ったリクエストをするか,JSONPのような逃げ方をする必要があるでしょう。

ちょっと探してみましたが,WebBrowserコントロールを使って自動ログイン機能を実装する - 酢ろぐ!にある,InvokeScriptメソッドでevalすれば,クロスドメインは問題にならないかと思います。
オフトピック
そもそもAPI提供のあるサイトなので自動ログインを提供してよいか疑問を感じるところですが……

Re: C#の言語からAjax通信

Posted: 2014年9月09日(火) 17:19
by ookami
ソースを改めて見て気付いたのですが、
.NetのWebBrowserはほぼIEなのでXMLHttpRequestが使えないかもです。
http://lostlinksearch.net/blog/2012/02/ ... %e3%83%bc/

Re: C#の言語からAjax通信

Posted: 2014年9月09日(火) 19:18
by akai777suzu
>ookami様

返信ありがとうございます。
その資料が本当なのであればIEをベースに作られているWebBrowserでは対処できませんね。

一度その処理を追加してみましたが、それでもできないみたいです。

本当どうしたものか。。。

>YuO 様

返信ありがとうございます。

少し難しい言葉が出てきて困惑しましたが、InvokeScriptを使用してjavascriptを実行したら良いということで良いでしょうか。

それも少しやってみているのですが、一向に問題が解決しませんでした。
そもそも私のInvokeScriptの使い方が間違っている気がするのですが。

InvokeScriptには関数の名称を入れてあげると思われるのですが、そのjavascriptのコードはどうやって入れてあげるのかがわかりません。

まとまっていないまま返信になりますがよろしくお願いします。

Re: C#の言語からAjax通信

Posted: 2014年9月09日(火) 21:54
by YuO
akai777suzu さんが書きました:その資料が本当なのであればIEをベースに作られているWebBrowserでは対処できませんね。
XHRをIEが直接サポートしていなかったのはIE6までです。
現状,IE11下のWebBrowserコントロールはIE7扱いのUserAgent文字列になっていますし,document.write(!!window.XMLHttpRequest)はtrueです。
akai777suzu さんが書きました:InvokeScriptには関数の名称を入れてあげると思われるのですが、そのjavascriptのコードはどうやって入れてあげるのかがわかりません。
前の投稿にも書きましたし,酢酸さんのサイトにも書いてありますが,関数名はevalを渡し,処理内容を第2引数として渡します。
evalはコードを解釈して実行しますから,そのままコードを実行してくれます。

Re: C#の言語からAjax通信

Posted: 2014年9月09日(火) 22:56
by akai777suzu
>YuO様

WebBrowserがIE6以前のものではないためXMLHttpRequestが使えることは理解できました。

酢酸さんのサイトというのはログイン処理のことではないのでしょうか?

ログイン処理に関しては既にWebBrowserでログインはできていますので大丈夫です。

一度以下の処理でもやってみました。

string script = @"var ajax = null;
ajax = new XMLHttpRequest();
ajax.open('GET','https://nextool.travel.yahoo.co.jp/room ... pdate_byid?                      BKG_COUNT=0&FROM=20140909&ROOM_CD=RM0000009748&SELLING_FLG=1&STOCK=2&TO=20140909',true);
ajax.send(null);";
string[] s = new string[1];
s[0] = script;
webBrowser.Document.InvokeScript("eval", s);

一応この処理で実行してみましたがダメでした。
javascriptを第2引数にもっていってevalで実行してもらうようなイメージで書いてみましたができませんでした。

Re: C#の言語からAjax通信

Posted: 2014年9月09日(火) 23:28
by YuO
根本的な話として,
akai777suzu さんが書きました:一応この処理で実行してみましたがダメでした。
javascriptを第2引数にもっていってevalで実行してもらうようなイメージで書いてみましたができませんでした。
この,「ダメでした」「できませんでした」は,実際にどのような状態になったのですか。

例えば,実際に通信をFiddlerでキャプチャするなどして,
  • 何らかの構文エラーになる
  • XHRによる通信がそもそも行われていない
  • XHRのリクエストがおかしい
  • XHRに対するレスポンスがおかしい
といった,問題の切り分けを行っていますか。
akai777suzu さんが書きました:酢酸さんのサイトというのはログイン処理のことではないのでしょうか?
書いてあることはログインを題材にしていますが,内容を理解すれば,
(WP7のですが) WebBrowser コントロールに対して任意のJavaScriptを実行する方法が書かれていることに等しいです。

Re: C#の言語からAjax通信

Posted: 2014年9月09日(火) 23:47
by ookami
XMLHttpRequest使えるのですね... 失礼しました。
YuOさんも言われていますが切り分けをしてほしいです。
IEで(普通にブラウザとして起動して)目的のページを開いた状態で、(バージョンによりますが)F12、Ctrl+2と押すとコンソールが開きます。一番下のプロンプト「>」部分に上記のJavascriptを入力して実行したときのエラーメッセージを教えてください。

Re: C#の言語からAjax通信

Posted: 2014年9月10日(水) 00:23
by akai777suzu
順番前後しますが、早く回答できそうなookami様から回答させて頂きます。
>ookami様
以下のようなエラーが返ってきました。
結果は「undefined」でした。
これで何かわかりそうであればよろしくお願いします。
var ajax = null;
ajax = new XMLHttpRequest();
ajax.open('GET','https://nextool.travel.yahoo.co.jp/room ... 0910',true);
ajax.send(null);
undefined

Re: C#の言語からAjax通信

Posted: 2014年9月10日(水) 01:37
by akai777suzu
>YuO様

Fiddler使ってみましたが、どこにエラーが出ているのかわかりませんでした。。。

Visual Stdio上では、以下の処理を入れ替えたりしながら流しています。
実行した際、特にエラーなく実行がされます。

// ログイン処理
webBrowser.Navigate("https://login.bizmanager.yahoo.co.jp/lo ... sword=test");
// 遷移が終了するまで処理を停止
Wait(webBrowser);

string script = @"var ajax = null;
ajax = new XMLHttpRequest();
ajax.open('GET','https://nextool.travel.yahoo.co.jp/room ... O=20140910'
,true);
ajax.send(null);";
string[] s = new string[1];
s[0] = script;
webBrowser.Document.InvokeScript("eval", s);
// ↓今までこの処理で何度か試しました。
//webBrowser.Document.Write(script);
//webBrowser.Url = new Uri("javascript:" + script);
//var xhrwebBrowser.Navigate("javascript:" + script);


基本的にはInvokeScriptメソッドを使えばいけるということなんですね。

Re: C#の言語からAjax通信

Posted: 2014年9月10日(水) 10:00
by ookami
この場合の「undefined」はエラーではなく、最後に実行した文の戻りがundefinedということなので、問題ないです。
他に特に(赤字とかで)表示されたわけでないなら、送るまでのエラーはないですね。
少なくとも相手のサーバにリクエストが届いているはずです。

上記で「undefined」と表示された後、
ajax.responseText
ajax.readyState
ajax.status
と順に実行すると状態が見れると思います。それも貼ってください。

Re: C#の言語からAjax通信

Posted: 2014年9月10日(水) 10:53
by YuO
ookamiさんへの返信を見る限り,JavaScriptについての知識がそもそも不足しているように思います。
XHRの使い方もわかっていないように見えますし。
また,何らかのサイトの動作を真似たいのであれば,HTTPについての知識も当然必要になってきますが,これも不足しているように思います。

このプログラムを作る前に,自分でXHR使ったHTML + JavaScriptのサイトを作ってみることをお薦めします。

akai777suzu さんが書きました:以下のようなエラーが返ってきました。
結果は「undefined」でした。
どこに「エラー」があるのでしょうか。
XHRのsendメソッドは戻り値を返しません。
なので,単純に最後のメソッドの戻り値としてundefinedと出ているだけでしょう。
ref)
オフトピック
EcmaScriptのCompletion Specification Typeがわからず苦労した……。
returnやthrowがないとstatementの評価結果のtypeがnormalになり,[[call]]の規則により関数の戻り値がundefinedになる,ということ
akai777suzu さんが書きました:Fiddler使ってみましたが、どこにエラーが出ているのかわかりませんでした。。。
Fiddlerの出力の意味を分かって使っていますか。
Configure Fiddler to Decrypt HTTPS Trafficの設定すらせずにやっているところを見ると,意味も分からずに使っているだけのようですが……。

Fiddlerで見ることができるのは,HTTP/HTTPS通信の内容です。
Filterを正しく設定すれば,表示する通信をある程度絞り込むことができます。
XHRの通信部分を見れば,RequestとResponseがわかるので,そこで先に書いた
  • XHRによる通信がそもそも行われていない
  • XHRのリクエストがおかしい
  • XHRに対するレスポンスがおかしい
の切り分けができます。
そもそもXHRの通信自体は正しい,という結果もありそうですが。

Re: C#の言語からAjax通信

Posted: 2014年9月10日(水) 11:19
by akai777suzu
>ookami様

ajax.responseText →何も表示なし
ajax.readyState→「4」
ajax.status→「500」

以上の結果がでました。

alert()の中に入れて表示してみましたので間違いはないと思います。

Re: C#の言語からAjax通信

Posted: 2014年9月10日(水) 12:07
by akai777suzu
>YuO様

確かにjavascriptにしてもAjaxにしても理解していない所が多いです。

YuO様の言われている通り一回PHPでも使ってAjax通信のやりとりを一通りを勉強してみようと思います。

Ajax通信が成功したことがわかったらjavascriptを実行させる処理を作れるようにしていきたいと思います。

Fiddlerの件ですが確かに使い方がまだわかってないです。
一応ookami様のツールでも同じようなことができそうなのでookami様の紹介してくださったツールでいってみようかと考えています。

因みに載せている画像に関してはFireFoxでの成功しパターンの画像になっておりますので通信そのものは成功していると思います。
ややこしい写真をアップして申し訳ありませんでした。

Re: C#の言語からAjax通信

Posted: 2014年9月10日(水) 14:25
by ookami
「HTTP 500」等で検索すると分かりますが、レスポンスのステータスが500というのは「サーバ内部エラー」になります。

前述の通り「相手のサーバにリクエストが届いている」のは合っていて、
そのリクエストへのレスポンスとして、サーバ(nextool.travel.yahoo.co.jp)がエラーを返してきています。
サーバが何をエラー扱いしているかは、サーバアプリを作った人にしか分かりません。

ただ、Firebugで試されたときにはうまくいったとのことですから、
リクエストのパラメータに有効期限やハッシュが含まれていて、マッチしなければ不正アクセス扱いされているとか、その辺かなと。

Re: C#の言語からAjax通信

Posted: 2014年9月10日(水) 15:57
by akai777suzu
>ookami様

500のエラーはサーバ側のエラーなんですね。

FireFoxで再送信で成功した件ですが、以前更新処理を行った際のURL?を再送信しただけなので成功してもおかしくなかったと思います。
1つ目の画像がその際の画像になります。

先程FireBugでもコンソールという箇所があったので確認しましたがこちらでも500エラーが表示されました。
それが2つ目の画像になります。

ookami様が言うのが正しいのであればAjax通信で使用しているURLが正しくないということですかね。
FireBugで「URL付きパラメータ」が取得できるのでこれを使用してAjax通信を行えばいけるというのは少し的外れだったのかもしれませんね。

Re: C#の言語からAjax通信

Posted: 2014年9月10日(水) 22:19
by ookami
おそらくですが、リクエストを送る前後の処理も含めて検討しないと、目的の情報が得られない気がします。
パラメータつきURLがページ内でJavaScriptによって生成されているとしたら、その処理ごと実行する、とかですね。
不正アクセスと判定されないかちょっと心配ではありますが...

Re: C#の言語からAjax通信

Posted: 2014年9月12日(金) 15:23
by akai777suzu
>ookami様

ookami様が回答されていると通り、javascriptで作られているものかもしれません。

一度FireBugでHTMLが見れたので見てみましたが、そのHTML内の中身のPOST値だけでは実行は成功しませんでした。

先程、付属されているjavascriptとHTMLが取れましたのでここにアップしようと思います。

Re: C#の言語からAjax通信

Posted: 2014年9月12日(金) 15:36
by akai777suzu
HTMLの方が抜けていましたので再アップ


<script type="text/javascript" src="/assets/js/script/room_offeradj.js?1410250369"></script> <script type="text/javascript" src="/assets/js/script/facility_field_length.js?1410250369"></script> <script type="text/javascript" src="/assets/js/script/count-length.js?1410250369"></script> <div id="contents" class="room_offer"> <div id="main"><div id="adjust"><h2 class="wrap_text">【喫煙】</h2> <dl class="lb"> <dt>販売ステータス(一括)</dt> <dd><input name="SELLING_FLG" type="radio" value="0" id="rom_status01" /><label for="rom_status01">ステータスを変えない</label></dd> <dd><input name="SELLING_FLG" id="rom_status02" type="radio" value="1" checked='checked' /><label for="rom_status02">販売</label></dd> <dd><input name="SELLING_FLG" id="rom_status03" type="radio" value="2" /><label for="rom_status03">売止(キャンセル再販なし)</label></dd> </dl> <dl class="lb"> <dt>期間の設定</dt> <dd> <span class="err_date" style="color:red"></span> <select name="PROVIDE_FROM_YYYY"> <option value="2014" selected="">2014</option> <option value="2015">2015</option> <option value="2016">2016</option> </select> 年 <select name="PROVIDE_FROM_MM"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9" selected="">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> </select> 月 <select name="PROVIDE_FROM_DD"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12" selected="">12</option> <option value="13">13</option> <option value="14">14</option> <option value="15">15</option> <option value="16">16</option> <option value="17">17</option> <option value="18">18</option> <option value="19">19</option> <option value="20">20</option> <option value="21">21</option> <option value="22">22</option> <option value="23">23</option> <option value="24">24</option> <option value="25">25</option> <option value="26">26</option> <option value="27">27</option> <option value="28">28</option> <option value="29">29</option> <option value="30">30</option> <option value="31">31</option> </select>日 ~ <select name="PROVIDE_TO_YYYY"> <option value="2014" selected="">2014</option> <option value="2015">2015</option> <option value="2016">2016</option> </select> 年 <select name="PROVIDE_TO_MM"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9" selected="">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12">12</option> </select> 月 <select name="PROVIDE_TO_DD"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> <option value="11">11</option> <option value="12" selected="">12</option> <option value="13">13</option> <option value="14">14</option> <option value="15">15</option> <option value="16">16</option> <option value="17">17</option> <option value="18">18</option> <option value="19">19</option> <option value="20">20</option> <option value="21">21</option> <option value="22">22</option> <option value="23">23</option> <option value="24">24</option> <option value="25">25</option> <option value="26">26</option> <option value="27">27</option> <option value="28">28</option> <option value="29">29</option> <option value="30">30</option> <option value="31">31</option> </select>日 </dd> </dl> <dl class="lb"> <dt>提供室数の変更</dt> <dd><span class="err_stock" style="color:red"></span> <input type="text" class="stay count-length" name="STOCK" value="1" maxlength="3" data-type="numeric" />室(予約室数0室) </dd> </dl><input name="STOCK_RESET" type="checkbox" class='chkStockReset' id="stock_reset" value="" /><label for="stock_reset">残室数を0にする</label> <input type="hidden" name="ROOM_CD" value="RM0000009748" /> <input type="hidden" name="BKG_COUNT" value="0" /> <input type="hidden" name="from_form" value="room_offer" /> <input type="hidden" class="booking_count" value="0" /> <div id="btnSt"> <ul> <li><a href="javascript:void(0);" class="save mdClose">変更しないで閉じる</a></li> <li><a href="javascript:void(0);" class="entry">登録する</a></li> </ul> </div> </div> </div> </div>

Re: C#の言語からAjax通信

Posted: 2014年9月12日(金) 17:20
by akai777suzu
前画面のHTMLが読みにくいのでインデント等を使ってきれいにしてみました。

<script type="text/javascript" src="/assets/js/script/room_offeradj.js?1410250369"></script>
<script type="text/javascript" src="/assets/js/script/facility_field_length.js?1410250369"></script>
<script type="text/javascript" src="/assets/js/script/count-length.js?1410250369"></script>
<div id="contents" class="room_offer">
<div id="main">
<div id="adjust">
<h2 class="wrap_text">【喫煙】</h2>
<dl class="lb">
<dt>販売ステータス(一括)</dt>
<dd>
<input name="SELLING_FLG" type="radio" value="0" id="rom_status01" />
<label for="rom_status01">ステータスを変えない</label>
</dd>
<dd>
<input name="SELLING_FLG" id="rom_status02" type="radio" value="1" checked='checked' />
<label for="rom_status02">販売</label>
</dd>
<dd>
<input name="SELLING_FLG" id="rom_status03" type="radio" value="2" />
<label for="rom_status03">売止(キャンセル再販なし)</label>
</dd>
</dl>
<dl class="lb">
<dt>期間の設定</dt>
<dd>
<span class="err_date" style="color:red"></span>
<select name="PROVIDE_FROM_YYYY">
<option value="2014" selected="">2014</option>
<option value="2015">2015</option>
<option value="2016">2016</option>
</select>年
<select name="PROVIDE_FROM_MM">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9" selected="">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select>月
<select name="PROVIDE_FROM_DD">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12" selected="">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select>日 ~
<select name="PROVIDE_TO_YYYY">
<option value="2014" selected="">2014</option>
<option value="2015">2015</option>
<option value="2016">2016</option>
</select>年
<select name="PROVIDE_TO_MM">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9" selected="">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select>月
<select name="PROVIDE_TO_DD">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12" selected="">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select>日
</dd>
</dl>
<dl class="lb">
<dt>提供室数の変更</dt>
<dd>
<span class="err_stock" style="color:red"></span>
<input type="text" class="stay count-length" name="STOCK" value="1" maxlength="3" data-type="numeric" />室(予約室数0室)
</dd>
</dl>
<input name="STOCK_RESET" type="checkbox" class='chkStockReset' id="stock_reset" value="" />
<label for="stock_reset">残室数を0にする</label>
<input type="hidden" name="ROOM_CD" value="RM0000009748" />
<input type="hidden" name="BKG_COUNT" value="0" />
<input type="hidden" name="from_form" value="room_offer" />
<input type="hidden" class="booking_count" value="0" />
<div id="btnSt">
<ul>
<li>
<a href="javascript:void(0);" class="save mdClose">変更しないで閉じる</a>
</li>
<li>
<a href="javascript:void(0);" class="entry">登録する</a>
</li>
</ul>
</div>
</div>
</div>
</div>

Re: C#の言語からAjax通信

Posted: 2014年9月17日(水) 14:01
by akai777suzu
結論がでました。

ひとまず、成功したソースが以下となります。

StringBuilder sb = new StringBuilder();
// URLパラメータを設定
sb.Append("SELL_STATUS=0&ROOM_DATE=20140917&...省略");
byte[] post = System.Text.Encoding.UTF8.GetBytes(sb.ToString());
sb = new StringBuilder();
sb.AppendLine("Content-Type: application/x-www-form-urlencoded");
sb.AppendLine("Referer:https://nextool.travel.yahoo.co.jp/room/offerd");
string header = sb.ToString();
webBrowser.Navigate("https://nextool.travel.yahoo.co.jp/room/offerd", null, post, header);

1.FireBugで取得できていたURLパラメータをそのまま使いました。
2.StringBuilderクラスの中にURLパラメータとFireBugで取得したContent-TypeとRefererを追加しました。
3.その後URLとURLパラメータとURLパラメータ+Content-TypeとRefererをNavigateメソッドに渡してやるとうまくいきました。

正しいかはわかりませんがContent-TypeとRefererを使っていなかったことがNavigateでアクセスできなかった原因なのではないかと考えます。

結論は間違っている可能性がありますのであしからず。