Web Servislerini kullanarak TC Kimlik No sorgulama (Düzeldi)

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Web Servislerini kullanarak TC Kimlik No sorgulama (Düzeldi)

Mesaj gönderen fduman »

Bu makalemde TC Kimlik No'yu Web Servis'lerini kullanarak nasıl alabileceğimizi göstermeye çalışacağım. Makaleyi ilk olarak Delphiturk sitesine yollamıştım. Buraya da göndermek istedim ki daha çok kişi faydalanabilsin.

TC kimlik no sayfasının Web Servis'lerini kullanmaya başlaması ve bize bu şekilde sorgu yapabilme imkanı vermesi çok hoş. Bizi HTML veya XML parse işleminden kurtarıyor.

Sayfanın HTML kodunun değişmesi ve bizim parse algoritmamızın kırılması ihtimalini de ortadan kaldırıyor.

Bu makale Delphi 7 için yazılmıştır. Bende Enterprise sürümü mevcut. Diğer sürümlerde Web Servisleri için gerekli SOAP bileşenleri olmayabilir!

Öncelikle Delphi'yi açıyoruz (tabii ki ) Menuden File->New->Other'ı seçiyoruz. Çıkan dialog'da "Web Services" sekmesini buluyoruz (sizinkinde yoksa çok üzgünüm, Delphi 7 Enterprise sürümü edinmeye çalışın). Burada "WSDL Importer"ı seçin ve "OK"'e basın.

Delphi bize farklı bir Dialog kutusu açacak. Bu bölüm, Web Servisleri için gerekli olan interface tanımlamalarını otomatik olarak yapmak için konulmuş (harika bir özellik, yoksa manuel kod yazarak yapacaktınız ). Dialog, WSDL tanımlamalarının bulunduğu sayfayı internet'ten alıyor (tabii ki internet bağlantısı açık olmalı) veya isterseniz
bu XML dosyasını internet'ten çekip biryere kaydedebilirsiniz. Böylece bu dosyayı seçerek, offline olarak da interface tanımlamaları yapılabilir.

İlk bölümde WSDL tanımlamalarının bulunduğu sayfanın URL'sini girmeniz veya bu dosyayı zaten indirdiyseniz dosyayı göstermeniz gerekli.

Eğer URL ile çalışacaksanız buraya:
http://tckimlik.nvi.gov.tr/kpsPublic.asmx?WSDL yazın ve "Next"'e basın. Eğer bir proxy arkasındaysanız "Options" düğmesine basarak açılan dialog'da gerekli proxy tanımlamalarını yapabilirsiniz.

Bundan sonra Delphi size oluşturulan kodun bir öngörünümünü sunar. Burayı inceleyin! Çünkü kodlamada bu interface ve property'lerden faydalanacağız.

"Finish"'e basarak bitirin. Delphi, interface ve object tanımlamalarından oluşan bir dosya yaratacak. Bu unit'i programımızda kullanacağız.

Burada önemli olan function "GetKPSPublicWebServiceSoap". Bu function, interface'i create edip gerekli ayarlamaları yapar. Hiç parametre vermeden de kullanabilirsiniz ki ben öyle yaptım.

Programınızda "KPS: KPSPublicWebServiceSoap" ile bir değişken tanımlayın. Sonra "KPS:= GetKPSPublicWebServiceSoap;" ile interface'in oluşturulmasını ve Web Servisinin ayarlanmasını sağlayın. Bunu yapmazsanız programınız çalışmaz. Yani:

Kod: Tümünü seç

var
  KPS: KPSPublicWebServiceSoap;
begin
  KPS:= GetKPSPublicWebServiceSoap;
end;
yapmamız gerekir. Programdan çıkışta KPS bir interface olduğu için Free etmemize gerek yok. Hatta yapmamalıyız! Delphi hafıza boşaltma işini kendi yapacaktır. Ama en iyisi programdan çıkarken

