Vyplniť formulár na web stránke z kódu   zodpovězená otázka

VB.NET

Poradil by mi niekto, prosím, ako vyplniť z kódu formulár a stlačiť tačítko na cudzej webovej stránke, prístupnej po zadaní mena a hesla. Neviem ako začať.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přečtěte si tento článek http://www.vbnet.cz/clanek--72-pracujeme...

a také si zjistěte něco o třídách HttpWebRequest a HttpWebResponse.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Ďakujem! Preštudujem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V podstatě jde jen o to zjistit, jak se jmenují v HTML elementy toho formuláře a podle metody formuláře odeslat buď GET či POST request. POST je maličko složitější, než GET, ale s trochou laborování se dá obojí vykoumat. :-)

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Ďakujem za odpoveď, ale ja mám už problém zadať meno a heslo skúšal som to podľa odkazu vyšie, ale nefunguje to.

Ide o to že chcem zadať údaje do textarea na nejakej stránke, ale aby som sa tam dostal potrebujem prejsť cez prihlasovaciu (login) stránku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To jsou dvě úlohy:

1) Zobrazte si zdrojový kód login formu, chcete něco jako toho:

<form method="!1!" action="!2!">
  <input type="text" name="!3!"/>
  <input type="password" name="!3!"/>
</form>

Ve vykřičnících máte: (1) metodu, podle té zvolíte, který typ requestu sestavíte, jestli POST nebo GET, pak (2) adresu proti které request vystavíte a (3) a (4) přahlašovací údaje které budou buď jako parametry GET requestu nebo jako tělo POST requestu.

2) Totéž akorát pro formulář s textareou.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Vyzerá to asi takto:

<form name="loginform" id="loginform" action="http://stranka.login.php" method="post">

<label>Užívateľské meno<br />

<input type="text" name="log" id="user_login" class="input" value="" size="20" tabindex="10" /></label>

label>Heslo<br />

<input type="password" name="pwd" id="user_pass" class="input" value="" size="20" tabindex="20" /></label>

<p class="submit">

<input type="submit" name="wp-submit" id="wp-submit" class="button-primary" value="Prihlásiť sa" tabindex="100" />

<input type="hidden" name="redirect_to" value="http://stranka.edit.php?

&amp;action=edit" />

<input type="hidden" name="testcookie" value="1" />

</p>

"http://stranka.edit.php"

<form name="post" action="post.php" method="post" id="post">

<div id='editorcontainer'><textarea rows='10' class='theEditor' cols='40' name='content' tabindex='2' id='content'>...Môj text....

</textarea></div>

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak dobře, jděme podle toho, co jsem říkal:

1) Metoda? POST - Stavíme HttpWebRequest metodou POST

2) Akce? http://stranka.login.php

3) Parametry? log, pwd, wp-submit, redirect_to, testcookie

    Sub Main()
        ' vytvoříme request
        Dim request = HttpWebRequest.Create("http://stranka.login.php") ' <from action="..." ... />
        request.Method = "POST" ' <from method="..." ... />
        Using writer As New StreamWriter(request.GetRequestStream())
            ' parametry píšeme do těla request streamu
            ' parametry oddělujeme znakem ampersandu &
            ' parametry a hodnoty oddělujeme znakem rovnosti =
            ' hodnoty parametrů, které by mohli obsahovat kolidující znaky (&, =, ...) je třeba html dekódovat
            ' při GET requestu by následující řetězec byl součástí adresy (action) za znakem otazníku ?
            writer.Write(String.Format("log={0}&pwd={1}&wp-submit=&redirect_to={2}&testcookie=1", "login", "heslo", WebUtility.HtmlEncode("http://stranka.edit.php?&action=edit")))
        End Using
        ' získáme odpověď
        Dim response = request.GetResponse()

    End Sub

Takto by mohl vypadat ten kód, budete si jej ale nejřív muset otestovat a vyladit podle Vašich potřeb. Podle stejného principu budete postupovat i u druhého formuláře, ovšem s tím, že předáte pouze parametr "content" (textarea) a dost možná bude třeba předat cookies, které vrátí ten login. Cookies se vrací v hlavičce response a pokud je chcete předat, přidáte je do kolekce headers v dalším requestu.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Ďakujem za odpoveď pán Clarai, ale nie je mi jasné ako vlastne zistím, či kód, ktorý ste mi napísali, funguje.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Možná, že by jste se radši měl pořádně naučit základy a až potom dělat pokroč. věci.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zda funguje? Stačí jej přeci vyzkoušet :-)

Doplňte do kódu reálné URL adresy a spusťte ho, kód provede to, o čem jsme se bavili, že je první ze dvou úloh, které potřebujete udělat abyste se dostal k výsledku, který považujete. Tento kód provedet přihlášení ke služce, login.

Dim response = request.GetResponse()

Dívejte se na to tak, jako byste pracoval s webovým prohlížečem. Tento kód je to, co udělá prohlížeč, když kliknete na tlačítko "přihlásit". Jak vidíte, v requestu (požadavku) dojde k vyplnění všech polí, které byste jinak v HTML dokumentu zadávat do formuláže (to byla ta pole jako log, pwd, ...) a až se tyto údaje zapíší do requestu, nezbývá, než jej vykonat voláním GetResponse. Toto volání vrací objekt HttpWebResponse, to je kód výše.

