Sayfa Kaynağı ve idhttpnin çektiği Kaynak Kod ÇÖZÜLDÜ

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
shochan
Üye
Mesajlar: 89
Kayıt: 06 Eki 2008 04:54
Konum: Kayseri

Sayfa Kaynağı ve idhttpnin çektiği Kaynak Kod ÇÖZÜLDÜ

Mesaj gönderen shochan »

S.a

Sormak istediğim şey şu forumdaki aramalarım sonucu yaptığım programla siteye login olabiliyorum fakat login olduktan sonra açılan sayfada mousela sağ tıklayıp kaynağı görüntüle dediğimde gösterilen sayfa kaynağı ile programdan idhttp.get methodu ile aynı linkten memo içerisine gelen sayfa kaynak kodu farklı :S bu neden olabilir yardımcı olabilirmisiniz bana sağ tıkladığımda gelen kaynak kodlar lazım içinden bazı değerleri programda göstermek istiyorum.

Şimdiden ilgilenen arkadaşlara tşk ederim..
En son shochan tarafından 04 Kas 2010 10:30 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
  • Devler Gibi İşler Yapmak İçin Karıncalar Gibi Çalışmak Lazım ...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Sayfa Kaynağı ve idhttpnin çektiği Kaynak Kod

Mesaj gönderen mrmarman »

ajax kullanan sitelerde içerik veritabanından beslenir ve gelmesi biraz zaman alır. Belli aralıklarla HTML kaynak kodlarını tekrar tekrar sorgulayıp, önceden kabul edeceğiniz ve bilgilerin geldiğine işaret edecek kelime / kod gelmişse bundan sonra sayfayı parse işlemine tabi tutacaksınız.
Resim
Resim ....Resim
Kullanıcı avatarı
shochan
Üye
Mesajlar: 89
Kayıt: 06 Eki 2008 04:54
Konum: Kayseri

Re: Sayfa Kaynağı ve idhttpnin çektiği Kaynak Kod

Mesaj gönderen shochan »

Hocam cevabınız için tşk ederim zaten bugüne kadar çoğu takıldımyerlerde sizin yazdıklarınızla çözdüm sorunumu eğer yanlış anlamadıysam belli bir zaman sonra sorguladığımda sayfa kaynağı istediğim gibi gelir ve parse işlemi yapabilirim doğrumu anlamışım en iyisi denemek :D tekrardan tşk ederim :)
  • Devler Gibi İşler Yapmak İçin Karıncalar Gibi Çalışmak Lazım ...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Sayfa Kaynağı ve idhttpnin çektiği Kaynak Kod

Mesaj gönderen mrmarman »

Evet aynen bunu ifade etmiştim. Hani "WHILE WebBrowser1.STATE <> ReadyState_Complete DO Application.ProcessMessages" gibisinden bekleme yapıyoruz ya, bu navigasyonun tamamlana kadar beklemesini sağlıyordu; bunun yerine sayacağım iki triggerden birini tercih ederek kullanıyorsunuz.

1. WebBrowser'in OnDocumentComplete eventinde işlem tamamlandığında URL'de değişiklik gözlemlenebilir. Bunu takip edebilirsin.

Bu değişikliği gözlemlemek için şöyle yap; Forma bir webbrowser koydun ya, bir tane de MEMO ekle ve OnDocumentComplete olayında Memo1.Lines.Add( URL ); komutunu ver. Sonra da bir butondan dilediğin sorgulamayı gerçekleştir. Bir gözün de MEMO'da olsun. Ekrana ifade tümüyle geldiğinde MEMO'ya eklenen bir satır algılamaya çalış. Bu gerçekleşirse senin trigger'in bu demekt olacaktır. BU değişikliği kontrol ettirecek altyapı hazırlarsın.

2. Yine aynı yerde yani WebBrowser'in OnDocumentComplete eventinde 1 numaralı değişiklik gözlenemezse bu sefer String arama işleminde kullandığımız POS fonksiyonu ile INNERHTML içinden bekleyeceğin bilgi ile html kaynağa düşen bir son satır niteliğindeki kodu sorgularsınız. Pos( AradiginKod, HTMLKOdu ) > 0 olursa işlem tamamdır deyip tetiği çekersin.