Kod: Tümünü seç

KPS:= nil;
deyin ki garanti olsun.

Delphi'nin oluşturduğu dosyayı iyi inceleyin. Kullanacağınız object ve property'ler hep burada tanımlı. Mesela interface içinde:

Kod: Tümünü seç

function  TCKimlikNoDogrula(const tcKimlikNo: Int64): TCKimlikNoDogrulamaSonucu; stdcall;
diye bir function var. Bu function ile girdiğiniz TC Kimlik no geçerli mi, değil mi öğrenebilirsiniz. Function geriye, TCKimlikNoDogrulamaSonucu isimli bir objenin pointer'ini döndürür. Kullanmak için:

Kod: Tümünü seç

var
  Kimlik: TCKimlikNoDogrulamaSonucu;
begin
  Kimlik:= KPS.TCKimlikNoDogrula(12345678912);
end;
ile sorguyu yolluyoruz. Eğer kimlik numarası yanlışsa/geçersizse "TC kimlik no XXX geçersizdir" hatası verir.

Numara sistemde kayıtlı ve geçerliyse dönen "Kimlik" objesinden TCKimlikNo, Ad, Soyad, DogumYil property'lerini okuyabiliriz.

Bu işlemleri yapmak için internet bağlantısının açık olması gerektiğini söylemeye gerek yok herhalde. Çünkü sorgulamalar internet aracılığıyla yapılıyor.

Örnek programın kaynak kodlarını siteye eklemesi için adminimize göndereceğim. Dilerim ki siteye ekleyecektir. Geri kalan sorgulama türlerinin nasıl yapılacağı bu kodlarda gösterilmiştir. Programın kusuruna bakmayın ve estetik aramayın. Ayrıca hata kontrolü içermiyor. "Item index out of bounds" hatası alırsanız İl-İlçe seçmemişsiniz demektir.

İyi eğlenceler.
En son fduman tarafından 18 Şub 2005 10:31 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7588
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

@coderlord, projesini bana göndermiş, siteye ekledim. Adresi :

http://www.delphiturkiye.com/dsplus/m.p ... Kimlik.zip

Teşekkürler.
En son mussimsek tarafından 07 Mar 2006 05:23 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

http://tckimlik.nvi.gov.tr/kpsPublic.asmx?WSDL

coderlord arkadaşım sen bu web servis hismteinin linkini vermişsin

mesala atıyorum....http://ilsis.meb.gov.tr/ adresinin varmı ?

veya ösym nin sitesinin varmı bunu nasıl öğreniriz...
Siz hayal edin...Biz yapalım TuannaSoft...
yunus
Üye
Mesajlar: 24
Kayıt: 02 Eki 2003 03:54
Konum: Konya
İletişim:

Mesaj gönderen yunus »

Affedersiniz Delphi 6 Enterpise sürümünde çalışıyor bu program?
Programda direkt "Run" deyince aşağıdaki hata mesajlarını aldım.

[Error] kpsPublic.pas(259): Undeclared identifier: 'RegisterDefaultSOAPAction'
[Error] kpsPublic.pas(260): Undeclared identifier: 'RegisterInvokeOptions'
[Error] kpsPublic.pas(260): Undeclared identifier: 'ioDocument'
[Fatal Error] Main.pas( 8 ): Could not compile used unit 'kpsPublic.pas'


Acaba coderlord arkadaşımızın ilk mesajında SOAP bileşenini mi yüklememiz gerekir.Bu bileşen nereden bulabiliriz?
Veya kodlar da değişiklik mi yapmam gerekiyor.
TEŞEKKÜRLER.
İyi Günler.
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

durumu ben delphi 2005 de denedim önerim delphi 2005 terfi etmen...
web servisler ve mobil uygulamalr için bire bir ...
Siz hayal edin...Biz yapalım TuannaSoft...
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

delphi 7 de bişi eklemeden hemen çalıştı

