PowerShell verze 3.0 zavádí možnost přímého přístupu a práce s webovými stránkami HTML na Internetu. Za tímto účelem byla vyvinuta speciální rutina. Invoke-WebRequest. Tato rutina vám umožňuje implementovat mnoho scénářů: od možnosti stahovat / nahrávat soubor z / na jakýkoli web přes HTTP / HTTPS / FTP, končící možností analyzovat HTML stránky, sledovat stav webových serverů, vyplňovat a odesílat webové formuláře. Obecně nová cmdlet poskytuje všechny potřebné metody pro navigaci ve stromu DOM dokumentu HTML. V tomto článku se podíváme na některé základní příklady práce s cmdletem PowerShell Invoke-WebRequest..
Obsah:
- Použití Invoke-WebRequest Cmdlet
- Získáme seznam všech odkazů HTML na stránce
- Analýza stránek HTML pomocí Powershell
- Jak stáhnout soubor přes HTTP pomocí PowerShell
- Powershell vyplňování a odesílání webových formulářů
- Nevýhody rutiny Invoke-WebRequest
Použití Invoke-WebRequest Cmdlet
Cmdlet Vyvolejte-Webrequest (alias wget) umí odesílat a přijímat požadavky HTTP, HTTPS a FTP, zpracovávat odpověď vrácenou serverem. Reakcí je kolekce formulářů, odkazů, obrázků a dalších důležitých prvků dokumentu HTML.
Zkusme následující příkaz:
Invoke-WebRequest -Uri "http://winitpro.ru"
Jak vidíte, vrácená odpověď není jednoduchý HTML kód pro stránku. Uvidíte různé vlastnosti webového dokumentu. Rutina Invoke-WebRequest, stejně jako většina ostatních rutin PowerShell, pracuje s objekty. Invoke-WebRequest vrací objekt typu HtmlWebResponseObject. Podívejme se na všechny vlastnosti tohoto objektu:
$ WebResponseObj = Invoke-WebRequest -Uri "http://winitpro.ru"
$ WebResponseObj | Získejte člena
Chcete-li získat nezpracovaný kód HTML webové stránky obsažené v tomto objektu, proveďte následující kroky:
$ WebResponseObj.content
Můžete vrátit kód HTML spolu s hlavičkami HTTP vrácenými webovým serverem:
$ WebResponseObj.rawcontent
Můžete zkontrolovat pouze kód odezvy webového serveru a záhlaví HTTP stránky HTML:
$ WebResponseObj.Headers
Jak vidíte, webový server vrátil odpověď 200, tj. požadavek byl úspěšný a webový server je přístupný a pracuje správně.
Získáme seznam všech odkazů HTML na stránce
Obracíme se na hlavní stránku našeho webu a získáme na něm seznam odkazů:$ SiteAdress = "http://winitpro.ru"
$ HttpContent = Invoke-WebRequest -URI $ SiteAdress
$ HttpContent.Links | Foreach $ _. Href
Chcete-li získat samotný text odkazu (obsažený v prvku InnerText), můžete použít tuto konstrukci:
$ HttpContent.Links | fl innerText, href
Můžete vybrat pouze odkazy s konkrétní třídou CSS:
$ HttpContent.Links | Where-Object $ _. Třída -eq "čísla stránek" | fl innerText, href
Nebo konkrétní text v adrese URL:
$ HttpContent.Links | Where-Object $ _. Href-like "* exchange *" | | fl innerText, href
Analýza stránek HTML pomocí Powershell
Cmdlet Invoke-WebRequest umožňuje rychle a pohodlně analyzovat obsah libovolných webových stránek. Při zpracování stránky HTML z jejího obsahu se vytvářejí kolekce odkazů (odkazů), webových formulářů (formulářů), obrázků (obrázků), skriptů (skriptů) atd..
Pomocí Powershell získáme obsah hlavní stránky našeho webu:
$ Img = Invoke-WebRequest "https://winitpro.ru/"
Poté uvádíme seznam všech obrázků na této stránce:
$ Img.Images
Vytvoříme sbírku úplných cest URL pro použité obrázky:
$ images = $ Img.Images | vyberte src
Inicializace nové instance třídy WebClient:
$ wc = New-Object System.Net.WebClient
A stáhněte všechny obrázky ze stránky (s původními názvy) do adresáře c: \ tools \:
$ images | foreach $ wc.DownloadFile ($ _. src, ("c: \ tools \" + [io.path] :: GetFileName ($ _. src))
Zajímavým příkladem použití rutiny Invoke-WebRequest je způsob, jak zjistit externí IP adresu počítače z PowerShell.
Jak stáhnout soubor přes HTTP pomocí PowerShell
Invoke-WebRequest může fungovat jako analog Wget nebo CURL pro Windows, což vám umožní stáhnout požadovaný soubor nebo soubory z webové stránky nebo ftp webu. Předpokládejme, že potřebujeme použít PowerShell ke stažení určitého souboru přes HTTP (v našem příkladu distribuce Mozilla Firefox). Spusťte následující příkaz:
Invoke-WebRequest "https://download.mozilla.org/?product=firefox-32.0.3-SSL&os=win&lang=en" -outfile "c: \ tools \ firefox setup 32.0.3.exe"
V důsledku spuštění rutiny bude soubor stažen ze zadané URL a uložen do adresáře c: \ tools \ pod názvem firefox setup 32.0.3.exe. Pokud potřebujete stáhnout soubor z FTP serveru, stačí nahradit http: // ftp: //.
Soubory můžete také stahovat z webového serveru pomocí BITS v synchronním režimu.Můžete tedy snadno najít na konkrétní webové stránce všechny odkazy, které spadají pod určitá kritéria (třída odkazů, rozlišení v názvu souboru, adresa URL), a stahovat soubory pomocí přijatých odkazů. Například existuje web s množstvím odkazů na dokumenty PDF. Vaším úkolem je stáhnout všechny tyto soubory do počítače. Páteř skriptu PowerShell pro hromadné stahování souborů může vypadat takto:
$ OutDir = "C: \ Downloads \ docs \ PDF"
$ SiteAdress = "https://www.site.ru/free-pdf-books/"
$ HttpContent = Invoke-WebRequest -URI $ SiteAdress
$ HttpContent.Links | Where-Object $ _. Href-like "* .pdf" | % Invoke-WebRequest - Uri $ _. Href -OutFile ($ OutDir + $ (Get-Random 100000) + ". Pdf")
V důsledku skriptu v cílovém adresáři budou staženy všechny soubory PDF ze stránky. Každý soubor je uložen pod libovolným názvem..
V PowerShell 6.1 cmdlet Invoke-WebRequest podporuje režim obnovení. Proto pomocí parametru Invoke-WebRequest -Uri $ Uri -OutFile $ OutFile -Pokračovat můžete pokračovat v stahování souboru v případě selhání kanálu nebo serveru.Powershell vyplňování a odesílání webových formulářů
Mnoho webových služeb vyžaduje zadání různých dat ve formulářích HTML, aby fungovaly. Použití Vyvolejte-Webrequest Máte přístup k libovolnému formuláři HTML, vyplňte povinná pole a vyplněný formulář odešlete zpět na server. V tomto příkladu vám ukážeme, jak používat Powershell k přihlášení k poštovní schránce populární ruské služby mail.ru prostřednictvím standardního webového formuláře..
Pomocí následující konstrukce ukládáme informace o souborech cookie pro připojení do samostatné proměnné relace:
$ mailru = Invoke-WebRequest https://e.mail.ru/login -SessionVariable session
Následující příkaz zobrazí seznam polí pro vyplnění formuláře HTML pro autorizaci (formulář se nazývá LoginExternal):
$ mailru.Forms ["LoginExternal"]. Pole
Přiřaďte potřebné hodnoty všem polím:
$ mailru.Forms ["LoginExternal"]. Pole ["Login"] = "[email protected]"
$ mailru.Forms ["LoginExternal"]. Pole ["Heslo"] = "Str0NgP $$ w0rd"
Atd ... .
Chcete-li odeslat vyplněný formulář na webový server, zavolejte atribut akce formuláře HTML.
$ Log = Invoke-WebRequest -method POST -URI ("https://e.mail.ru/login" + $ mailru.Forms ["LoginExternal"]. Action) -Body $ mailru.Forms ["LoginExternal"]. Pole - relace $ WebSession
Nevýhody rutiny Invoke-WebRequest
Jednou z hlavních nevýhod rutiny Invoke-WebRequest je relativně nízká rychlost. Když je soubor HTTP stažen, tok je plně vyrovnávací paměti do paměti a až po dokončení úplného stažení je uložen na disk. Proto při stahování velkých souborů může dojít nedostatek paměti.
Dalším problémem je rutina Invoke-WebRequest úzce souvisí s aplikací Internet Explorer. Například v edicích systému Windows Server Core, kde není nainstalován IE, nemůžete použít cmdlet Invoke-WebRequest..
Pokud se na webu HTTP používá certifikát podepsaný vlastním uživatelem, cmdlet Invoke-WebRequest odmítá z něj přijímat data. Chcete-li ignorovat neplatný certifikát SSL, použijte následující kód:
SSL certifikát můžete ignorovat takto:add-type @ "
pomocí System.Net;
pomocí System.Security.Cryptography.X509Certificates;
veřejná třída TrustAllCertsPolicy: ICertificatePolicy
veřejné bool CheckValidationResult (
ServicePoint srvPoint, certifikát X509Certify,
WebRequest request, int certificateProblem)
návrat true;
„@
[System.Net.ServicePointManager] :: CertificatePolicy = TrustAllCertsPolicy pro nový objekt
$ result = Invoke-WebRequest -Uri "https://site.ru"