Her iki yöntemin tetik mekanizması olarak da xIslemTamam gibi bir Boolean değişkeni true/fase şeklinde kullanarak, Navigasyon komutuyla WHILE beklemesi yaptığında bu Boolean değişkeni de bunu da dahil eder istediğin / beklediğin sonucu alınca işleme başlamasını sağlayabilirsin.

Umarım açıkça ifade edebilmişdir.
Resim
Resim ....Resim
Kullanıcı avatarı
shochan
Üye
Mesajlar: 89
Kayıt: 06 Eki 2008 04:54
Konum: Kayseri

Re: Sayfa Kaynağı ve idhttpnin çektiği Kaynak Kod

Mesaj gönderen shochan »

Sa hocam dediğiniz 2 maddeyide uyguladım 1.de url'de hiç bir değişiklik olmuyor 2.de ise Pos( AradiginKod, HTMLKOdu ) > 0 değil 0 olarak çıkıyo nasıl iştir anlamadım aynı pos olayı ile herhangi bi döviz sitesinden kur değerini bulabiliyorum kodda bi soru yok bence

Kod: Tümünü seç

var
strl:tstringlist;
begin
strl:=TStringList.Create;
memo1.Text:=strl.Text;
ShowMessage(inttostr(pos(str,strl.Text)));
label7.Caption:=copy(strl.Text,pos(str,strl.Text)+length(str),6);
str değişkenini tanımladım yerde şöyle

Kod: Tümünü seç

var
  Form1: TForm1;
  str:string='{"player":{"id":"';
Koddamı bi hata yapıyorum yoksa sizin dedğiniz olayımı yanlış anladım yanlış yapıyorum ?
  • Devler Gibi İşler Yapmak İçin Karıncalar Gibi Çalışmak Lazım ...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Sayfa Kaynağı ve idhttpnin çektiği Kaynak Kod

Mesaj gönderen mrmarman »

Şöyle yaparak sonucu inceler misin.

Ekrana bir button daha ekleyelim aşağıdaki vereceğim kodu aynen bu butona yazalım. WebBroser1 yerine kendi WebBrowser'ini yazarsın. Bu kod sana şunu sağlayacak, butona her bastığında sayaç bir artarak HTML içeriğini programınla aynı isimde ama _01.HTML _02.HTML gibi isimler vererek program klasörüne kaydedecek.

Sen ekranda bilgiler belirmeden önce ve sonra elinle manuel olarak bir kaç defa bas. sonra da program klasörüne gidip bu dosyalardan hangilerinde ne değişiklik olduğuna bak. Değişiklik olan ile olmayan arasındaki fark senin tetik mekanizmanı oluşturacaktır.

ilgilendiğin site özel bir site değilse buradan verirsen inceleriz ama altını çizmek istiyorum, Explorer ile ekranda ne görüyorsan, webbrowser ile de görebiliyor ve içeriğini alabiliyor olman lazım.

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
{$j+}
  Const Sayac : Integer = 0;
{$j-}
begin
  With TStringList.Create do begin
    Text := WebBrowser1.OleObject.Document.Body.InnerHTML;
    Inc(Sayac);
    SaveToFile( ChangeFileExt( Application.ExeName, Format('_%.2d.HTML', [ Sayac ]) ) );
    Free;
  end;
end;
Bu arada ilk sorunu yeniden inceledim. InnerHTML ile aldığın koddan ( yani aynı kaynaktan ) yeniden kod aralığını elde etmeye çalışmalısın. Explorer'da çift tırnak olan yerler InnerHTML ile aldığın yerde olmayabilir. Bu normaldir. Sana verdiğim bu kodlarla elde ettiğin HTML içeriği kendine master olarak kalbul ederek yoluna devam etmelisin.

Muhtemelen göreceksin ki

Kod: Tümünü seç

str:string='{"player":{"id":"';
yerine

Kod: Tümünü seç

str:string='{player:{id:';
gibi bir sonuçla bile karşılaşabilirsin.
Resim
Resim ....Resim
Kullanıcı avatarı
shochan
Üye
Mesajlar: 89
Kayıt: 06 Eki 2008 04:54
Konum: Kayseri

Re: Sayfa Kaynağı ve idhttpnin çektiği Kaynak Kod

Mesaj gönderen shochan »