kolay gelsin
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

ama,

tc kimlik numaramla sorgularsam beni buluyor, diğer sorgularda beni bulamıyor. yok diyor anlamadım gitti ben bi varım bi yokum.

kolay gelsin
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

sanırım sorun senin nüfusa kayıtlı olan il ve ilçe seçiminde yanlış yapmandan kaynaklanıyor....
Siz hayal edin...Biz yapalım TuannaSoft...
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

Ustam,

bilmiyorum ama nüfusum Aydın merkeze kayıtlı ve aydın merkezi seçiyorum bulunamadı diyor. cilt sırano ile yapılan aramalarda cilt noya slaç giremiyorum 020/04 kabul etmiyor 02004 diyerek sorgularsam kayıt bilgileri ile tcno birbirini tutmuyor diyor.

kolay gele
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Başkalarından da bu şekilde "bulamıyor", raporları geldi. Bir hata var gerçekten de. Sorgulama meğerse UTF-8 ile kodlanarak yapılmalıymış. UTF-8 kullanan bir versiyonu yakında siteye göndereceğim.

Kendiniz yapmak isterseniz. Web Services component tabında HTTPRIO componentini programa ekleyin. Options bölümündeki UTF-8 Encode seçeneğini işaretleyin.

GetKPSPublicWebServiceSoap fonksiyonuna HTTPRIO parametresi olarak eklediğimiz componenti verin.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhaba...
- Açtığın ankette başlık kirliliği yaratmamak için buraya yazıyorum..

NOT: TCKimlik için asp yaklaşımıyla kendi adıma bir çözüm ürettim ama WDML ile UTF-8 kodu nasıl gönderildiğine dair bir örnek bekliyoruz...

HTTPRIO bileşenine ihtiyaç duymadan bu hallolursa daha iyi olacak... Keza sorun sadece UTF-8 dönüşüm ise aşağıdaki şekilde

Kod: Tümünü seç

UTF8Encode('String İfade')
elde ediliyor...

- Gönderirken bunu da değerlendirmeye almıyor. Fonksiyon WideString ama yine de işe yaramıyor...

Kod: Tümünü seç

  InvRegistry.RegisterInterface(TypeInfo(KPSPublicWebServiceSoap), 'http://kps.nvi.gov.tr/WS/Public', 'utf-8');
satırını

Kod: Tümünü seç

  //InvRegistry.RegisterInterface(TypeInfo(KPSPublicWebServiceSoap), 'http://kps.nvi.gov.tr/WS/Public', 'ANSI');
gibi de denedim olmadı.. hani belki karşı taraf diğer halini kabul eder mi şeklinde bir sorun kalmasın diye...

- En son olarak hashcode'u WEB'den aldırıyorum xHashCode, anlaşılması adına eski halini bildirmek istedim... Yani xHashCode yerine HashCode yazarsanız çalışır...

- Merak eden olursa kodu ekleyim... Parse tarafını karıştırmayalım size yeni bir explorer sayfası açan hali....

Uses ShellApi ekleyin...

Kod: Tümünü seç

Procedure TForm1.Sorgula( Sorgu:Word;ctlCity, ctlDistrict, ctlFirstName, ctlLastName, ctlCilt,
                          ctlAileSiraNo, ctlSiraNo, ctlFatherName, ctlMotherName,
                          ctlBirthDate, ctlSex : String);
