• 04-06-2009, 00:10:27
    #1
    Üyeliği durduruldu
    Forumda bir çok konu açılmış yazılmış çizilmiş bir çok soru sorulmuş fakat tam bir çözüm yok.

    Bu makale umarım faydalı olur.

    .ASP ile bot yapmak farklı şekillerde olabilir, önemli olan veri çekilecek url nin text biçimidir.

    1- ) ASP ile xml kaynağından veri çekmek

    Her xml servisi sayfasında başlangıç ve bitiş değerleri vardır örn:
    <videolar>
    	<video>
    		<resimyolu>orn1.jpg</resimyolu>
    		<embedkodu>orn1.flv</embedkodu>
    		<filmadi>orne1filmi</filmadi>
    	</video>
    	<video>
    		<resimyolu>orn2.jpg</resimyolu>
    		<embedkodu>orn2.flv</embedkodu>
    		<filmadi>ornek2filmi</filmadi>
    	</video>
    ...............
    </videolar>
    dikkat edilirse videolar <video></video> arasında sıralanıp gider buna uygun bir bot şöyle olur.

    <%
    Set objXML = Server.CreateObject("Microsoft.XMLDOM")
    	objXML.Async = False
    	objXML.SetProperty "ServerHTTPRequest", True
    	objXML.ResolveExternals = True
    	objXML.ValidateOnParse = True
    	objXML.Load("http://www.orneksiteadresi.com/xmlservice.xml") ' Xml in alınacağı adres
    	
    Set objRoot = objXML.documentElement
    Set objItems = objRoot.getElementsByTagName("video")
    
    	Dim objItem
    	For Each objItem in objItems
    
    		strResimYolu = objItem.selectSingleNode("resimyolu").Text
    		strEmbedKodu = objItem.selectSingleNode("embedkodu").Text
    		strFilmAdi = objItem.selectSingleNode("filmadi").Text
    	
    	'For next döngüsü içinde sql sorgularını çalıştırabilirsiniz db nize göre uyarlayın
    	'yada sadece gösterim yapın tercih sizin
    	'rs.Addnew
    	'	rs("resimyolumuz") = strResimYolu
    	'	rs("embedkodumuz") = strEmbedKodu
    	'	rs("filmadimiz") = strFilmAdi
    	'rs.Update
    	
    	Next
    %>
    Bu işlem için ( xml servisinden veri çekmek için ) Microsoft.XMLDOM bileşenini kullandık.

    Yukarda anlatılan en basit yoldan ve zahmetsizce veri çekme yolu idi ve sadece xml servisi için kullanılabilir %99.

    2- ) ASP ile HTML kaynağından veri çekmek
    En zoru ise html yada asp yada php sayfadan (hiç farketmez sonuçta tarayıcıya salt html kodları gönderilmektedir ki bazı arkadaşlar bu konuda hataya düşüyorlar aceba php sayfadan veri çekmek ile asp sayfadan veri çekmek farklımı diye, hayır farketmez) veri çekmektir. Sebebi çok karmaşık bir kod dizilimi görebileceğimizdendir neyi nerden nasıl alırız iyi değerlendirmek lazım. Sayfayı analiz ettik kaynak koduna bakarak ve işimize yarar kısmı olan şu kodlar dı mesela ;

    <title>Acaba Şiiri , oku , canlı şiir dinle</title>
    <font size='3'><b>Acaba</b></font><br><br>Dönelim<br>Döndürsün bizi<br>Kalbin akıp giden bulutlara benzeyen sesi<br>Yağmursuz bir yağmura açılmış kapılardan<br>Ve akılda kalan bir yokuştan<br>Ve yalnız çocuklara özgü o sonsuz sinema koltuklarından<br>Ve çocukluktan<br>Dönelim<br>Dönelim mi biz<br>Gençlikten, oralardan<br>Mutluluğu bir kabuk gibi saran mutsuzluklardan<br>Dönelim mi acıya<br>Acıya, büyük acıya<br>Ve soralım mı acaba<br>Ey büyük yalnızlık insansan eğer<br>Bir kaya<br>Dalgalar yalarken onu<br>O bakarken kaskatı kalabalıklara<br>Ah, kalbin bulut bulut akan sesi.<br><br>Bütünüyle bir semte benziyor Ruhi Bey<br>Binlerce, on binlerce kedinin hep birden kımıldadığı<br>Kedilerden örülmüş bir semte<br>Ve soğuk bir tuvalde yerini bulamamış renkler gibi<br>Soğuk ve ayakta tutan çelişkileri<br>Bir görünümden bir başka görünüme kolayca sıçranan<br>Her şeyin, ama herşeyin çok dıştan farkedildiği<br>Eh belki de bir satır fazlalığı ya da bir satır eksikliği<br>Belki de genç bir şairden ödünç alınan.<br><br>Yürüyor mu, yürümeyi mi düşünüyor Ruhi Bey<br>Düşünmesi daha mı sonra koyuluyor yola<br>Nereye gidecek ama, nereye varacak sanki<br>Yoksa bir oyun tadı mı buluyor bunda<br>Oyundan atılmaktan korkmayan bir oyuncu gibi<br>Boşvermiş de sanki oyunun kurallarına<br>Üstelik son bölümde, perdenin kapanmasına<br>Azıcık vakit kalmış<br>Ya da vakit var daha. Ama ne çıkar<br>Gövdenin yazgıya başkaldırması mı<br>Ruhi Beyin<br>Başkaldırması mı yoksa<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vaktinden önce anlamanın şaşkınlığı mı<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vaktinde anlamanın sevinci mi<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ya da biraz geç kalmanın<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;O gereksiz tedirginliği mi<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hangisi<br><br>Ama belli ki sonundayız her şeyin<br>En sonunda.<br><br><b>Eklenme Tarihi:</b> 26.06.1999<br><br><b><a href='?sayfa=sair&sair_id=71&sair=Edip Cansever'>Edip Cansever</a></b><br><br>  <tr style="font-family:tahoma,verdana">     
      <td colspan="2">Puan: <b>6.44/27</b> Oy<br><font color="#333399">
    
      Şiire puan vermek için:<br>
    Aşağıdaki kodu sağındaki kutuya girip, puanınızı seçin ve Gönder butonunu tıklayın.<br>
    Burada şuna dikkat edeceğiz benzersiz noktalar bulmak
    <font size='3'><b>
    bu şiirin başlık kısmı ve sayfada böyle bir kod daha yok bu iyiye işaret bitiş yeride önemli tabi
    </b></font><br><br>
    buda benzersiz. Başlığı yakaladık sıra geldi şiire
    </b></font><br><br>
    bu satırı şiirin başlangıç noktası olarak aldık
    <br><br><b>Eklenme Tarihi:</b>
    bunuda bitiş noktası olarak aldık ve şiir de tamam bu noktaları yakaladıysak planı kafamızda kurduk ve kodlamaya geçelim.

    Unutmadan söylemek gerek , bazı sayfaların kodlama dilinden dolayı (.asp , php v.b değil) utf-8 yada iso-8859-9 olması
    veri çekmede kullanacağımız bileşeni değiştirebilir aspTear yada MSXML2.ServerXMLHTTP arasından seçim yapmamız gerekebilir
    karakter hatası verip vermediğini deneyerek kendimiz bulacağız tabi.

    aspTear bileşeni ile veri çekme

    <%
      	strVeriCekilecekAdres = "http://orneksiteadresi.com/ornek.asp"
    	Set stTear = Server.CreateObject("Softwing.AspTear")
    	stTear.FollowRedirects = True 'Bazı sayfalar başka sayfaya otomatik yönlendirilmiş olabilir onun için lazım
    	
    	blnAlinanVeri = stTear.Retrieve(strVeriCekilecekAdres,2, "","","") 'Veri Aldık değişkene atadık
    	
    	Set stTear = Nothing
    %>
    ServerXMLHTTP ile veri çekme

    <%
    strVeriCekilecekAdres = "http://orneksiteadresi.com/ornek.asp"
    
    Set oXMLHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
    	oXMLHttp.open "GET", strVeriCekilecekAdres, False
    	oXMLHttp.Send()
    	blnAlinanVeri = oXMLHttp.responseText 'Veri Aldık değişkene atadık
    Set oXMLHttp = Nothing
    %>

    Veri Çekmeye anladık şimdi gelen veriyi işleyelim bunun için RegExp kullanacağız.

    Örnek çalışma aspTear ve RegExp ile yapılmıştır.

    Yukardaki sayfa örneği için kodlayalım , VeriBul ve veriCek Functionlar ı sapittir biz degişkenler üzerinde değişiklikler yapmak zorunda kalırız:


    <%
    Function VeriBul(BaslangicDegeri,BitisDegeri,Verimizden)
    
    Set RegEx = New RegExp
    
    With RegEx
    	.IgnoreCase = True
    	.Global = True
    	.Pattern = "(" & BaslangicDegeri & ")(.+?)(" & BitisDegeri & ")"
    End With
    
    Set Sonuc = RegEx.Execute(Verimizden)
    
    For Each i In Sonuc
    	VeriBul =  i.SubMatches(1)
    Next
    
    If IsEmpty(VeriBul) Then VeriBul = "Sonuc Yok"
    Set RegEx = Nothing
    Set Sonuc = Nothing
    
    End Function
    
    
    Function veriCek(Adresten)
    
    	On Error Resume Next
    	Set strTear = Server.CreateObject("Softwing.AspTear")
    		strTear.FollowRedirects = True 
    		veriCek = strTear.Retrieve(Adresten,2, "","","")
    	Set strTear = Nothing
    
    End Function
    
    strDeger1 = "<font size\='3'><b>"
    strDeger2 = "</b></font><br><br>"
    strDeger3 = "</b></font><br><br>"
    strDeger4 = "<br><br><b>Eklenme Tarihi:</b>"
    
    strDeger5 = "<title>"
    strDeger6 = "</title>"
    
    HTMLalAdresten = veriCek("http://orneksiteadresi.com/ornek.html")
    
    strBaslikBul = VeriBul(strDeger1,strDeger2,HTMLalAdresten)
    strSiiriBul = VeriBul(strDeger3,strDeger4,HTMLalAdresten)
    
    strTitleBul = VeriBul(strDeger5,strDeger6,HTMLalAdresten)
    
    
    Response.Write(strBaslikBul)
    Response.Write("<hr>")
    Response.Write(strSiiriBul)
    Response.Write("<hr>")
    Response.Write(strTitleBul)
    %>
    ve sonuç : şiir başlığını , şiiri , sayfa title ını aldık ,
    strDeger lerde dikkat etmemiz gereken hususta değişkenin içine giren değerlerde
    ( = ve " ) işaretleri RegExp de özel karakterler olduğu için başına \ işareti koymak gerekir.

    Örn :
    [PHP]
    <%
    strdeger = "img src\=resim1.jpg"
    strdeger = "halit \= dediki \""naber nasılsın\"""
    strdeger = ""
    %>
    [PHP]

    Anlamadığınız yerler hakkında uzunca düşünün örnek functionları kullanın sizde kolayca Bot yazabileceksiniz.
    Herkese iyi çalışmalar
  • 04-06-2009, 10:02:58
    #2
    botlara olan ilgi bu ara artıyor verdigin bilgiler için teşekkürler
  • 04-06-2009, 10:42:56
    #3
    Gerçekten güzel anlatım ben regex ile değilde mid vs. ile temizleyerek yapıyordum değişik bir yöntem öğrenmiş oldum
  • 04-06-2009, 11:25:36
    #4
    kardeş saol, +rep
  • 07-06-2009, 22:46:22
    #5
    Üyeliği durduruldu
    tam böyle çalışan siteden çeken bi bot örneği olsa çok daha gzl olurdu açıklama yerine koda bakıp çözerdik mesela siz bir siteden çekip çalışır halde iken buraya koyamazmısınız tşk ederim.
  • 10-06-2009, 17:19:19
    #6
    teşekkürler
  • 10-06-2009, 17:22:08
    #7
    teşekkürler