2017-02-06 1 views
0

J'essaie de résoudre la tâche appelée Fast and Furious du défi Break In 2017.Comment résoudre la tâche appelée 'Fast and Furious' du challenge 'Break In 2017' en C#?

La tâche est simple. Besoin de renvoyer le résultat d'une expression mathématique contenue dans une page HTML. Il peut être réalisé par ce script python:

import requests 
import re 

url = 'https://felicity.iiit.ac.in/contest/extra/fastandfurious/' 
s = requests.Session() 
r = s.get(url) 
print(r.text) 
m = re.search('\(.*\)', r.text) 
while m: 
    ans = eval(m[0]) 
    print(m[0] + ' -> ' + str(ans)) 
    r = s.post(url, data={'ques_ans' : ans}) 
    print(r.text) 
    if ('the_flag_is_' in r.text): break 
    m = re.search('\(.*\)', r.text) 

Je veux faire la même chose en C#. J'ai essayé comme ceci:

using System; 
using System.Data; 
using System.IO; 
using System.Net; 
using System.Text; 
using System.Text.RegularExpressions; 

class Program 
{ 
    static CookieContainer cookies = new CookieContainer(); 

    static HttpWebRequest Create(string url) 
    { 
     var request = (HttpWebRequest)WebRequest.Create(url); 
     request.CookieContainer = cookies; 
     request.Accept = "*/*"; 
     request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
     request.UserAgent = "dummy"; 
     return request; 
    } 

    static string Get(string url) 
    { 
     var request = Create(url); 
     request.Method = "GET"; 

     using (var response = request.GetResponse()) 
     using (var reader = new StreamReader(response.GetResponseStream())) 
     { 
      return reader.ReadToEnd(); 
     } 
    } 

    static string Post(string url, string postData) 
    { 
     var request = Create(url); 
     request.Method = "POST"; 

     var data = Encoding.UTF8.GetBytes(postData); 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.ContentLength = data.Length; 

     using (var stream = request.GetRequestStream()) 
     { 
      stream.Write(data, 0, data.Length); 
     } 

     using (var response = request.GetResponse()) 
     using (var reader = new StreamReader(response.GetResponseStream())) 
     { 
      return reader.ReadToEnd(); 
     } 
    } 

    static string Eval(string expression) 
    { 
     DataTable dt = new DataTable(); 
     return dt.Compute(expression, "").ToString(); 
    } 

    static void Main() 
    { 
     string url = "https://felicity.iiit.ac.in/contest/extra/fastandfurious"; 
     string text = Get(url); 
     Console.WriteLine(text); 
     var m = Regex.Match(text, @"\(.*\)"); 

     while (m.Success) 
     { 
      var ans = Eval(m.Value); 
      Console.WriteLine(m.Value + " -> " + ans); 
      text = Post(url, "ques_ans=" + ans); 
      Console.WriteLine(text); 
      if (text.Contains("the_flag_is_")) break; 
      m = Regex.Match(text, @"\(.*\)"); 
     } 
    } 
} 

Mais cela ne fonctionne pas, parce que je reçois toujours revenir à la question « Niveau 1 ». J'ai utilisé la propriété HttpWebRequest.CookieContainer pour réutiliser les cookies à travers différentes demandes pour maintenir une session.

Je ne sais pas quel est le problème. Peut-être que la session ne fonctionne pas. Ou peut-être HttpWebRequest est trop lent pour publier le résultat dans le temps.

Comment résoudre cette tâche d'automatisation en C#?

Répondre

0

Votre code ne gère pas être redirigé. En regardant le trafic nous pouvons voir que ce serveur particulier aimerait que vos demandes à/fastandfurious se terminent par une barre oblique. alors changez '../fastandfurious' en '../fastandfurious/' et ça va le réparer.

+0

Je n'ai pas remarqué la barre oblique manquante. Cela résout le problème. Merci beaucoup. – bati06

+0

Juste pour ma curiosité j'ai essayé le script python avec la mauvaise URL, et cela a bien fonctionné (il gère bien la redirection). En C# pour HttpWebRequest, la propriété AllowAutoRedirect est true par défaut, mais elle ne fonctionne toujours pas avec la mauvaise URL. MSDN ne dit rien à ce sujet, mais est-il possible que AllowAutoRedirection ne fonctionne pas avec CookieContainer? – bati06