Пример реализации авторизации на сервисе VKontakte.ru с использованием компонента Indy 10 после правильной авторизации должен вывести id страницы и имя Code: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, idHTTP, idCookieManager, IdCookie; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Edit1: TEdit; Edit2: TEdit; Button1: TButton; Label3: TLabel; Label4: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var http:TidHttp; CooM:TidCookieManager; data:TStringList; page, id, name:String; begin http:=TIdHTTP.Create(Self); data :=TStringList.Create; CooM:=TidCookieManager.Create(http); http.AllowCookies:=true; http.CookieManager:=CooM; http.HandleRedirects:=true; {****Включить по желанию****} // http.Request.Host:='vkontakte.ru'; // http.Request.UserAgent:='Opera/9.51 (Windows NT 5.1; U; ru)'; // http.Request.Accept:='text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'; // http.Request.AcceptLanguage:='ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3'; // http.Request.AcceptEncoding:='gzip,deflate'; // http.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.7'; // http.Request.Referer:='http://vkontakte.ru/u=1'; data.Add('u=1'); data.Add('success_url='); data.Add('fail_url='); data.Add('try_to_login=1'); data.Add('email='+Edit1.Text); data.Add('pass='+Edit2.Text); Page:= http.Post('http://vkontakte.ru/login.php?', data); data.Free; Coom.Free; http.Free; name:=''; name:=copy(page,Pos('<h1> <b>Online</b>',page)+length('<h1> <b>Online</b>'),Pos('<span>',page)-(Pos('<h1> <b>Online</b>',page)+length('<h1> <b>Online</b>'))); if Pos('<h1> <b>Online</b>',page)<>0 then Label4.Caption:='Name :: '+name; id:=''; if Pos('<input type="hidden" id="mid" value="',page)<>0 then delete(page,1,Pos('<input type="hidden" id="mid" value="',page)-1); id:=copy(page,Pos('<input type="hidden" id="mid" value="',page)+length('<input type="hidden" id="mid" value="'),Pos('">',page)-(Pos('<input type="hidden" id="mid" value="',page)+length('<input type="hidden" id="mid" value="'))); if Pos('<input type="hidden" id="mid" value="',page)<>0 then Label3.Caption:='ID :: '+id; end; end.
Throll detected! ЗЫ Сам на данный момент использую другую либу, но все равно считаю инди хорошой либой для некриворуких
function TForm1.Pars(T_, ForS, _T: string): string; var a, b: integer; begin Result := ''; if (T_ = '') or (ForS = '') or (_T = '') then Exit; a := Pos(T_, ForS); if a = 0 then Exit else a := a + Length(T_); ForS := Copy(ForS, a, Length(ForS) - a + 1); b := Pos(_T, ForS); if b > 0 then Result := Copy(ForS, 1, b - 1); var Domen:string; begin Domen :=Form1.Idhttp1.Get('http://vkontakte.ru/settings.php'); Domen:=Pars('<div class="labeled_text" id="page_url">http://vkontakte.ru/',Domen,'</div>'); ShowMessage(Domen);
сам лично исправлял баги в инди и юзал их во многих приложениях, пока не зе*ало. юзайте wininet или сокеты))
На сокетах ты не напишешь спамер стоимостью 500 у.е. за 3-4 дня А разработчик инди в сетевом программировании не один десяток лет, и в этом шарит куда побольше тебя. А у тебя же чтобы написать толковый http клиент (с поддержкой SSl, socks, сжатием траффика, обработкой кукисов и т.п. и т.д.) на сокетах уйдет не один месяц работы
C чего ты это всё взял? В инди есть одна херня - он ООПный и юзает VCL А для сетевых прог - это ужас. В WinInet тоже есть кучка своих багов (к примеру если юзать FTP из него, то рано или поздно прога вылетит, если не будешь обрабатывать эксепшены. Причем вылетает по адресам именно WinInet) Сокеты - SSL привентить туда - 10 строк кода. Поддержка Socks4/5 (без авторизации) тож строк 10 для каждого типа. Сжатия - нах? Тупо не посылай в заголовке поддержку gzip. Куки - тоже довольно простая вешь, которая не требует ничего особенного, причем отпарсить их не составит труда. И спамер можно написать за 2-3 дня максимум. Если учесть что 1 день полностью потратить на реализацию работы с сокетами. Зато производительность будет большая и памяти хавать будет на порядок меньше. Да и вообще Indy - это Delphi. А Делви для чегото долго работающего - мало подходит. А вот Си самый раз выходит. Да и размер будет довольно маленький. Многопоточный коннект бек прокси поддерживающий http(GET, POST, CONNECT + множественные запросы в одной сессии), Socks4, Socks5 - это всё 5 кб без сжатия выходит на Си. Делфи курит в сторонке. А GUI быстро на диалогах модно написать и будет тебе счастье.
slesh, написав "ты" я явно указал к кому я обращаюсь. Ты то может и напишешь, но вот насчет него я очень сомневаюсь. Достаточно посмотреть сколько тем открыто по одним и тем же вопросам. Сжатие траффика - нужно. Представь ты пишешь спамилку для сайта. Чтобы отправить одно сообщение тебе надо получить 20-кбайтовую страницу, чтобы получить и вычислить параметры, имитируя яваскрипт (сейчас на многих порталах такая "защита"). Имея ограничение 100 кб/сек без сжатия максимум можно отправить 100/20=5 сообщений в секунду. Со сжатием выйдет примерно 100/8=12 сообщений в секунду. Си и дельфи...Это все понятно что на низком уровне надо работать на винапи и никак по другому. Неужели ты подумал что я собирался писать ДДос бота на инди? но вот в прикладном ПО профит от сокетов не очевиден.
Размер.. К чему за его уменьшением гнаться в наше время? Когда у большинства огромные объёмы памяти, процессоры по 4 ядра... Что касается Indy, хороший пакет контролов, но сам всё же учусь работать с сокетами. По сути инди тоже "сокеты" только в красивой обвёртке. Сорри за офф. топ.
CURL + GLIB у меня под вендой могу сказать одно они рулят и исходники открыты что то новое осваиваю из либ и тут же сорцы смотрю понимаеш на 200 % что пишеш + профит ну и очень хороший фундамент для ядра программы в GLIB содержится а CURL вообще прелесть пять минут и регистрация где надо с куками и всем прочим
2 GhostOnline в сокетах есть маааленькое приимущество. Когда допустим тебе нужны куки то незачем тебе отгружать всю страницу целеком, достаточно тока хидер скачать и можно разрывать коннект. Кстати, я видел ДДОС бота на Инди )
ну не только на сокетах можно HEAD выполнить curl_easy_setopt(easy, CURLOPT_NOBODY, TRUE); //... юзает метод HEAD странно если в indy этого нет