TEmbeddedWB proxy birdenbire çalışmaz oldu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ahmetax
Üye
Mesajlar: 60
Kayıt: 14 Kas 2014 12:17

TEmbeddedWB proxy birdenbire çalışmaz oldu

Mesaj gönderen ahmetax »

Merhaba,
Düne kadar neredeyse sorunsuz çalışan TEmbeddedWB proxy fonksiyonları dünden beri çalışmaz oldu. Daha doğrusu bütün proxy sunucuları saydam gibi davranmaya başladı. Bİr programlama hatası sözkonusu değil, çünkü aynı programın çalışan eski sürümleri de aynı şekilde çalışıyor.
Bu davranış, farklı internet sağlayıcıları üzerinde de aynı tepkiyi veriyor.
Böyle bir durumla karşılaşan var mı?
Bu son iki günde TEmbeddedWB kullanan ve proxy fonksiyonlarını başarıyla çalıştıran var mı?
Teşekkürler.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: TEmbeddedWB proxy birdenbire çalışmaz oldu

Mesaj gönderen mrmarman »

Hocam TEmbeddedWB üzerinde browsera ona özel bir proxy ayarı yok. Sen oradaki ayarları değiştirince direkt senin windows'un internet ayarlarındaki bağlantı kısmındaki proxy değişikliğini senin yerine yapıyor.

Senin Windows'un güvenlik ilkelerinde belki de oraya yazılım ile erişim kısıtlanmıştır veya kullandığın makinede UAC (Kullanıcı hesabı denetiminde) senin proje engellenecekler listesine alınmıştır.

Araştırmanı buna odaklamalısın. Bu bağlamda EmbeddedWB için özel bir ayar olmadığını bildiğine göre bunu kendin projene yaptırabilir, refresh işlemini yapabilirsin tabi yine güvenlik konusundaki engeller kalktıktan sonra.

Şimdi sana bir alternatif (kendi kullandığımdır hala da çalışıyor...)
Sadece erişmeye çalıştığın siteye özel proxy işlesin ama windows gelenine devre dışı kalsın gibi bir amacın olduğunu sezinledim. Yanlışım varsa belirt. Aşağıdaki procedure bu işi yapıyor. Senin için TEmbeddedWB olarak parametrelendirdim, ben normal TWebBrowser kullanıyorum.

(Yıllardır kullanırım. Kendi lisans sunucuma Türk Telekom ile aynı ADSL altyapısında olmasına rağmen istemcilerimden bazılarının erişmediği raporunu almıştım. Ben de anlık olarak internetten ücretsiz aktif proxy servislerini taratıp pingi düşük olanlarını sırasıyla deniyor ve günlük lisans konusunda engelleri aşıyorum.)

Kod: Tümünü seç

uses UrlMon, WinInet;

procedure ProxyIleBrowser( WebBrowser:TEmbeddedWB; strURL, strUser, strPass, strProxy:String; iPort:Integer );
  procedure DeleteIECache;
  var
    lpEntryInfo: PInternetCacheEntryInfo;
    hCacheDir  : LongWord;
    dwEntrySize: LongWord;
  begin
    dwEntrySize := 0;
    FindFirstUrlCacheEntry( nil, TInternetCacheEntryInfo(nil^), dwEntrySize );
    GetMem( lpEntryInfo, dwEntrySize );
    if dwEntrySize > 0
      then lpEntryInfo^.dwStructSize := dwEntrySize;
    hCacheDir   := FindFirstUrlCacheEntry( nil, lpEntryInfo^, dwEntrySize );
    if hCacheDir <> 0 then
    begin
      repeat
        DeleteUrlCacheEntry( lpEntryInfo^.lpszSourceUrlName );
        FreeMem( lpEntryInfo, dwEntrySize );
        dwEntrySize := 0;
        FindNextUrlCacheEntry( hCacheDir, TInternetCacheEntryInfo(nil^), dwEntrySize );
        GetMem( lpEntryInfo, dwEntrySize );
        if dwEntrySize > 0
          then lpEntryInfo^.dwStructSize := dwEntrySize;
      until not FindNextUrlCacheEntry( hCacheDir, lpEntryInfo^, dwEntrySize );
    end;
    FreeMem( lpEntryInfo, dwEntrySize );
    FindCloseUrlCache( hCacheDir );
  end;

var
  PIInfo : PInternetProxyInfo; 
