PDA

Просмотр полной версии : Delphi


masel
12.05.2010, 19:41
как сграбить на сайте vkontakte.ru id страницы?

lamer811
12.05.2010, 19:53
Для начала сделай авторизацию и покажи, что у тебя получилось

heretic1990
12.05.2010, 22:36
Пример реализации авторизации на сервисе VKontakte.ru с использованием компонента Indy 10

после правильной авторизации должен вывести id страницы и имя
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.

RedFern.89
12.05.2010, 22:38
в топку инди

heretic1990
12.05.2010, 22:48
RedFern.89, ваши предложения!

stepashka_
12.05.2010, 23:04
в топку инди
Для начинающих кодеров в самый раз.

GhostOnline
12.05.2010, 23:16
в топку инди
Throll detected!

ЗЫ Сам на данный момент использую другую либу, но все равно считаю инди хорошой либой для некриворуких

090808
13.05.2010, 03:22
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);

RedFern.89
13.05.2010, 03:55
сам лично исправлял баги в инди и юзал их во многих приложениях, пока не зе*ало. юзайте wininet или сокеты))

M_script_
13.05.2010, 08:43
как сграбить на сайте vkontakte.ru id страницы?
/feed.php
/feed2.php

GhostOnline
13.05.2010, 09:07
сам лично исправлял баги в инди и юзал их во многих приложениях, пока не зе*ало. юзайте wininet или сокеты))
На сокетах ты не напишешь спамер стоимостью 500 у.е. за 3-4 дня ;)
А разработчик инди в сетевом программировании не один десяток лет, и в этом шарит куда побольше тебя.
А у тебя же чтобы написать толковый http клиент (с поддержкой SSl, socks, сжатием траффика, обработкой кукисов и т.п. и т.д.) на сокетах уйдет не один месяц работы

slesh
13.05.2010, 09:21
На сокетах ты не напишешь спамер стоимостью 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 быстро на диалогах модно написать и будет тебе счастье.

M_script_
13.05.2010, 09:36
на сокетах уйдет не один месяц работы
Ну это ты слишком преувеличил :)

В инди есть одна херня - он ООПный и юзает VCL
А для сетевых прог - это ужас.
В WinInet тоже есть кучка своих багов (к примеру если юзать FTP из него, то рано или поздно прога вылетит, если не будешь обрабатывать эксепшены. Причем вылетает по адресам именно WinInet)

А про курл что скажешь?

GhostOnline
13.05.2010, 09:41
slesh, написав "ты" я явно указал к кому я обращаюсь. Ты то может и напишешь, но вот насчет него я очень сомневаюсь. Достаточно посмотреть сколько тем открыто по одним и тем же вопросам.
Сжатие траффика - нужно. Представь ты пишешь спамилку для сайта. Чтобы отправить одно сообщение тебе надо получить 20-кбайтовую страницу, чтобы получить и вычислить параметры, имитируя яваскрипт (сейчас на многих порталах такая "защита").
Имея ограничение 100 кб/сек без сжатия максимум можно отправить 100/20=5 сообщений в секунду. Со сжатием выйдет примерно 100/8=12 сообщений в секунду.

Си и дельфи...Это все понятно что на низком уровне надо работать на винапи и никак по другому. Неужели ты подумал что я собирался писать ДДос бота на инди? но вот в прикладном ПО профит от сокетов не очевиден.

W!z@rD
13.05.2010, 09:51
и чо за холивар!?

Nelzone
13.05.2010, 09:57
и чо за холивар!?

делф круче

iGlass
13.05.2010, 10:26
Размер.. К чему за его уменьшением гнаться в наше время? Когда у большинства огромные объёмы памяти, процессоры по 4 ядра...

Что касается Indy, хороший пакет контролов, но сам всё же учусь работать с сокетами.
По сути инди тоже "сокеты" только в красивой обвёртке.

Сорри за офф. топ.

greki_hoy
13.05.2010, 10:35
CURL + GLIB у меня под вендой могу сказать одно они рулят :) и исходники открыты что то новое осваиваю из либ и тут же сорцы смотрю понимаеш на 200 % что пишеш + профит :)
ну и очень хороший фундамент для ядра программы в GLIB содержится :)
а CURL вообще прелесть пять минут и регистрация где надо с куками и всем прочим :)

slesh
13.05.2010, 10:40
2 GhostOnline в сокетах есть маааленькое приимущество.
Когда допустим тебе нужны куки то незачем тебе отгружать всю страницу целеком, достаточно тока хидер скачать и можно разрывать коннект.

Кстати, я видел ДДОС бота на Инди )

greki_hoy
13.05.2010, 10:49
ну не только на сокетах можно HEAD выполнить
curl_easy_setopt(easy, CURLOPT_NOBODY, TRUE); //... юзает метод HEAD
странно если в indy этого нет :)

GhostOnline
13.05.2010, 11:06
Ну вообще то в инди есть событие OnWork которое возникает каждый раз при получении N байт. Значение N выставляет программист. А при обработке события просто вызвать Disсonnect.
И HEAD в инди тоже есть конечно.
Косяк в инди - синхронный режим
А вообще - ICS рулит :) можно прекрасно обходится без потоков - экономия памяти и процессорного времени на переключении контекста, и не надо синхронизировать