TCMB Kur Almada Explorer Sertifika Sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Frontosa
Üye
Mesajlar: 2
Kayıt: 06 Ara 2010 02:49

TCMB Kur Almada Explorer Sertifika Sorunu

Mesaj gönderen Frontosa »

Merhaba Değerli Arkadaşlar;

TCMB sayfasından kurları alırken şöyle bir sorunla karşılaştım. Nasıl aşabileceğim konusunda öneri ve yorumlarınız benim için değerli olacaktır.
Normal şartlarda aşağıdaki kodum zaten sağlıklı çalışıyor. Fakat bu kodun yer aldığı exe dosyasının çalıştığı sunucuda "XMLDocument1.Active := true" yaptığımda sertifika hatası almaktayım. TCMB linkini (https://www.tcmb.gov.tr/kurlar/202310/18102023.xml) explorere kopyalayıp çalıştırdığımda yine sertifika uyarı ekranı gelip, "Continue to this website (not recommended). " seçeneğini seçince ancak kurlar listeleniyor. Chrome kurup buradan açtığımızda zaten direkt açılıyor.

Sorun sunucuda çok eski versiyon olan Explorer 8.0 dan kaynaklanıyor. Daha üstü explorer versiyonu olan bilgisayarlarda sorun yok, kod çalışıyor. Test için 8.0 kurulu bilgisayarlarda çalışmazken, explorer güncellemesi yapılınca koda dokunmadan direkt exe çalıştı. (Maalesef bazı nedenlerden dolayı sunucuda ki explorer update edemiyoruz. )

Sonuç olarak ben delphi kodundan bu sertifika kontrolünü aşabilir miyim ? (Sertifika kontrolünü dikkate alma tarzı) Yada XML dosyasına chrome üzerinden erişip parse edebileceğim bir yöntem var mıdır ?

Teşekkürler;

Kod: Tümünü seç

procedure TForm1.Button4Click(Sender: TObject);
var
  XMLNode, ANode: IXMLNode;
  I:integer;
  L   : IXmlNodeList;
begin
  Memo1.Clear;
  XMLDocument1.Active := false;
  XMLDocument1.FileName:= 'https://www.tcmb.gov.tr/kurlar/202310/18102023.xml';
  XMLDocument1.Active := true;
  XMLNode := XMLDocument1.DocumentElement;
  ANode := XMLNode.ChildNodes.FindNode('Currency');
  L := XMLNode.ChildNodes;
  if L.Count > 0 then
  begin
     for I:= 0 to L.Count -2 do
       if SameText(L[I].NodeName,'Currency') then
          Memo1.Lines.Add(L[I].attributes['Kod']+'-'+L[I].ChildNodes['ForexBuying'].Text+'-'+L[I].ChildNodes['ForexSelling'].Text);
  end;
end;
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: TCMB Kur Almada Explorer Sertifika Sorunu

Mesaj gönderen mkysoft »

XMLDocument nesteniz hangi kutuphaneden geliyor? Hata aldiginiza gore MSXML kutuphanesi olabilir. Delphi iki farkli kutuphane kullanbiliyor. Chrome'nun kendi sertifika yonetim sistemi var, Internet explorer ise windows'unkini kullaniyor. internet explorerdaki sertifika uyarisina bir bakin, eger kok serifika eksik diyorsa bunu ekleyebiliyorsunuz. Sizin uygulama da duzelir muhtemelen.

Diger bir secenek dosyayi kaydedip, dosya sisteminden XMLDocument objesine yuklemek olabilir.
Frontosa
Üye
Mesajlar: 2
Kayıt: 06 Ara 2010 02:49

Re: TCMB Kur Almada Explorer Sertifika Sorunu

Mesaj gönderen Frontosa »

Evet MSXML kütüphanesini kullanıyor. Default olarak sanırım explorer kütüphanesine bakıyor. Sunucu üzerinde bir ekleme ve yükleme yapamıyorum.(müşteri herhangi bir kurulum ve ayar yaptırmıyor maalesef) Bu sebeple XMLDocument nesnesinin Chrome kütüphanesini kullanmasını sağlayabilir miyim ? Bunu başarırsam chrome güncel olduğu için zaten sorun yaşamayacağım.

Diğer seçenek olarak belirttiğiniz yöntem B planı olarak duruyor bende, lynx browser ile kaydedebiliyorum. Öncelikli olarak dosya indirmeden parse etmenin çözümüne bakıyorum. Olmasa B planını uygulayacağım.

Cevap için teşekkür ederim.
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: TCMB Kur Almada Explorer Sertifika Sorunu

Mesaj gönderen ertank »

Merhaba,

Ben genellikle XML dosyası indirme işlemini farklı bir kod ile yapıp, alınan bilgiyi tercih ettiğim bir XML kütüphanesi ile işlemeyi tercih ediyorum.
Kullandığınız Delphi sürümünü bildirmemişsiniz. Son sürümlerden ise System.NetHttpClient ünitesi içindeki TNetHTTPClient bileşenini kullanarak XML bilgisini okuyup ardından istediğiniz şekilde işleyebilirsiniz. Birçok kişi form üzerine bileşen nesnesi ekleyerek kullanıyor. Ben kod ile işlem yapmayı tercih ediyorum.

Aşağıdaki örnek kod sertifika hatasını gözardı etmenizi sağlayacaktır. Delphi 11.3 ile test edilmiştir.

FORM

Kod: Tümünü seç

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 442
  ClientWidth = 628
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -12
  Font.Name = 'Segoe UI'
  Font.Style = []
  OnCreate = FormCreate
  TextHeight = 15
  object Button1: TButton
    Left = 8
    Top = 8
    Width = 113
    Height = 33
    Caption = 'TCMB XML '#304'ndir'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Memo1: TMemo
    Left = 8
    Top = 55
    Width = 612
    Height = 379
    Lines.Strings = (
      'Memo1')
    ScrollBars = ssBoth
    TabOrder = 1
    WordWrap = False
  end
end
Ünite

Kod: Tümünü seç

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  System.Net.HttpClient, // IHTTPResponse
  System.Net.URLClient,  // TURLRequest
  System.Net.HttpClientComponent; // TNetHttpClient

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    function Get(const URL: string; out Response: string; const ReadTimeout: Cardinal = 5000; const ContentType: string = ''; const Accept: string = ''): Boolean;
    procedure NetHTTPClient1ValidateServerCertificate(const Sender: TObject; const ARequest: TURLRequest; const Certificate: TCertificate; var Accepted: Boolean);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var
  LXML: string;
begin
  Memo1.Clear();
  if Self.Get('https://www.tcmb.gov.tr/kurlar/202310/18102023.xml', LXML) then
  begin
    Memo1.Text := LXML;
  end
  else
  begin
    if LXML.IsEmpty then
      Memo1.Text := 'Veriler okunamadı.'
    else
      Memo1.Text := LXML; // bu noktada hata detayı içerir
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear();
end;

procedure TForm1.NetHTTPClient1ValidateServerCertificate(const Sender: TObject; const ARequest: TURLRequest; const Certificate: TCertificate; var Accepted: Boolean);
begin
  Accepted := True;
end;

function TForm1.Get(const URL: string; out Response: string; const ReadTimeout: Cardinal = 5000; const ContentType: string = ''; const Accept: string = ''): Boolean;
var
  LHttp: System.Net.HttpClientComponent.TNetHttpClient;
  LResponse: System.Net.HttpClient.IHTTPResponse;
begin
  LHttp := nil;
  try
    LHttp := TNetHttpClient.Create(nil);
    LHttp.OnValidateServerCertificate := Self.NetHTTPClient1ValidateServerCertificate;
    LHttp.ConnectionTimeout := ReadTimeout;
    LHttp.ResponseTimeout := ReadTimeout;
    if ContentType <> EmptyStr then LHttp.ContentType := ContentType;
    if ContentType <> EmptyStr then LHttp.Accept := Accept;
    try
      LResponse := LHttp.Get(URL);
      if (LResponse.StatusCode < 200) or (LResponse.StatusCode > 299) then
      begin
        // Error
        if LResponse.ContentAsString().IsEmpty then
          Response := LResponse.StatusCode.ToString() + ': ' + LResponse.StatusText
        else
          Response := LResponse.ContentAsString();
        Exit(False);
      end;

      Response := LResponse.ContentAsString();
    except
      on E: Exception do
      begin
        if Assigned(LResponse) then
        begin
          if LResponse.ContentAsString().IsEmpty then
            Response := LResponse.StatusCode.ToString() + ': ' + LResponse.StatusText
          else
            Response := LResponse.ContentAsString();
        end
        else
        begin
          if Response.IsEmpty then Response := E.Message;
        end;
        // Eat exception and return False
        Exit(False);
      end;
    end;
  finally
    LHttp.Free();
  end;

  Result := True;
end;

end.
NOT: Sunucu kullanıyorsunuz. Yukarıdaki kod Windows Server 2019 tüm güncellemeleri yapılmış sistemde sorunsuz çalışacaktır. Önceki sürüm sunucularda Geçtiğimiz sene bu aylarda Microsoft SSL kütüphanesinde ortaya çıkan sorun düzeltilmedi ise sorun yaşamanız olası. Windows sürümü olarak Windows 10 22H2 son güncellemeleri yüklenmiş sistemlerde çalışacaktır. Aynı SSL kütüphane hatası Windows 7 ve eski Windows 10 sistemleri de etkiledi.
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: TCMB Kur Almada Explorer Sertifika Sorunu

Mesaj gönderen mkysoft »

Frontosa yazdı: 20 Eki 2023 05:28 Bu sebeple XMLDocument nesnesinin Chrome kütüphanesini kullanmasını sağlayabilir miyim ?
Bilgisayara birsey kurmaniza izin vermeyip, Chrome kurmalari da ilginc. Chrome komut satirindan cagirip actigi sayfayi kaydetmesini saglayabilirsiniz.

Kod: Tümünü seç

c:\Program Files (x86)\Google\Chrome\Application>chrome.exe --headless --dump-dom --enable-logging --disable-gpu https://gunce.mkysoft.com >c:\temp\mkysoft.html
Cevapla