отправка post c libcurlNet в C#
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
отправка post c libcurlNet в C# - 2010-03-21 00:44:13.276666
|
|
|
dOver
Сообщений: 140
Оценки: 0
Присоединился: 2007-03-31 04:41:56.070000
|
Никак не могу залогиниться через программу на C#. Есть класс:
using SeasideResearch.LibCurlNet;
using System.IO;
class HTTP
{
private static Easy easy;
private static Random rand = new Random();
private static string SockBuff;
private static string CookieFile = AppDomain.CurrentDomain.BaseDirectory + "cookie" + rand.Next(0, 9) + rand.Next(0, 9) + rand.Next(0, 9) + rand.Next(0, 9) + rand.Next(0, 9) + rand.Next(0, 9) + rand.Next(0, 9) + ".txt";
public static string UserAgent = "Mozilla 5.0";
public static string Proxy = "";
public string referer = "";
public void Dispose()
{
ClearCookies();
}
public string getCookieFile()
{
return CookieFile;
}
public void CurlInit()
{
Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL);
}
public void ClearCookies()
{
if (File.Exists(CookieFile))
{
File.Delete(CookieFile);
}
}
public string HTTPGet(string URL, string Proxy)
{
easy = new Easy();
SockBuff = "";
try
{
Easy.WriteFunction wf = new Easy.WriteFunction(OnWriteData);
easy.SetOpt(CURLoption.CURLOPT_URL, URL);
easy.SetOpt(CURLoption.CURLOPT_TIMEOUT, "60");
easy.SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wf);
easy.SetOpt(CURLoption.CURLOPT_USERAGENT, UserAgent);
easy.SetOpt(CURLoption.CURLOPT_COOKIEFILE, CookieFile);
easy.SetOpt(CURLoption.CURLOPT_COOKIEJAR, CookieFile);
easy.SetOpt(CURLoption.CURLOPT_FOLLOWLOCATION, true);
if (URL.Contains("https"))
{
easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYHOST, 1);
easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYPEER, 0);
}
if (Proxy != "")
{
easy.SetOpt(CURLoption.CURLOPT_PROXY, Proxy);
easy.SetOpt(CURLoption.CURLOPT_PROXYTYPE, CURLproxyType.CURLPROXY_HTTP);
}
easy.Perform();
easy.Cleanup();
}
catch
{
Console.WriteLine("Get Request Error");
}
return SockBuff;
}
public string HTTPPost(string URL, string Content, string Proxy)
{
easy = new Easy();
SockBuff = "";
try
{
Easy.WriteFunction wf = new Easy.WriteFunction(OnWriteData);
easy.SetOpt(CURLoption.CURLOPT_URL, URL);
easy.SetOpt(CURLoption.CURLOPT_TIMEOUT, "60");
easy.SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wf);
easy.SetOpt(CURLoption.CURLOPT_USERAGENT, UserAgent);
easy.SetOpt(CURLoption.CURLOPT_COOKIEFILE, CookieFile);
easy.SetOpt(CURLoption.CURLOPT_COOKIEJAR, CookieFile);
//easy.SetOpt(CURLoption.CURLOPT_HTTPHEADER
easy.SetOpt(CURLoption.CURLOPT_REFERER, referer);
//easy.SetOpt(CURLoption.CURLOPT_POSTFIELDSIZE, Content.Length);
easy.SetOpt(CURLoption.CURLOPT_FOLLOWLOCATION, true);
//easy.SetOpt(CURLoption.CURLOPT_HTTPHEADER, 1);
easy.SetOpt(CURLoption.CURLOPT_POST, true);
easy.SetOpt(CURLoption.CURLOPT_POSTFIELDS, Content);
if (URL.Contains("https"))
{
easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYHOST, 1);
easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYPEER, 0);
}
if (Proxy != "")
{
easy.SetOpt(CURLoption.CURLOPT_PROXY, Proxy);
easy.SetOpt(CURLoption.CURLOPT_PROXYTYPE, CURLproxyType.CURLPROXY_HTTP);
}
easy.Perform();
easy.Cleanup();
}
catch
{
}
return SockBuff;
}
public string SafeString(string data)
{
return Curl.Escape(data, data.Length);
}
public string UnSafeString(string data)
{
return Curl.Unescape(data, data.Length);
}
public static Int32 OnWriteData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData)
{
// Console.Write(System.Text.Encoding.UTF8.GetString(buf));
SockBuff = SockBuff + System.Text.Encoding.UTF8.GetString(buf);
return size * nmemb;
}
}
На нажатие кнопки пишу код:
string response;
string sUrl = "http://lockerz.com/auth/login";
HTTP http = new HTTP();
http.CurlInit();
http.referer = "http://lockerz.com/";
response = http.HTTPPost(sUrl, "remember+me=on&handle=myemail%40gmail.com&password=mypass", "");
textBox1.Text += response;
Так вот на моем тестовом сервере успешно логинюсь и получаю страницу для залогиненных. А на этом, lockerz.com, не хочет. Все время возвращает страницу с формой логина. Может там из-за кодирования. Там стоит чекбокс с именем "remember me". Я отснифал, на сервер передается как "remember+me", ну и е-майл собаку кодирует как "%40". И куки ставит. Я их в файл сохраняю, файл создается. В чем может быть проблема? Может из-за куков? У меня на своем через сессию, а здесь куки. Хелп!
|
|
|
RE: отправка post c libcurlNet в C# - 2010-03-21 01:24:41.940000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Всё может быть. Сниффер в руки и сравнивай, что твоя прога отправляет и что браузер делает.
|
|
|
RE: отправка post c libcurlNet в C# - 2010-03-21 03:15:16.843333
|
|
|
dOver
Сообщений: 140
Оценки: 0
Присоединился: 2007-03-31 04:41:56.070000
|
В том-то и дело, что не знаю, что и сравнивать. Вот, что сниффер перехватил (куки и пароли поменял):
POST /auth/login HTTP/1.1
Host: www.lockerz.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 WebMoney Advisor
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://www.lockerz.com/
Cookie: __utma=275***34.444****4552.12*****11.12****61.12*****12.40; __utmz=27****25.12****0.7.2.utmcsr=userscripts.org|utmccn=(referral)|utmcmd=referral|utmcct=/topics/43513; __utmc=27***25; __utmb=27****25.3.10.12****12; lockerz=UT9Xmycookie%3D
Content-Type: application/x-www-form-urlencoded
Content-Length: 59
remember+me=on&handle=myemail%40gmail.com&password=mypass
HTTP/1.1 302 Found
Server: nginx/0.8.8
Date: Sat, 20 Mar 2010 23:39:51 GMT
Content-Type: text/html
Connection: keep-alive
Set-Cookie: lockerz=...my_cookie...; path=/
Set-Cookie: lockerz=....my_cookie3_here...; path=/
Set-Cookie: lockerz=...my_cookie3_here...%3D%3D; path=/
Location: http://www.lockerz.com/myLocker
Content-Length: 0
Строкой "Location: http://www.lockerz.com/myLocker" он должен перебросить меня на эту страницу. Директива для этого у меня прописана. А он меня не перебрасывает. Куки должен автоматом читать из файла директивой CURLoption.CURLOPT_COOKIEJAR, насколько я понял. Я отсылаю запрос командой: response = http.HTTPPost(sUrl, "remember+me=on&handle=myemail%40gmail.com&password=mypass", ""); Капчи, соли и хиден полей нету, только чекбокс, 2 инпута и сабмит. Да, еще. Как послать ajax-запрос через эту либу? Чтоб в заголовке был "X-Requested-With: XMLHttpRequest"? Мне это тоже скоро понадобится.
|
|
|
RE: отправка post c libcurlNet в C# - 2010-03-21 17:00:59.893333
|
|
|
dOver
Сообщений: 140
Оценки: 0
Присоединился: 2007-03-31 04:41:56.070000
|
В общем, отснифал заголовки с моей программы. Оказалось, что не передаются куки. То, что в файл куки записывает, совсем не те, что браузер передает. В файле больше на сессию похоже. Почему не устанавливаются куки? На другом сайте пробовал, где тоже куки, вообще ничего не возвращает. Главный хедер возращает "HTTP/1.1 301 Moved Permanently" и дальше перебрасывает на глвную. Что я не так делаю?
|
|
|
|
|