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();
}
}
}