Const
  HashCode =     'dDwtMTEyNDkzODg2ODt0PDtsPGk8MT47PjtsPHQ8O2w8aTw1PjtpPDc%2BOz47bDx0PHQ8O3Q8aTw4M'
                +'T47QDxBREFOQTtBRElZQU1BTjtBRllPTktBUkFIxLBTQVI7QcSeUkk7QUtTQVJBWTtBTUFTWUE7QU5L'
                +'QVJBO0FOVEFMWUE7QVJEQUhBTjtBUlRWxLBOO0FZRElOO0JBTElLRVPEsFI7QkFSVElOO0JBVE1BTjt'
                +'CQVlCVVJUO0LEsExFQ8SwSztCxLBOR8OWTDtCxLBUTMSwUztCT0xVO0JVUkRVUjtCVVJTQTvDh0FOQU'
                +'tLQUxFO8OHQU5LSVJJO8OHT1JVTTtERU7EsFpMxLA7RMSwWUFSQkFLSVI7RMOcWkNFO0VExLBSTkU7R'
                +'UxBWknEnjtFUlrEsE5DQU47RVJaVVJVTTtFU0vEsMWeRUjEsFI7R0FaxLBBTlRFUDtHxLBSRVNVTjtH'
                +'w5xNw5zFnkhBTkU7SEFLS0FSxLA7SEFUQVk7ScSeRElSO0lTUEFSVEE7xLBTVEFOQlVMO8SwWk3EsFI'
                +'7S0FIUkFNQU5NQVJBxZ47S0FSQULDnEs7S0FSQU1BTjtLQVJTO0tBU1RBTU9OVTtLQVlTRVLEsDtLSV'
                +'JJS0tBTEU7S0lSS0xBUkVMxLA7S0lSxZ5FSMSwUjtLxLBMxLBTO0tPQ0FFTMSwO0tPTllBO0vDnFRBS'
                +'FlBO01BTEFUWUE7TUFOxLBTQTtNQVJExLBOO01FUlPEsE47TVXEnkxBO01VxZ47TkVWxZ5FSMSwUjtO'
                +'xLDEnkRFO09SRFU7T1NNQU7EsFlFO1LEsFpFO1NBS0FSWUE7U0FNU1VOO1PEsMSwUlQ7U8SwTk9QO1P'
                +'EsFZBUzvFnkFOTEkgVVJGQTvFnklSTkFLO1RFS8SwUkRBxJ47VE9LQVQ7VFJBQlpPTjtUVU5DRUzEsD'
                +'tVxZ5BSztWQU47WUFMT1ZBO1lPWkdBVDtaT05HVUxEQUs7PjtAPDE7MjszOzQ7Njg7NTs2Ozc7NzU7O'
                +'Ds5OzEwOzc0OzcyOzY5OzExOzEyOzEzOzE0OzE1OzE2OzE3OzE4OzE5OzIwOzIxOzgxOzIyOzIzOzI0'
                +'OzI1OzI2OzI3OzI4OzI5OzMwOzMxOzc2OzMyOzM0OzM1OzQ2Ozc4OzcwOzM2OzM3OzM4OzcxOzM5OzQ'
                +'wOzc5OzQxOzQyOzQzOzQ0OzQ1OzQ3OzMzOzQ4OzQ5OzUwOzUxOzUyOzgwOzUzOzU0OzU1OzU2OzU3Oz'
                +'U4OzYzOzczOzU5OzYwOzYxOzYyOzY0OzY1Ozc3OzY2OzY3Oz4%2BO2w8aTwwPjs%2BPjs7Pjt0PHQ8O'
                +'3Q8aTwxMz47QDxTRVlIQU47Q0VZSEFOO0ZFS0U7S0FSQcSwU0FMSTtLQVJBVEHFnjtLT1pBTjtQT1pB'
                +'TlRJO1NBxLBNQkVZTMSwO1RVRkFOQkVZTMSwO1lVTVVSVEFMSUs7WcOcUkXEnsSwUjtBTEFEQcSeO8S'
                +'wTUFNT8SeTFU7PjtAPDExMDQ7MTIxOTsxMzI5OzE0Mzc7MTQ0MzsxNDg2OzE1ODA7MTU4ODsxNjg3Oz'
                +'E3MzQ7MTc0ODsxNzU3OzE4MDY7Pj47Pjs7Pjs%2BPjs%2BPjs%2BkI%2FKatDlfw5pizkE3dJdBEsyW'
                +'kw%3D';
