2017-02-06 1 views
0

Я пытаюсь решить задачу под названием Fast and Furious от Break In 2017 challenge.Как решить задачу под названием «Быстро и в ярости» с вызова «Перерыв в 2017 году» на C#?

Задача проста. Необходимо, чтобы HTTP-сообщение возвращал результат математического выражения, содержащегося на странице HTML. Это может быть достигнуто с помощью этого скрипта 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) 

Я хочу сделать то же самое в C#. Я пробовал вот так:

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, @"\(.*\)"); 
     } 
    } 
} 

Но это не сработает, потому что я всегда возвращаю вопрос «Уровень 1». Я использовал свойство HttpWebRequest.CookieContainer для повторного использования файлов cookie в разных запросах, чтобы поддерживать сеанс.

Я не знаю, в чем проблема. Возможно, сеанс не работает. Или, возможно, HttpWebRequest слишком медленный, чтобы опубликовать результат во времени.

Как решить эту задачу автоматизации на C#?

ответ

0

Ваш код не обрабатывается при перенаправлении. Наблюдая за трафиком, мы видим, что этот конкретный сервер хотел бы, чтобы ваши запросы/fastandfurious заканчивались завершающим косой чертой. поэтому измените «../fastandfurious» на «../fastandfurious/», и это исправит.

+0

Я не заметил недостающую конечную косую черту. Это решает проблему. Большое спасибо. – bati06

+0

Просто для моего любопытства. Я попробовал скрипт python с неправильным URL-адресом, и он хорошо работал (он хорошо переносит перенаправление). В C# для HttpWebRequest свойство AllowAutoRedirect по умолчанию истинно, но оно по-прежнему не работает с неправильным URL-адресом. MSDN ничего не говорит об этом, но возможно ли, что AllowAutoRedirection не работает вместе с CookieContainer? – bati06

Смежные вопросы