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