princektd Ответов: 1

Преобразование Python в .net C#


У меня есть небольшая функция, написанная на python. Что он делает, так это принимает 2 параметра и использует их для входа на сайт.

предположим, что URL-адрес сайта таков: http://www.abc.com/abcd/login.do
есть 3 параметра: 1) действие = doLoginSubmit
(это фиксированный статический параметр. не измениться)
2) userId = abcd
3) пароль = 1234
(эти 2 поставляются пользователем)

вот код python:

def get_url(url, data=None, timeout=60, opener=None):
  '''get_url accepts a URL string and return the server response code, response headers, and contents of the file'''
  '''ref: http://pythonfilter.com/blog/changing-or-spoofing-your-user-agent-python.html'''

  req_headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; U; ru; rv:5.0.1.6) Gecko/20110501 Firefox/5.0.1 Firefox/5.0.1'
  }
  
request = urllib2.Request(url, headers=req_headers)

  if not opener:
    jar = cookielib.FileCookieJar("cookies")
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(jar))
  response = opener.open(request, data)
  code = response.code
  headers = response.headers
  html = response.read()
  return code, headers, html, opener


def site_login():
  login_data = urllib.urlencode({'userId' : abcd, 'password' : 1234, 'action' : 'doLoginSubmit'})

  code, headers, html, cur_opener = get_url('http://www.abc.com/abcd/login.do', data=login_data, opener=cur_opener)

  if debug: print html



я пытаюсь сделать эквивалент C#.
вот мой код:

Dictionary<string, string> parameters = new Dictionary<string, string> 
{ 
	{ "action", "doLoginSubmit"},
	{ "userId", uRow["USERNAME"].ToString() },
	{ "password", uRow["PASSWORD"].ToString() }
};
//WebClient client = new WebClient();
//client.Headers.Set("UserAgent", "Mozilla/5.0 (Windows NT 6.1; U; ru; rv:5.0.1.6) Gecko/20110501 Firefox/5.0.1 Firefox/5.0.1");

//Stream dataStream = client.OpenWrite(string.Format("{0}?", cRow["LINK"].ToString()), "POST");

//string result = client.UploadString(string.Format("{0}?",cRow["LINK"].ToString()), "POST" , UrlEncode(parameters));

WebRequest request = WebRequest.Create(string.Format("{0}?{1}", cRow["LINK"].ToString(), UrlEncode(parameters)));

request.Method = "POST";

((HttpWebRequest)request).UserAgent = "Mozilla/5.0 (Windows NT 6.1; U; ru; rv:5.0.1.6) Gecko/20110501 Firefox/5.0.1 Firefox/5.0.1";

postDataBytes = Encoding.UTF8.GetBytes(UrlEncode(parameters));

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

request.ContentLength = postDataBytes.Length;

Stream dataStream = request.GetRequestStream();
							dataStream.Write(postDataBytes, 0, postDataBytes.Length);

dataStream.Close();

WebResponse response = request.GetResponse();

dataStream = response.GetResponseStream();

StreamReader reader = new StreamReader(dataStream);

string responseFromServer = System.Web.HttpUtility.UrlDecode(reader.ReadToEnd());

//webBrowser.Url = new Uri(string.Format("{0}?{1}", cRow["LINK"].ToString(), 
UrlEncode(parameters)));


линия
string.Format("{0}?{1}", cRow["LINK"].ToString(),
UrlEncode(parameters))

дает мне "полный" url-адрес жала:
http://www.abc.com/abcd/login.do?action=doLoginSubmit&userId=abcd&password=1234

теперь скопируйте эту строку URL-адреса в адресную строку Firefox и нажмите enter, и я смогу успешно войти на сайт. Firefox отображает страницу после успешного входа в систему, и я дополнительно подтвердил, что вход в систему действительно успешен.

Итак, я знаю, что по крайней мере эта часть моего кода верна.

Далее я хочу "запустить" этот URL-адрес без браузера, webcontrol или пользовательского интерфейса или каким-то образом успешно отправить учетные данные на сайт и выполнить успешный вход в систему без необходимости нажимать дополнительные кнопки. Я имею в виду, что сам процесс входа в систему не будет иметь никаких визуальных индикаторов. Только после завершения этой функции, в случае успеха, всплывающее окно сообщения с надписью "success" или сообщение "failed".

Как видно из закомментированных строк,
я пробовал webclient-openwrite, uploadstring, uploaddata
также webrequest/webresponse к url-адресу сайта с параметрами, переданными правильно. я также попробовал прямой веб-контроль перейти к строке URL "COMPLETE", но он не входит успешно.

линия
string responseFromServer = System.Web.HttpUtility.UrlDecode(reader.ReadToEnd());

говорит мне, успешен ли вход в систему или нет, и я подтвердил, что он не успешен.
Пожалуйста, помогите мне в получении успешного входа в систему.
я использую C# .Net4.


РЕДАКТИРОВАТЬ:

По какой-то причине я делаю веб-браузер.Перейдите к полному URL-адресу "дважды", кажется, чтобы вызвать успешный вход в систему!

Member 1139403

nn_demo.py

1 Ответов

Рейтинг:
2

Sergey Alexandrovich Kryukov

Вместо того чтобы переводить код, что всегда довольно скучная работа, особенно если вы "просто переводите", вы рассматривали возможность использования IronPython вместо этого?

Пожалуйста смотрите:
http://en.wikipedia.org/wiki/IronPython[^],
http://ironpython.net/[^].

С Наступающим Новым Годом!

—СА