yok hocam özel bi site değil oynamakta olduğum bir browser oyunu için program yapmak istiyorum sakın yanlış anlaşılmasın amacım oyuna yönelik bir hile yada bot yazmak değil sadece oyun gerçek zamanlı süreli bi oyun olduğu için oyunda yapmam gerekenleri yapıp daha sonra başka şeylerle uğraşıyorum bu arada oyunda değişiklik olursa programın bana uyarı wermesini istiyorum amacım bu.

Yalnız forum kurallarını pek okumadığım için :D :oops: böyle bişey yasakmı bilmiyorum istersen site linki ve deneme amaçlı açtığım kullanıcı adı ve şifremi özel mesaj olarak verebilirim.
  • Devler Gibi İşler Yapmak İçin Karıncalar Gibi Çalışmak Lazım ...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Sayfa Kaynağı ve idhttpnin çektiği Kaynak Kod

Mesaj gönderen mrmarman »

Söylediğinizden yaptığım çıkarımdan, oyun sitelerinde aynı ekranda farklı formlar mevcut olduğunu biliyoruz. Ekranın farklı yerlerinden sağ mouse yapıp, kaynak kod aldığınızda farklı html kodlar alıyorsanız INNERHTML için yanlış forma odaklı olduğunuz varsayımını gündeme getiriyor.
Resim
Resim ....Resim
Kullanıcı avatarı
shochan
Üye
Mesajlar: 89
Kayıt: 06 Eki 2008 04:54
Konum: Kayseri

Re: Sayfa Kaynağı ve idhttpnin çektiği Kaynak Kod

Mesaj gönderen shochan »

Haklısınız hocam sanırım sayfa 2 frameden oluşuyo size msjyazdım hocam konuyla ilgili
  • Devler Gibi İşler Yapmak İçin Karıncalar Gibi Çalışmak Lazım ...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Sayfa Kaynağı ve idhttpnin çektiği Kaynak Kod

Mesaj gönderen mrmarman »

Oyun'un forum kurallarına aykırı yanı olmadığından kodları buradan paylaşayım...

Aşağıda ilgili oyuna login oluyor ve Odun, Kil, Demir değerlerini 5 saniyede bir StatusBar'da yenileyerek gösteriyor. Gerisi sana kalmış.

Unutmadan... Login bilgilerini Edit kutularına girdiğinde INI dosyasına kaydedilir. Tekrar çalıştırdığında önceki girdiğin login bilgileri hatırlanır. Etüd projedir. Yanlış login bilgisi girersen program hataya düşer çünkü hiçbir kontrol koymadım.
Resim

Kod: Tümünü seç

var
  Form1: TForm1;
  xAsama    : Integer = 0;
  xDunyaSec : Boolean = False;

Const
  Asama_1 = 'Hangi oyun dünyasına katılmak istiyorsun?';
  
implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
Const
  Url       = 'www.klanlar.org';
Var
  kullanici : String;
  sifre     : String;
begin
  kullanici := Edit1.Text;
  sifre     := Edit2.Text;
  xAsama    := 0; // İlk Login Aşamasındayız...
  WebBrowser1.Navigate( URL );
  while WebBrowser1.ReadyState <> ReadyState_Complete
      do Application.ProcessMessages;
  WebBrowser1.OleObject.Document.GetElementByID('user').Value     := kullanici;
  WebBrowser1.OleObject.Document.GetElementByID('password').Value := sifre;

  xAsama    := 1; // Dünya Seçimi Sorgulama Aşamasındayız.
  xDunyaSec := False;
  WebBrowser1.OleObject.Document.GetElementByID('login_button').Click;

  // OnDownloadComplete'den takip ediyoruz...
  while NOT xDunyaSec do Application.ProcessMessages;

  // Aktif Dünya'ya geçiş...
  WebBrowser1.OleObject.Document.forms.item(1).elements.item(4).Click;
  BitBtn1.Enabled := False;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
{$j+}
  Const Sayac : Integer = 0;
{$j-}
begin
  With TStringList.Create do begin
    Text := WebBrowser1.OleObject.Document.Body.InnerHTML;
    Inc(Sayac);
    SaveToFile( ChangeFileExt( Application.ExeName, Format('_%.2d.HTML', [ Sayac ]) ) );
    Free;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
Var
  INI : TINIFile;
begin
  INI := TINIFile.Create( ChangeFileExt(Application.Exename, '.INI') );
    INI.WriteString('MAIN', 'isim',  Edit1.Text );
    INI.WriteString('MAIN', 'sifre', Edit2.Text );
  INI.Free;
end;

