3

Windows 8 ストア アプリケーションで HttpWebRequest を使用して Web サイトにログインしようとしています。ログインフォームは次のようになります。

<form method="post" action="" onsubmit="javascript:return FormSubmit();">
<div>
    <div>
        <span>gebruikersnaam</span>
        <input size="17" type="text" id="username" name="username" tabindex="1" accesskey="g" />
    </div>
    <div>
        <span>wachtwoord</span>
        <input size="17" type="password" id="password" name="password" maxlength="48" tabindex="2" accesskey="w" autocomplete="off" />
    </div>
    <div class="controls">
        <input type="submit" id="submit" accesskey="l" value="inloggen" tabindex="4" class="button"/>
    </div>
    <!-- The following hidden field must be part of the submitted Form -->
    <input type="hidden" name="lt" value="_s3E91853A-222D-76B6-16F9-DB4D1FD397B7_c8424159E-BFAB-EA2A-0576-CD5058A579B4" />
    <input type="hidden" name="_eventId" value="submit" />
    <input type="hidden" name="credentialsType" value="ldap" />
</div>
</form>

「lt」という名前の非表示の入力を除いて、必要な入力のほとんどを送信できます。これはセキュリティ目的でランダムに生成されたコードであるため、スクリプトにハードコードすることはできません。私の現在のスクリプトは次のようなものです:

HttpWebRequest loginRequest2 = (HttpWebRequest)WebRequest.Create(LOGIN_URL_REDIRECT);
        loginRequest2.CookieContainer = CC;
        loginRequest2.Method = "POST";
        loginRequest2.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*";
        loginRequest2.ContentType = "application/x-www-form-urlencoded";
        loginRequest2.Headers["Accept-Encoding"] = "gzip,deflate";
        loginRequest2.Headers["Accept-Language"] = "en-us";
        StreamWriter sw = new StreamWriter(await loginRequest2.GetRequestStreamAsync());
        sw.Write("username=" + userName + "&password=" + passWord + "&_eventId=submit&credentialsType=ldap");
        await sw.FlushAsync();

        HttpWebResponse response2 = (HttpWebResponse)await loginRequest2.GetResponseAsync();

リクエストを実行する前に、非表示の入力「lt」の内容を取得するにはどうすればよいですか?

4

2 に答える 2

0

HTML Agilty Packを使用すると、次のコード スニペットを使用して隠しフィールドの値を取得できます。

var doc = new HtmlWeb().Load(LOGIN_URL_REDIRECT);
var nodes = doc.DocumentNode
               .SelectNodes("//input[@type='hidden' and @name='lt' and @value]");
foreach (var node in nodes) {
    var inputName = node.Attributes["name"].Value;
    var inputValue = node.Attributes["value"].Value;
    Console.WriteLine("Name: {0}, Value: {1}", inputName, inputValue);
}

Linq の使用:

var nodes = from n in doc.DocumentNode.DescendantNodes()
            where n.Name == "input" && 
                  n.GetAttributeValue("type", "") != "" &&
                  n.GetAttributeValue("name", "") == "lt" && 
                  n.Attributes.Contains("value")
            select new
            {
                n.Attributes["name"].Name,
                n.Attributes["value"].Value
            };

foreach (var node in nodes) {
    Console.WriteLine("Name: {0}, Value: {1}", node.Name, node.Value);
}
于 2012-11-17T13:54:10.003 に答える
0

ウェブページを読み込んでランダムなキーを取得し、同じキーを使用して 2 番目のページを呼び出す必要があります。これを簡単に実行できるソフトウェアを作成しました

WebScraper を使用したくない場合は、少なくとも、ダウンロードしたソリューションで見つかった CookieWebClient である Cookie 対応クラスを使用する必要があります。使用方法は次のようになります。

// Use Cookie aware class, this class can be found in my WebScraper Solution
CookieWebClient cwc = new CookieWebClient;
string page = cwc.DownloadString("http://YourUrl.com"); // Cookie is set to the key

// Filter the key
string search = "name=\"lt\" value=\"";
int start  = page.IndexOf(search);
int end = page.IndexOf("\"", start);
string key = page.Substring(start + search.Length, end-start-search.Length);

// Use special method in CookieWebClient to post data since .NET implementation has some issues.
// CookieWebClient is the class I wrote found in WebScraper solution you can download from my site
// Re use the cookie that is set to the key
string afterloginpage = cwc.PostPage("http://YourUrl.com", string.Format("username={0}&password={1}&lt={2}&_eventId=submit&credentialsType=ldap", userid, password, key));

// DONE
于 2012-11-17T14:04:06.503 に答える