Var
  Url,
  Dosya : String;
  ParamStr : String;
begin
  Url      := 'http://tckimlik.nvi.gov.tr/Web/QueryIdentityNumber.aspx';
  Dosya    := ExtractFilePath(Application.ExeName)+'Gelen.TXT';
  //DosyaIndir(Url+'??__EVENTTARGET=ctlCity&__EVENTARGUMENT=', Dosya); // Hashcode çekicez...
  // xHashCode := HashCodeOku(Dosya); // Code Web'den okunur
  // ShowMessage(xHAshCode);
  If FileExists(Dosya) then DeleteFile(Dosya);
  ParamStr := '';
  ParamStr := ParamStr
            + '__EVENTTARGET='
      + '&' + '__EVENTARGUMENT='
      + '&' + '__VIEWSTATE='  + HttpEncode(xHashCode)
      + '&' + 'ctlCity='      + ctlCity
      + '&' + 'ctlDistrict='  + HttpEncode('"'+ctlDistrict+'"')
      + '&' + 'ctlFirstName=' + UTF8Encode(ctlFirstName)
      + '&' + 'ctlLastName='  + UTF8Encode(ctlLastName)
      + '&' + 'ctlCilt='      + UTF8Encode(ctlCilt)
      + '&' + 'ctlAileSiraNo='+ UTF8Encode(ctlAileSiraNo)
      + '&' + 'ctlSiraNo='    + UTF8Encode(ctlSiraNo)
      + '&' + 'ctlFatherName='+ UTF8Encode(ctlFatherName)
      + '&' + 'ctlMotherName='+ UTF8Encode(ctlMotherName)
      + '&' + 'ctlBirthDate=' + UTF8Encode(ctlBirthDate)
      + '&' + 'ctlSex='       + UTF8Encode(ctlSex);
  Case Sorgu of
  1: ParamStr := ParamStr + '&' + 'ctlQueryFromData=T.C.+Kimlik+No+Sorgula';
  2: ParamStr := ParamStr + '&' + 'ctlQueryFromPersonalInfo=T.C.+Kimlik+No+Sorgula';
  end; // Case
  Url := Url+'?'+ParamStr;
  ShellExecute(0, 'open', 'IExplore.exe', PChar( Url ), '', SW_Normal);
end;
gibi bir yapı şahsen hiç hoşuma gitmedi.... :)

- Çalışmalarında başarılar...
Resim
Resim ....Resim
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Umarım yakın zamanda güncellenmiş sürümünü siteye göndereceğim. Çok yoğunum şu aralar.

@mrmcop Kodunu inceleme fırsatım olur olmaz seninle bu konuda tartışırız.

İyi günler dilerim.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Yoğunluğun bitince tabii ki...
Resim
Resim ....Resim
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Arkadaşlar problemi düzeltip, yeni sürümünü yöneticimize gönderdim. Yakında günceller sanırım. Daha önce de anlattığım gibi bir THTTPRIO bileşeni ekledim forma. Bunun UseUTF8EncodeInHeader property'sini True yaptım. FormCreate'deki kod da değişti.

KPS:= GetKPSPublicWebServiceSoap(False, '', HTTPRIO1);

HTTPRIO bileşenini parametre olarak gönderdim, bunu kullansın diye.

Denedim. Bir sorunu yoktu. (Umarım çıkmaz) :)

İyi eğlenceler dilerim.

Not: Bu sürüm, hatayı düzeltmemi sürekli hatırlatan mrmcop'a atfedilmiştir ;)
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7588
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

güncellenmiş dosyayı siteye koydum :

http://www.delphiturkiye.com/dsplus/m.p ... Kimlik.zip

Kolay gelsin.
En son mussimsek tarafından 07 Mar 2006 05:22 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Cevapla