Autoit HTTP Post/Get ve Dosya Indirme Fonksiyonları

Öncelikle söylemek istediğim birşey var, ara ara çeşitli konu ve isteklerle mailler alıyorum. Bu maillere şu sıralar malesef cevap veremediğim için gönderen kişilerden özür dilerim :( Yoğunluk hiç bitmiyor. Bu yüzden vakit ayırıp okuyamıyorum bile. Neden bu kadar geç post attığım konusuna gelince, içeriği çalıp kendi forum veya blogunda yayınlayan, özellikle 2-3 kelime değiştirip google ı dahi kandırmaya çalışan sevgili arkadaşlar bilir diyelim :) 12milyon ranklı tertemiz bir blogdan içerik çalan çöp sitenin 80k ranklarda olmasıda ayrı tabiki. Bunları yazıyorum diye çalıp çırpmayı kesiceklermi? Tabi kesmiycekler, neyse önemli değil uzatmayalım konuya geçelim.

Autoit HTTP Post u anlatalım.
HTTP Post veya Get nedir bilmeyen veya bilende bilmeyen arkadaşlar için: Bir web sayfasına gönderdiğiniz değerler olarak açıklayabiliriz. Bunu bir form doldurup göndermek, login olmak gibi düşünün. Aslında bunun bugüne kadar: Form içinde Embed IE oluşturup sayfaya giderek ve inputları doldurup sayfayı göndererek yapıyordum. Bu işlem anlatımındada olduğu gibi gayet uzun süren bir işlem :P Sayfaya gitmek, yüklenmesini beklemek, sonra ,inputları id den alıp doldurmak ve gönder tuşuna basmak, sonra sayfanın yine yüklenmesini beklemek :P Çok uzun, çok. :P

HTTP Post komutları burada bize tek bir seferde duruma göre çok kısa süren bir işlemle bu işi yapmamıza yardımcı oluyor. Buna Paket gönderme deniyor. Paket TCP ile gidiyor.

Bize lazım olan lib: WinHTTP.au3

Basit bir Login örneği ile devam edelim:
Giriş yapmak istediğimiz sayfa www.test.com/login.php olsun.
Bu sayfada bir form içinde:
input type='text' name='username'
input type='password' name='pass'
olmak üzere 2 tane input var bunların birine e-postamızı birine şifremizi yazıyoruz görüldüğü üzere :P

Bunu WinHTTP komutlarıyla yapmak için oluşturduğum fonksiyon:

Func _SendPacket($sURL, $sSAYFA, $sDATA, $sREF, $sMETHOD = 'POST', $sSESSION = '')
Local $hOpen = _WinHttpOpen()
Local $hConnect = _WinHttpConnect($hOpen, $sURL)
Local $hRequest = _WinHttpOpenRequest($hConnect, _
$sMETHOD, _ ; metod, post veya get, bu formun türüne göre değişiyor
$sSAYFA, _ ; hedef sayfa /login.php?yap=login gibi, formun action sayfasına denk geliyor
Default, _ ; version
$sREF, _ ; referans url, formu gönderenin kimliğini belirliyor, aynı sayfa olması önemli.
"text/*") ; formun kabul ettiği tür, text,html,xml vesair.
_WinHttpSendRequest($hRequest, "Content-Type: application/x-www-form-urlencoded", $sData)
$resp = _WinHttpReceiveResponse($hRequest)
; Bakalım dönüş datası varmı. :)
Local $sChunk, $dat
If _WinHttpQueryDataAvailable($hRequest) Then
; Read
While 1
$sChunk = _WinHttpReadData($hRequest)
If @error Then ExitLoop
$dat &= $sChunk
WEnd
Else
Return FALSE
EndIf

_WinHttpCloseHandle($hRequest)
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)

if($dat="") Then
Return FALSE
Else
Return $dat
EndIf
EndFunc

Bu fonksiyonu winhttp yi include ederek direk kullanabilirsiniz. $dat sayfadan dönen cevaptır.
Nasıl kullanacağımıza gelirsek, burada önemli olan nokta: $sDATA dır. Formdaki inputların değerlerini burada kullanacağız.
name='' deki değerlerimiz kullanıcı adı için : username şifre için: pass dı.
o halde: $data = "username=test&pass=12341234" olacak.

$login = _SendPacket("www.test.com", "/login.php", $data, "www.test.com/login.php", 'POST', '')
if $login <> FALSE then
msgbox(0, 'Sayfanın verdiği cevap', $login)
endif

Burda unutmamamız gereken cookie kontrol etmek ve eğer değişik karakterler kullanıyorsak göndermeden önce encode tarzı şeyler yapmak :P O kadar detaya inmedim, gerekirse yorumlarda haberleşiriz. Son olarak $sSESSION a gelirsek, bunu sayfa ile birlikte kullanım cache işlemlerine karşı önlem alabiliriz. $sSESSION = rasgele bir sayı değeri. $sSAYFA = "/login.php?session="&$sSESSION
Böylece cache ile aynı sayfayı 2 kere yükletmeyen site, herseferinde bizim için sayfayı yüklemek zorunda kalır :P

Dosya İndirme işlemine Gelirsek:
Autoit ile dosya indirmenin birçok yolu var.
TCP, InetGet, _InetGetSource, InetRead.

İndirdiğiniz dosyanın türünü biliyorsanız: _InetGetSource gayet esnekdir.
Verdiğiniz hedef dosyanın kaynak kodunu bir değişkene alır ve sizde bunu bildiğiniz uzantıyla bir dosyaya yazdırırsınız.

TCP ile TCPSend ve TCPRecv komutları ile tıpkı lan üzerinden dosya gönderip alır gibi dosya downloadı yapabilirsiniz. Hızlı ve güvenli bir yoldur. Sistem kaynaklarını doldurup pc yi yavaşlatmadan dosyayı indirir. Flashget, FDM, idman çoğu bu şekilde download yapıyor.

InetGet, direkt olarak dosyayı verdiğiniz konuma indirir :P

InetRead, _inetGetSource ile aynı sayılır, bu fonksiyonda verilen hedefdeki kaynağı okuyup bir değişkene atamakta kullanılabilir.

Değişkene atadığımız fonksiyonlar büyük downloadlar ile hiç sağlıklı değildir. Açıklamak gerekirse, yaptığımız ufak bir download yazılımı, sistemin raminden 3mb kullanan bir download yazılımı, 1gb bir dosyayı inetRead ile veya inetGetSource ile almaya çalışırsak, download bitiminde 1GB ram kullanır pozisyona gelir. Bunun yerine TCP ile okuduğumuz kadarını değişkende tutmadan direk dosyaya yazdırmak en iyi yoldur.

Autoit ile dosya indirme nin detayını önümüzdeki günlerde yeni bir makale ile yazmayı düşünüyorum, bu makale çok uzadı. Görüşmek üzere, aklınıza takılan bir soru varsa yorumlayabilirsiniz, birlikte cevaplamaya çalışırız.