begin
  New (PIInfo) ;
    PIInfo^.dwAccessType    := INTERNET_OPEN_TYPE_PROXY ;
    PIInfo^.lpszProxy       := PChar( Format('%s:%d', [ strProxy, iPort ]) );
    PIInfo^.lpszProxyBypass := PChar('');
    if strUser <> '' then begin
      UrlMkSetSessionOption( INTERNET_OPTION_PROXY_USERNAME, PAnsichar(strUser), Length(strUser)+1, 0 );
      UrlMkSetSessionOption( INTERNET_OPTION_PROXY_PASSWORD, PAnsichar(strPass), Length(strPass)+1, 0 );
    end;
    UrlMkSetSessionOption( INTERNET_OPTION_PROXY, piinfo, SizeOf(Internet_Proxy_Info), 0 );
  Dispose (PIInfo) ;

  // Önce boş işlem ile browser'in farkındalığını sağlayalım. Yoksa idrak edemiyor :)
  WebBrowser.Navigate('about:blank');

  // Şimdiki session için proxy ayarımız yapıldı. Artık gezinebiliriz...
  WebBrowser.Navigate(strURL);
  while WebBrowser.ReadyState <> READYSTATE_COMPLETE do
  begin
    Application.ProcessMessages;
    Sleep(1);
  end;

  // Tarama Sessionunu kapatlım...
  // Eğer ardışık sorgu yapılacak ise bu alttaki kısmı sorgular dizisinin en sonuna alalım...
  InternetSetOption( nil, INTERNET_OPTION_END_BROWSER_SESSION, nil, 0 );
  DeleteIECache();
end;
Kullanımı :
// isim şifre sorsun ki çalıştığını anlayın diye örneğe 'proxy.gazi.edu.tr' koydum.

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  // Sadece ilgili tarama için proxy çalışır.. Sonra kendini imha eder.. :)
  ProxyIleBrowser( EmbeddedWB1, 'http://www.google.com.tr', '', '', 'proxy.gazi.edu.tr', 2001 );
end;
Resim
Resim ....Resim
ahmetax
Üye
Mesajlar: 60
Kayıt: 14 Kas 2014 12:17

Re: TEmbeddedWB proxy birdenbire çalışmaz oldu

Mesaj gönderen ahmetax »

Merhaba Muharrem bey,

Ayrıntılı yanıtınız için peşinen teşekkür ederim.

Önce bazı gözlemlerimden bahsedeyim:
TEmbeddedWB ile hazırladığım programda özel bir önlem almadığım halde, proxy değerlerinin sadece programla sınırlı kaldığını farkettim. Proxy kullanan programım arka planda çalışmaya devam ederken, ben istediğim başka bir browser programını açıp normal IP üzerinden sorunsuz çalışabiliyordum.

Bu özelliğin TEmbeddedWB bileşenine has bir özellik olduğunu varsaydım. Bu bileşenin üzerinde bu kadar durmamın nedeni bu. Çünkü tahmin ettiğiniz gibi, bu programın arka planda çalışmasını ve diğer internet bağlantılı işlemlerimi etkilememesini istiyorum.

Eğer proxy etkisi örneğini verdiğiniz fonksiyonla sağlanabiliyorsa, TEmbeddedWB kullanmama gerek kalmayabilir.

Bir diğer konu, Delphi'de işlem yapamaz hale gelince bu kez C# üzerinde aynı amaca yönelik bir çalışma yaptım. Algoritma aynı, tek fark, program çalıştığında proxy değişiminin her yere yansıması. Bu programcık hiç sorunsuz çalışıyor ama, benim bazı ek çalışmalardan vazgeçmemi gerektiriyor.

Verdiğiniz fonksiyonu yarın mutlaka deneyeceğim. Onu istediğim gibi çalıştırabilirsem, moralimin yeniden düzeleceğini umuyorum.

Tekrar teşekkür ediyorum.
İyi ki varsınız! :)
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: TEmbeddedWB proxy birdenbire çalışmaz oldu

Mesaj gönderen mrmarman »

ahmetax yazdı:Önce bazı gözlemlerimden bahsedeyim:
TEmbeddedWB ile hazırladığım programda özel bir önlem almadığım halde, proxy değerlerinin sadece programla sınırlı kaldığını farkettim. Proxy kullanan programım arka planda çalışmaya devam ederken, ben istediğim başka bir browser programını açıp normal IP üzerinden sorunsuz çalışabiliyordum.
- Deneme yaptığımda aksi şekilde çalıştı. Belki de benim hatam çünkü EmbeddedWB'nin ProxySettings.AutoLoadProxy:=true; ve RefreshProxy; şeklinde set ettiğimden bahsettiğim şekilde mimik verdi, bilemiyorum.

- Her halükarda sonucu bildirin, başarılar.
Resim
Resim ....Resim
ahmetax
Üye
Mesajlar: 60
Kayıt: 14 Kas 2014 12:17

Re: TEmbeddedWB proxy birdenbire çalışmaz oldu

Mesaj gönderen ahmetax »