procedure TForm1.FormShow(Sender: TObject);
Var
  INI : TINIFile;
begin
  INI := TINIFile.Create( ChangeFileExt(Application.Exename, '.INI') );
    Edit1.Text := INI.ReadString('MAIN', 'isim',  '' );
    Edit2.Text := INI.ReadString('MAIN', 'sifre', '' );
  INI.Free;
end;

procedure TForm1.HTMLParse( Gelen : String );
Var
  Ara, Blok : String;
  Odun, Kil, Demir : String;
begin
  Blok := Gelen;
  Ara := '>Üretim<';
  System.Delete(Blok, 1, Pos(Ara, Blok) + Length(Ara)-1);

  // Odun
  Ara := '>Odun<';
  System.Delete(Blok, 1, Pos(Ara, Blok) + Length(Ara)-1);
    Ara := '<STRONG>';
    System.Delete(Blok, 1, Pos(Ara, Blok) + Length(Ara)-1);
  Odun := Copy(Blok, 1, Pos('<', Blok)-1);
  // Kil
  Ara := '>Kil<';
  System.Delete(Blok, 1, Pos(Ara, Blok) + Length(Ara)-1);
    Ara := '<STRONG>';
    System.Delete(Blok, 1, Pos(Ara, Blok) + Length(Ara)-1);
  Kil := Copy(Blok, 1, Pos('<', Blok)-1);
  // Demir
  Ara := '>Demir<';
  System.Delete(Blok, 1, Pos(Ara, Blok) + Length(Ara)-1);
    Ara := '<STRONG>';
    System.Delete(Blok, 1, Pos(Ara, Blok) + Length(Ara)-1);
  Demir := Copy(Blok, 1, Pos('<', Blok)-1);
  StatusBar1.Panels[1].Text := Format('Odun:%s, Kil:%s, Demir:%s', [Odun, Kil, Demir]);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
{$j+}
  Const
    Sayac : Integer = 0;
    Saniye: Integer = 5;
{$j-}
begin
  if BitBtn1.Enabled then Exit; // login olununca çalışmaya başlayacak...

  // Time 1000 interval yani 1 saniye
  Dec(Saniye);
  if Saniye = 0 then
  begin
    StatusBar1.Panels[0].Text := Format('%d', [Saniye]);
    Saniye := 5;
    HTMLParse( WebBrowser1.OleObject.Document.Frames.item(0).Document.Body.InnerHTML )
  end else begin
    StatusBar1.Panels[0].Text := Format('%d', [Saniye]);
  end;
end;

procedure TForm1.WebBrowser1DownloadComplete(Sender: TObject);
begin
  if xAsama = 1 then begin
    if Pos(Asama_1, WebBrowser1.OleObject.Document.Body.InnerHTML) > 0
      then xDunyaSec := True;
  end;
end;
Dosya ekleri
Oyun_Takip.rar
OyunTakip ( Kaynak Kodları ve Çalışan EXE dosyası )
(197.77 KiB) 233 kere indirildi
En son mrmarman tarafından 01 Nis 2011 08:23 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Resim
Resim ....Resim
Kullanıcı avatarı
shochan
Üye
Mesajlar: 89
Kayıt: 06 Eki 2008 04:54
Konum: Kayseri

Re: Sayfa Kaynağı ve idhttpnin çektiği Kaynak Kod

Mesaj gönderen shochan »

Hocam Allah senden razı olsun :) gerisini ben hallederim ama şunuda belirteyim ben login olurken Sesion id belirterek dünya seçimi yapıordum dünya seçme kısmını sizin yönteminizle yapmak isteyip yapamamıştım onuda nasıl yapılacağınıörenmiş oldum :) tekrardan elinize sağlık :)
  • Devler Gibi İşler Yapmak İçin Karıncalar Gibi Çalışmak Lazım ...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Sayfa Kaynağı ve idhttpnin çektiği Kaynak Kod ÇÖZÜLDÜ

Mesaj gönderen mrmarman »

sevindim. :)

Başarılar.
Resim
Resim ....Resim
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Sayfa Kaynağı ve idhttpnin çektiği Kaynak Kod ÇÖZÜLDÜ

Mesaj gönderen G.Arkas »

Abi öldüm gülmekten :P Sonunda bunu da yaptırdık sana :D Cracker lar peşine düşecekler bak gürkan demedi deme :D
Resim
Cevapla