11-11-2017, Saat: 15:36
(Son Düzenleme: 11-11-2017, Saat: 17:01, Düzenleyen: SimaWB.
Sebep: Resim görünmüyor
)
Bir çok kişi için kendi yazdığı program aracılığıyla bir web sitesine login olup oradan bazı bilgileri alma ihtiyacı hâsıl olmuştur. Zaten bu yüzden forumlarda sık sık sorulan 2 konudur "Bir web sitesine login olmak" ve "html parse" konuları.
Bu 2 konuyu bir örnekle göstermeye çalışacağım:
Login olma konusuna örnek olarak http://www.delphican.com'a login olmaya çalışalım
Bu konuda değişik yöntemler kullanılabilir ama ben Delphi ile birlikte geldiği için Indy bileşenlerinden TIdHTTP bileşenini kullanacağım.
Öncelikle login olmak istediğimiz web sayfasının kaynak kodlarına bakıp login olmak için hangi URL kullanılıyor, hangi değerler POST ediliyor onları tespit etmek gerekli.
http://www.delphican.com/index.php sayfasının kaynak kodlarına baktığımızda login formunun şu şekilde olduğu görülür:

Burada dikkat edeceğimiz ilk şey bu formdaki datalar hangi URLye post edilecek. Form’un action özelliğinden bunu anlayabiliyoruz: http://www.delphican.com/member.php
Demek ki biz IdHTTP.Post işlemi yaparken bu adresi kullanacağız.
İkincisi ise POST edilecek veriler nelerdir. Bunlar formun içindeki INPUTlardır.
Programımızda form içindeki inputları ve değerlerini bir liste haline getirip IdHTTP.Post’un ikinci parametresi olarak kullanmalıyız.
Cevabı basit: hatalı giriş yapsak da bize bir web sayfası gösteriliyor. O zaman biz başarılı giriş yapıp yapmadığımızı nasıl anlayacağız?
Bunun da kişiye göre değişen çözümleri olabilir. Örneğin, login olunmadığı takdirde delphican.com'un ana sayfasında "Hoşgeldin, Ziyaretçi" yazıyor. Ama login olunmuşsa Ziyaretçi yerine kullanıcı adımız yazıyor. Bu yazı kontrol edilebilir. Ben yukarıda kullandığımız quick_login'leri kullanmak istedim. Login'den sonra sayfanın kaynak kodlarında quick_login varsa login başarısız demektir.
Bu bilgiler ışında ve yukarıdaki kodlarda sadece kullanıcı adı ve şifremiz değişken olacağına göre bunları bir fonksiyon haline dönüştürelim.
Fonksiyonumuz bize tüm sayfanın HTML kodlarını döndürecek. Tabi login başarılı ise
Bir sonraki aşamada HTML parse'ye örnek olması için bu dönen değeri kullanacağız.
Bu 2 konuyu bir örnekle göstermeye çalışacağım:
Login olma konusuna örnek olarak http://www.delphican.com'a login olmaya çalışalım

Bu konuda değişik yöntemler kullanılabilir ama ben Delphi ile birlikte geldiği için Indy bileşenlerinden TIdHTTP bileşenini kullanacağım.
Öncelikle login olmak istediğimiz web sayfasının kaynak kodlarına bakıp login olmak için hangi URL kullanılıyor, hangi değerler POST ediliyor onları tespit etmek gerekli.
http://www.delphican.com/index.php sayfasının kaynak kodlarına baktığımızda login formunun şu şekilde olduğu görülür:

Burada dikkat edeceğimiz ilk şey bu formdaki datalar hangi URLye post edilecek. Form’un action özelliğinden bunu anlayabiliyoruz: http://www.delphican.com/member.php
Demek ki biz IdHTTP.Post işlemi yaparken bu adresi kullanacağız.
İkincisi ise POST edilecek veriler nelerdir. Bunlar formun içindeki INPUTlardır.
Programımızda form içindeki inputları ve değerlerini bir liste haline getirip IdHTTP.Post’un ikinci parametresi olarak kullanmalıyız.
var
IdHTTP: TIdHTTP;
Request: TStringList;
begin
Request := TStringList.Create;
try
Request.Add('action=do_login');
Request.Add('url=http://www.delphican.com/index.php');
Request.Add('quick_login=1');
Request.Add('quick_username=KULLANICI_ADI');
Request.Add('quick_password=SIFRE');
Request.Add('quick_remember=yes');
Request.Add('submit=Giriş Yap');
IdHTTP := TIdHTTP.Create;
try
IdHTTP.AllowCookies := True;
IdHTTP.HandleRedirects := True;
IdHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
IdHTTP.Post('http://www.delphican.com/member.php', Request);
finally
IdHTTP.Free;
end;
finally
Request.Free;
end;
Bu aşamada kullanıcı adımız ve şifremiz doğru ise login işlemi başarıyla sağlanmış demektir. Fakat başarısız bir login işlemi de olsa yukarıdaki kodda hata mesajı almazsınız. Neden? Cevabı basit: hatalı giriş yapsak da bize bir web sayfası gösteriliyor. O zaman biz başarılı giriş yapıp yapmadığımızı nasıl anlayacağız?
Bunun da kişiye göre değişen çözümleri olabilir. Örneğin, login olunmadığı takdirde delphican.com'un ana sayfasında "Hoşgeldin, Ziyaretçi" yazıyor. Ama login olunmuşsa Ziyaretçi yerine kullanıcı adımız yazıyor. Bu yazı kontrol edilebilir. Ben yukarıda kullandığımız quick_login'leri kullanmak istedim. Login'den sonra sayfanın kaynak kodlarında quick_login varsa login başarısız demektir.
Bu bilgiler ışında ve yukarıdaki kodlarda sadece kullanıcı adı ve şifremiz değişken olacağına göre bunları bir fonksiyon haline dönüştürelim.
function DoLogin(const username, password: string): string;
var
IdHTTP: TIdHTTP;
Request: TStringList;
begin
try
Request := TStringList.Create;
try
Request.Add('action=do_login');
Request.Add('url=http://www.delphican.com/index.php');
Request.Add('quick_login=1');
Request.Add('quick_username='+username);
Request.Add('quick_password='+password);
Request.Add('quick_remember=yes');
Request.Add('submit=Giriş Yap');
IdHTTP := TIdHTTP.Create;
try
IdHTTP.AllowCookies := True;
IdHTTP.HandleRedirects := True;
IdHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
IdHTTP.Post('http://www.delphican.com/member.php', Request);
Result := IdHTTP.Get('http://www.delphican.com');
if StrUtils.ContainsStr(Result, 'quick_login') then //Login başarısız demektir
Result := '';
finally
IdHTTP.Free;
end;
finally
Request.Free;
end;
except
Result := '';
end;
end;
Fonksiyonumuz bize tüm sayfanın HTML kodlarını döndürecek. Tabi login başarılı ise
Bir sonraki aşamada HTML parse'ye örnek olması için bu dönen değeri kullanacağız.
There's no place like 127.0.0.1