Tekrar merhaba!
Dün gönderdiğiniz fonksiyonu üç aşamaya bölerek denemeler yaptım.
Birinci aşamada sizin fonksiyonun ilk bölümü çalışıp proxy bağlantısını kuruyor.
İkinci aşama, navigation aşaması.
İşim bittiğinde de oturum kapatma fonksiyonunu devreye sokuyorum.
Sizin belirttiğiniz proxy değerlerini denediğimde,
"Cache sunucusunu kullanamazsınız" şeklinde bir hata alıyorum. Kullanıcı adı ve parola olmadığı için proxy sunucusunun bu yanıtı verdiğini düşünüyorum.

Ancak benim elimdeki proxy listesinden seçtiğim IP ve port değerleri ile kesinlikle bağlantı kuramıyorum.
Browser boş olduğu halde hemen ReadyState 4 değerini alıyor.
ProxyIleBrowser(...) fonksiyonunu çağırmadığımda, yani proxy olmadığında, navigate fonksiyonu verdiğim siteye sorunsuz bağlanıyor.
Proxy adresi olarak IP kullanmam bir sorun değildir sanırım.

1. fonksiyon

Kod: Tümünü seç

procedure ProxyIleBrowser( WebBrowser:TWebBrowser; strURL, strUser, strPass, strProxy:String; iPort:Integer );
var
  PIInfo : PInternetProxyInfo;
begin
  New (PIInfo) ;
    PIInfo^.dwAccessType    := INTERNET_OPEN_TYPE_PROXY ;
    PIInfo^.lpszProxy       := PChar( Format('%s:%d', [ strProxy, iPort ]) );
    PIInfo^.lpszProxyBypass := PChar('');
    if strUser <> '' then begin
      UrlMkSetSessionOption( INTERNET_OPTION_PROXY_USERNAME, PAnsichar(strUser), Length(strUser)+1, 0 );
      UrlMkSetSessionOption( INTERNET_OPTION_PROXY_PASSWORD, PAnsichar(strPass), Length(strPass)+1, 0 );
    end;
    UrlMkSetSessionOption( INTERNET_OPTION_PROXY, piinfo, SizeOf(Internet_Proxy_Info), 0 );
  Dispose (PIInfo) ;

  // Önce boş işlem ile browser'in farkındalığını sağlayalım. Yoksa idrak edemiyor :)
  WebBrowser.Navigate('about:blank');

 end;
3. fonksiyon

Kod: Tümünü seç

procedure SessionKapa;
  procedure DeleteIECache;
  var
    lpEntryInfo: PInternetCacheEntryInfo;
    hCacheDir  : LongWord;
    dwEntrySize: LongWord;
  begin
    dwEntrySize := 0;
    FindFirstUrlCacheEntry( nil, TInternetCacheEntryInfo(nil^), dwEntrySize );
    GetMem( lpEntryInfo, dwEntrySize );
    if dwEntrySize > 0
      then lpEntryInfo^.dwStructSize := dwEntrySize;
    hCacheDir   := FindFirstUrlCacheEntry( nil, lpEntryInfo^, dwEntrySize );
    if hCacheDir <> 0 then
    begin
      repeat
        DeleteUrlCacheEntry( lpEntryInfo^.lpszSourceUrlName );
        FreeMem( lpEntryInfo, dwEntrySize );
        dwEntrySize := 0;
        FindNextUrlCacheEntry( hCacheDir, TInternetCacheEntryInfo(nil^), dwEntrySize );
        GetMem( lpEntryInfo, dwEntrySize );
        if dwEntrySize > 0
          then lpEntryInfo^.dwStructSize := dwEntrySize;
      until not FindNextUrlCacheEntry( hCacheDir, lpEntryInfo^, dwEntrySize );
    end;
    FreeMem( lpEntryInfo, dwEntrySize );
    FindCloseUrlCache( hCacheDir );
  end;
begin
  InternetSetOption( nil, INTERNET_OPTION_END_BROWSER_SESSION, nil, 0 );
  DeleteIECache();
end;
Proxy bağlantısından sonra Browser navigate fonksiyonunu kullanıyorum:

Kod: Tümünü seç

   sproxy:='proxy.gazi.edu.tr';
   port:=2001;
  ProxyIleBrowser( WebBrowser2, 'http://google.com', '', '', sproxy, port );
  WebBrowser2.Navigate('about:blank'); //bu satırı kullansam da kullanmasam da bir şey değişmiyor
  WebBrowser2.Navigate('http://google.com');
  while WebBrowser2.ReadyState <> READYSTATE_COMPLETE do
  begin
    Application.ProcessMessages;
    Sleep(1);
  end;
While döngüsü, siteye bağlantı olmadığı halde anında kırılıyor.
Şimdilik durum bu. Biraz ara verip kodları tekrar gözden geçireceğim.
Cevapla