Konuyu Oyla:
  • Derecelendirme: 5/5 - 3 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Web Sitesine Login Olma ve HTML Parse
#1
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 Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.'a login olmaya çalışalım  Smile

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.

Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. sayfasının kaynak kodlarına baktığımızda login formunun şu şekilde olduğu görülür:

4GVZvQ.png

Burada dikkat edeceğimiz ilk şey bu formdaki datalar hangi URLye post edilecek. Form’un action özelliğinden bunu anlayabiliyoruz: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
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 Smile   

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
WWW
Cevapla
#2
(11-11-2017, Saat: 15:36)SimaWB Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.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 Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.'a login olmaya çalışalım  Smile

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.

Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. sayfasının kaynak kodlarına baktığımızda login formunun şu şekilde olduğu görülür:

4GVZvQ.png

Burada dikkat edeceğimiz ilk şey bu formdaki datalar hangi URLye post edilecek. Form’un action özelliğinden bunu anlayabiliyoruz: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
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 Smile   

Bir sonraki aşamada HTML parse'ye örnek olması için bu dönen değeri kullanacağız.
 Bilgi için teşekkürler hocam, adamsınız Smile
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Cevapla
#3
Teşekkürler, parmaklarınıza sağlık Smile
Cevapla
#4
Teşekkür ederim çok güzel bir makale olmuş.

Bir dipçe düşeyim ssl serfitikasına sahip bir siteye Post/Get ile TIdHTTP aracını kullanarak login olamıyorsunuz maalesef.
Ben üzerinde bir ara bayağı uğraşmıştım bunun yerine Clever Internet Suite componetlerinden yaralandım. Bu tarz işlemler için başarılı bir componet.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#5
Hocam Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. adresindeki post sayfasını ve parametreleri nasıl alabiliriz denedim ama yapamadım:
country=2
state=546
stateRegion=9626
Cevapla
#6
(14-11-2017, Saat: 00:50)delphi-x Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Hocam Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. adresindeki post sayfasını ve parametreleri nasıl alabiliriz denedim ama yapamadım:
country=2
state=546
stateRegion=9626

Hocam bu şekilde birşey istiyorsaniz size source kodları akşam atabilirim.

Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Cevapla
#7
(14-11-2017, Saat: 08:04)hyperxman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(14-11-2017, Saat: 00:50)delphi-x Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Hocam Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. adresindeki post sayfasını ve parametreleri nasıl alabiliriz denedim ama yapamadım:
country=2
state=546
stateRegion=9626

Hocam bu şekilde birşey istiyorsaniz size source kodları akşam atabilirim.

Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

Halilcim küçücük uygulama 3mb mı?.. Canlıya çıktığım zaman exe yi Release modda oluşturup, Mpress ile sıkıştırma yaptıktan sonra exe dağıtımını yaparsan bence 3mb olmaz.. kendime ait bir uygulamam var yaklaşık 40 form ve compnent ve kodların sayısını ben ble bilmiyorum Smile.. ama o bile 3mb oluyor.. neyse mpress le sıkıştırmayı bir dene derim..
Cevapla
#8
selamlar.

idHttp ile login olduktan sonra diğer sayfalara login olmuş hale gezmek mümkün mü bunun için nasıl bir yok izlemek gerekiyor.
her yeni sayfada tekrar login işleminin tekrarlanması mi gerekli?
dolaşacağımız site bunu nasıl bilecek farklı bir yöntem yada bileşen mi gerekiyor?
bilgi verirseniz sevinirim.
Cevapla
#9
(01-01-2018, Saat: 17:33)tavsanlili Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.selamlar.

idHttp ile login olduktan sonra diğer sayfalara login olmuş hale gezmek mümkün mü bunun için nasıl bir yok izlemek gerekiyor.
her yeni sayfada tekrar login işleminin tekrarlanması mi gerekli?
dolaşacağımız site bunu nasıl bilecek farklı bir yöntem yada bileşen mi gerekiyor?
bilgi verirseniz sevinirim.

Normal şartlarda gerekmez. Bunun için IdHttp'nin AllowCookies özelliğini True yapmanız yeterli(Varsayılan olarak True'dur). Ayrıca IdCookieManager bileşenine bakabilirsiniz.
There's no place like 127.0.0.1
WWW
Cevapla
#10
DoLogin('Kullaniciadim', 'sifrem');

  memo1.Lines.add(idhttp1.Get('http://www.delphican.com/index.php'));

şeklinde butona atıp memo içerisindeki ziyaretçi yada kullanıcı adımın geçtiği kısımları tarıyorum , olumsuz.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Fluent HTML uparlayan 9 1.962 11-06-2019, Saat: 22:57
Son Yorum: ahmetb
  Web Sitesine Login Olma ve HTML Parse - 2 SimaWB 10 2.105 15-02-2019, Saat: 03:02
Son Yorum: BasK
  XML Parse ve RSS SimaWB 5 1.415 14-12-2017, Saat: 14:10
Son Yorum: uparlayan
  TWebBrowser Lafınızı Dinlesin, HTML 5'ten anlasın uparlayan 13 2.469 14-11-2017, Saat: 21:10
Son Yorum: uparlayan
  Tüm Platformlar için (cross-platform) HTML Dosyası Oluşturma Fesih ARSLAN 0 1.681 21-10-2016, Saat: 11:53
Son Yorum: Fesih ARSLAN



Konuyu Okuyanlar: 1 Ziyaretçi