どういうわけか、HTTP リクエストを正しく実行していないと思います。
このサイト:
https://www.bintube.com/login/
名前付きの 2 つの html 入力フィールドがあります。
ctl00$main$Login1$UserName and ctl00$main$Login1$Password
送信ボタンの HTML コードは次のとおりです。
<input type="submit" name="ctl00$main$Login1$LoginButton" value="Login" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$main$Login1$LoginButton", "", true, "Login1", "", false, false))" id="ctl00_main_Login1_LoginButton" />
奇妙なことに、それはフォームタグに含まれておらず、残念ながら onclick のものは私にとってブラックボックスです。
したがって、GET 要求の正しいパラメーターを取得するには、Fiddler を使用する必要があります。これは、GET URL パラメーター (タイムスタンプとハッシュ) がどのように生成されるかがわからないためです。フィドラーでは次のようになります。
http://support.bintube.com/access/remote/?name=myname&email=myemail%40gmail.com&external_id=myexternal_id&organization=BinTube.com×tamp=1353061816&hash=2372492438924389243
ただし、この URL は、前述の URL https://www.bintube.com/login/ (SSL)とはまったく異なります。そのため、 http://support.bintube.com/にジャンプするまで何かを見逃したかどうかはわかりません(これが Fiddler に表示されます)。また、常に Fiddler を使用して C# コードの URL を取得する必要があります。 、私のコードでログインするために。理想的には、私のコードはそれ自体ですべてを理解するので、Fiddler を使用する必要はありません。
私のコードは次のとおりです。
var cc = new CookieContainer();
List<string> paras = new List<string>();
string url;
string html;
// data copied from Fiddler, (changed some of it of course):
paras.Add(String.Format("{0}={1}", "name", HttpUtility.UrlEncode("myname")));
paras.Add(String.Format("{0}={1}", "email", HttpUtility.UrlEncode("myemail")));
paras.Add(String.Format("{0}={1}", "external_id", HttpUtility.UrlEncode("myexternal_id")));
paras.Add(String.Format("{0}={1}", "organization", HttpUtility.UrlEncode("BinTube.com")));
paras.Add(String.Format("{0}={1}", "timestamp", HttpUtility.UrlEncode("1353061816")));
paras.Add(String.Format("{0}={1}", "hash", HttpUtility.UrlEncode("2372492438924389243")));
url = "http://support.bintube.com/access/remote/" + "?" + paras.Aggregate((x, y) => x + "&" + y);
var req = (HttpWebRequest)WebRequest.Create(url);
Console.WriteLine(url);
req.CookieContainer = cc;
req.Method = "GET";
req.AllowAutoRedirect = true;
// also copied from Fiddler
req.Host = "support.bintube.com";
req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11";
req.KeepAlive = true;
req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
//req.Headers["Accept-Encoding"] = "gzip,deflate,sdch"; //<- this give gibberish response, why?
req.Headers["Accept-Language"] = "de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4";
req.Headers["Accept-Charset"] = "ISO-8859-1,utf-8;q=0.7,*;q=0.3";
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
cc.Add(resp.Cookies);
//rewrite cookies for further requests (found that somewhere, but did not help)
string ckheader = cc.GetCookieHeader(req.RequestUri);
cc.SetCookies(new Uri("http://www.bintube.com/"), ckheader);
StreamReader r = new StreamReader(resp.GetResponseStream());
html = r.ReadToEnd();
コードは機能します。ときどき機能しなくなり、Fiddler から新しい GET パラメータを取得する必要があります。これは醜い設計であり、まったく満足していません。2番目のより大きな問題は、使用できないことです
https://www.bintube.com/search/ (requires login for results)
受け取ったクッキーで。(最初のリクエストから) 受け取った Cookie は _zendesk_session および _zendesk_shared_session Cookie であり、重要なものは何もありません (ググってみました)。したがって、どういうわけか、さらに先に進むための適切なクッキーを取得できないと思います。
たぶん、誰かが私がひどく失敗している理由についてのヒントを持っていますか?