Powershell est un outil à tout faire, et dans cet article, vous verrez la manière de télécharger des pages entières ou de simples parties.

Cependant, elle peut vite devenir plus complexe au fur et a mesure que se présentent des cas courants en entreprise, comme la présence d'un proxy avec identifiants, ou encore une fenêtre web appelant un identifiant et un mot de passe.

Tout d'abord, donnons nous un objectif.

Je sais qu'internet est le royaume des chats, et je ne vous offrirai pas une photo de chat à télécharger en guise de test, mais bel et bien d'une poutre (petit hommage à mon brave Gurvan J. qui me lit).

poutre

De quoi avons-nous besoin pour télécharger cette photo de poutre?

  1. De l'adresse de l'image, tout d'abord
  2. D'un objet capable de se connecter à Internet
  3. D'une destination pour l'enregistrement du fichier
  4. (optionnel) D'un moyen de présenter des identifiants au serveur proxy
  5. (optionnel) D'une méthode de présenter des identifiants au site qui les réclame.

Voyons d'abord la méthode la plus simple.

Téléchargement d'une image depuis le web

La méthode est assez simple. .NET offre une classe nommée System.Net.Webclient , qui (je cite le Technet) fournit des méthodes communes pour l'envoi de données à une ressource identifiée par un URI ou pour la réception de données en provenance de cette ressource. Nous allons donc créer un nouvel objet de cette classe, et voir ce que nous avons comme possibilités.

$webclient = new-object System.Net.WebClient

Avec un Get-member sur l'objet $webclient, nous récupérons une liste de 63 méthodes et propriétés, dont en voici une partie.

webclient

Dans cette liste et pour cet article, quelques méthodes nous intéressent. "DownloadData()", "DownloadFile()" et "DownloadString()"

La différence entre les trois :

  • DownloadData : Télécharge la ressource comme un tableau de Byte à partir de l'URI spécifié.
  • DownloadFile : Télécharge vers un fichier local la ressource ayant l'URI spécifié.
  • DownloadString : Télécharge la ressource demandée en tant que String.

Dans notre cas, DownloadFile() sera parfait, c'est ce que nous voulons!

Les deux paramètres pour cette méthode sont :

  1. address : l'emplacement de l'objet à télécharger
  2. filename : la destination ou le télécharger

Il nous suffit donc d'envoyer l'adresse du lien, entre guillemets car l'objet attends une string, et la destination aussi au format string.

$webclient.Downloadfile("https://siteweb.com/poutre.jpg","C:\Users\moi\Desktop\Superbe_Poutre.jpg")

Félicitations! Votre image est dorénavant téléchargée!

Maintenant, voyons des cas un peu plus complexes mais courants en entreprise.

Télécharger des fichiers derrière un proxy.

Comme vu dans le Get-Member de l'objet $webclient, la classe Webclient contient une propriété nommée Proxy qui est modifiable. Cependant, en tentant d'en ajouter nous tombons sur cette erreur.

webproxy

Tout simplement parce que c'est un objet qui est attendu, et non pas une chaine de caractères. (ici un objet System.Net.IWebProxy , mais je ferai un objet System.Net.Webproxy à la place, permettant plus de choix)

Nous allons donc créer un objet de type :

$proxy = New-Object System.Net.WebProxy

Un Get-Member pour voir les propriétés

webproxy2

Nous voyons qu'une des propriétés se nomme "Address" et l'autre "Credentials". Exactement ce qu'il nous faut pour renseigner le proxy et si besoin est nos identifiants.

La propriété Address attends une chaine de caractères.

$Proxy.Address = "https://proxy.chezmoi.com:8080"

Credentials, par contre, attends un objet de type System.Net.ICredentials ou System.Net.NetworkCredentials. Ce sont des objets sécurisés, qui attendent des identifiants sous un format crypté.

Je vous invite à reprendre cet article pour savoir comment stocker de manière plus sécure les mots de passe dans un script.

$key = [byte]44,06,22,22,09,33,45,18,48,04,02,04,04,08,66,97<
$login = "nicolaslang"

$password = Get-Content "C:\script\cred.sec" | ConvertTo-SecureString -Key $key
$proxy = New-Object System.Net.WebProxy
$proxy.Address = "https://proxy.chezmoi.com:8080"

$proxy.Credentials = (New-Object System.Net.NetworkCredential -ArgumentList $login,$password)

Nous avons donc notre objet $Proxy qui contient une adresse et des identifiants sécurisés. Nous n'avons donc plus qu'à présenter cet objet à notre objet Webclient, et tout ira pour le mieux.

 $webclient.Proxy = $proxy

Nous pouvons ensuite télécharger notre belle image de poutre sans problème.

Présenter des identifiants à un site Il arrive parfois qu'un site nous demande de nous identifier au préalable avant d'accéder à une page. Je parle ici des fenêtre de login issues du html, pas celles issues d'une fenêtre en flash ou en java!

Pour présenter nos identifiants à une fenêtre, nous devons donc créer un objet de type System.Net.NetworkCredential et le présenter à la propriété Credentials de notre objet Webclient. La encore, si vous ne savez pas comment faire pour sécuriser un mot de passe dans un script, cet article est pour vous.

$webclient.Credentials = (New-Object System.Net.NetworkCredential -ArgumentList $login,$password)

Lorsque la page sera appelée et que la page d'identification apparaîtra, ces identifiants seront automatiquement présentés, et vous permettront de passer l'authentification.

Voila, plus rien ne vous empêche de télécharger plein d’éléments issus des pages web à l'aide de powershell!

Ajouter un commentaire

Article précédent Article suivant