Postback (WebRequest) C#

//Méthode pour télécharger automatiquement les cours des valeurs côtées sur le site Deutsche Börse pendant une période définie

//Pour tester le programme en pièce jointe, ouvrir une fenêtre MS-DOS, faire glisser le programme dans la

//fenêtre MS-DOS

//Puis taper derrière le nom du programme : "FR0000120271" "01.06.2009" "01.07.2009"

//(Cours de la valeur TOTAL du 1er juin 2009 au 1 juillet 2009)

//Enfin, exécuter le programme

//Télécharger la page internet par défaut des cours sur le site Deutsche Börse

//Par défaut, les 50 derniers jours de cotation de la valeur spécifié en paramètre sont présentés

//Il est possible de définir la période des jours de cotations présentés à l'aide de la fonction postback (tester le fonctionnement du

//site auparavant avec Internet Explorer et la fonction ieHTTPHeaders )

//On se sert pour cela de la page par défaut pour récupérer les clés du ScriptManager et du ViewState utilisés pour le postback

//A l'aide de ces valeurs et après avoir défini la période de téléchargement souhaitée, contruire une chaine de caractère contenant

//les données du postback, l'envoyer au serveur Deutsche Börse puis retélécharger la page de cours qui contient les jours de cotations

//souhaités

using System;

using System.Collections.Generic;

using System.Text;

using System.Globalization;

using System.Net;

using System.Text.RegularExpressions;

using System.IO;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

//Initialisation des réglages cultures du programme

CultureInfo cultureInfo = new CultureInfo("fr-FR");

cultureInfo.NumberFormat.NumberDecimalSeparator = ".";

//Téléchargement de la page internet par défaut des cours sur le site Deutsche Börse

WebRequest requeteWeb = WebRequest.Create("http://deutsche-boerse.com/bf4dbag/DE/export/export.aspx?module=historicaldata&isin=" + args[0] + "&navpath=http://deutsche-boerse.com/dbag/dispatch/de/isg/gdb_navigation/home");

Console.Out.WriteLine("Adresse Web : " +requeteWeb.RequestUri);

IWebProxy proxy = WebRequest.GetSystemWebProxy();

requeteWeb.Proxy = proxy;

requeteWeb.PreAuthenticate = true;

proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;

//Obtenir la réponse du site web

HttpWebResponse reponseWeb = (HttpWebResponse)requeteWeb.GetResponse();

Console.WriteLine("Statut du site Web " + reponseWeb.StatusDescription);

//Convertit la réponse de la requête web en un flux de données

TextReader textReader = new StreamReader(reponseWeb.GetResponseStream());

//Ouverture du fichier texte

string ligneTexte = null;

//Regex de détection des clés ScriptManager et ViewState

Regex scriptManagerRegex = new Regex("_TSM_CombinedScripts_=(.*)\" type=\"text/javascript\"></script>");

Regex ViewStateRegex = new Regex("<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=\"(.*)\" />");

string viewState = null;

string scriptManager = null;

//Parcours du fichier pour trouver les clés ScriptManager et ViewState

while ((ligneTexte = textReader.ReadLine()) != null)

{

if (ViewStateRegex.IsMatch(ligneTexte))

{

viewState = ViewStateRegex.Split(ligneTexte)[1];

viewState = viewState.Replace("+", "%2B");

viewState = viewState.Replace("/", "%2F");

}

else if (scriptManagerRegex.IsMatch(ligneTexte))

{

scriptManager = scriptManagerRegex.Split(ligneTexte)[1];

}

}

textReader.Close();

//Créer les postdata avec les clés trouvées et la période de téléchargement souhaitée

string postbackDonnees = "ScriptManager_HiddenField=" + scriptManager;

postbackDonnees += "&__EVENTARGUMENT=";

postbackDonnees += "&__VIEWSTATE=" + viewState;

postbackDonnees += "&ctl05%24ctl01%24FromDate=" + args[1];

postbackDonnees += "&ctl05%24ctl01%24FromDateWatermark_ClientState=";

postbackDonnees += "&ctl05%24ctl01%24ToDate=" + args[2];

postbackDonnees += "&ctl05%24ctl01%24ToDateWatermark_ClientState=";

postbackDonnees += "&ctl05%24ctl01%24SubmitDatesButton.x=20";

postbackDonnees += "&ctl05%24ctl01%24SubmitDatesButton.y=1";

requeteWeb = WebRequest.Create("http://deutsche-boerse.com/bf4dbag/DE/export/export.aspx?module=historicaldata&isin=" + args[0] + "&navpath=http://deutsche-boerse.com/dbag/dispatch/de/isg/gdb_navigation/home");

ASCIIEncoding encoding = new ASCIIEncoding();

byte[] data = encoding.GetBytes(postbackDonnees);

requeteWeb.Method = "POST";

requeteWeb.ContentType = "application/x-www-form-urlencoded";

requeteWeb.ContentLength = data.Length;

Stream newStream = requeteWeb.GetRequestStream();

//Envoyer les données du Postback

newStream.Write(data, 0, data.Length);

newStream.Close();

//Télécharger la page de cotation des valeurs actualisée en fonction de la période demandée

reponseWeb = (HttpWebResponse)requeteWeb.GetResponse();

textReader = new StreamReader(reponseWeb.GetResponseStream());

//Récupérer le jour de cotation et le cours de la valeur

string coursRegexExp = "<td class=\"column-date first\">([0-9]{2}.[0-9]{2}.[0-9]{4})</td>";

coursRegexExp += "<td class=\"column-price\">([0-9]{1,10}.[0-9]{1,3})";

Regex coursRegex = new Regex(coursRegexExp);

while ((ligneTexte = textReader.ReadLine()) != null)

{

//<td class="column-date">17/05/2010</td><td class="column-price right">14.61</td><td class="column-volume right">269,565</td><td class="column-turnover right lastColOfRow">3,914,403.18</td>

if (coursRegex.IsMatch(ligneTexte))

{

string[] coursProp = coursRegex.Split(ligneTexte);

int i = 0;

i = 1;

while (i < coursProp.Length - 1)

{

Console.WriteLine("Date : " + Convert.ToDateTime(coursProp[i]));

Console.WriteLine("Cours : " +Convert.ToDouble(coursProp[i + 1]));

i = i + 3;

}

}

else if (ViewStateRegex.IsMatch(ligneTexte))

{

viewState = ViewStateRegex.Split(ligneTexte)[1];

viewState = viewState.Replace("+", "%2B");

viewState = viewState.Replace("/", "%2F");

//Console.Out.WriteLine(viewState);

}

else if (scriptManagerRegex.IsMatch(ligneTexte))

{

scriptManager = scriptManagerRegex.Split(ligneTexte)[1];

//Console.Out.WriteLine(scriptManager);

}

}

textReader.Close();

}

}

}