Může samozřejmě nastat několik druhů výjimek, jako například když počítač nebude připojen k Internetu, když vytrhnete síťový kabel v půlce vykonávání requestu, když Váš požadavek server odmítne, nebo vyprší timeout atd. Také je dobré zkontrolovat StatusCode u response, 200 znamená OK, 404 stránka nenalezena a podobně, to jistě znáte, případně je snadné si vše dohledat.

Pokud se nic takového nestane, v response bude následující: cookies, které uloží nějaký identifikátor sezení, jehož znalost prokazuje to, že jste již login učinil a dosazením té cookie do dalšího requestu zajistíte, že Vám server bude důvěřovat, že jste to příhlášené sezení. Tento mechanismus funguje proto, aby někdo nezavolal stránku s editací bez přihlášení a vesele si needitoval, jak se mu zlíbí. Je potřeba při požadavku na editaci, což je Váš úkol č. 2 prokázat, že jste úspěšně splnil úkol č. 1.

Dále Vám response může dát stream, ve kterém bude HTML zdroj stránky, kterou Vám prohlížeč běžně ukazuje po úspěšném přihlášení. K němu se dostanete metodou GetResponseStream(). Vy ale tento kód nepotřebujete, protože u přihlašování jde skutečně jen o tu cookie a dále Vás nic nezajímá.

Nyní je na řadě vytvořit další request a v něm se dotázat na stránku editace (action z druhého formuláře), vyplnit pole content, což je jméno té textarey a tyky předat tu cookie (!). Je to úplně to samé jako u přihlašování, opět si získáte response a odchytáte výjimky, zkontrolujete stavový kód, a když se Vám bude chtít, klidně si i můžete zjistit HTML tělo té stránky a za předpokladu, že je validní ho třeba načíst jako XML dokument a pomocí XPath nebo LINQ nad XDocumentem si třeba vytáhnout nějaký pojmenovaný element, jehož obsah informuje o výsledku té editacie. Element o kterém mluvím by mohl mít třeba takovýho HTML kód: <div id="result">Editace OK.</div>, ale to samozřejmě záleží na autorovi webových stránek, které používáte.

Pomohlo by mi, kdybyste načrtl kód, který Vám zatím funguje případně kde přesně máte problémy to rozchodit.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ďakujem Vám pán Clarai za promptnú odpoveď. Môj kód vyzerá asi takto. Ak stlačím tlačitko a pozriem sa na stránku, vôbec nič sa neudeje.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim request = HttpWebRequest.Create("http://login.php")         
request.Method = "POST"         
Using writer As New StreamWriter(request.GetRequestStream())
writer.Write(String.Format("log={0}&pwd={1}&wp-submit=&redirect_to={2}&testcookie=1", "myLog", "myPassword", WebUtility.HtmlEncode("http://edit.php&action=edit")))
End Using
Dim response = request.GetResponse()

Dim request1 = HttpWebRequest.Create("http://edit.php&action=edit")
request1.Method = "POST"
Using writer1 As New StreamWriter(request1.GetRequestStream())
writer1.Write(String.Format("content={0}", "Môj text"))
End Using
Dim response1 = request1.GetResponse()
End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kdepak, stane se víc, než si myslíte: tiše vyskočí výjimka WebException "The remote name could not be resolved: 'login.php'".

Obalte si kód Try konstrukcí a nastavte break-point na Catch statement a uvidíte.

To se děje proto, že adresy v requestu nejsou validní a to je nejspíš proto, že jste je nakopíroval z HTML, kde byli v relativní formě (která se pak rozváže podle adresy stránky v jehož zdroji jste ty adresy našel). Vy v requestu potřebujete zadat absolutní adresy, nebo nepoužívat HttpWebRequest/HttpWebResponse ale jejich nadstavbu HttpWebClient, kde se dá nastavit BaseUri, podle kterého se pak ty relativní adresy rozluští stejně jako jsem psal výše.

S HttpWebClientem Vás už nebudu plést, když jsem to načal s těmi requesty, takže se soustřeďme na to, jak "zabsolutnit" Vaše relativní adresy.

http://login.php je nesmysl, to http:// Vám tam nejspíš přidal prohlížeč při kopírování, ale Vás ve skutečnosti zajímá toto. Představme si, že máme web mujskvelyweb.cz a na něm přihlšovací stránku login.php.

mujskvelyweb.cz:

<from action="login.php">
   bla bla bla html
</form>

Relativní adresa je "login.php" a k ní korespondující absolutní adresa je: "http://mujskvelyweb.cz/login.php".

Stejným způsobem získáte i absolutní adresu edit.php stránky.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ďakujem ale v tomto asi nebude. Adresy som upravil ja. Po zadaní celých adries do vyjhľadávača mi stránky zobrazí správne. Ak dám try nehlási mi to žiadnu výnimku.

Skutočná adresa vyzerá asi takto:

http://nazov.sk/admin/post.php?post=153&...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ďakujem!

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback