{"id":42045,"date":"2026-05-24T21:14:35","date_gmt":"2026-05-24T18:14:35","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/"},"modified":"2026-05-24T21:14:58","modified_gmt":"2026-05-24T18:14:58","slug":"blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/","title":{"rendered":"Blockchain K\u00fct\u00fcphanesi Kullanmadan Python ile Zincir \u00dczeri Uyar\u0131 Botu Nas\u0131l Geli\u015ftirilir?"},"content":{"rendered":"<h2>Blockchain K\u00fct\u00fcphanesi Kullanmadan Python ile Zincir \u00dczeri Uyar\u0131 Botu Nas\u0131l Geli\u015ftirilir?<\/h2>\n<p>Kripto para piyasalar\u0131nda veya merkeziyetsiz uygulamalar (dApp) d\u00fcnyas\u0131nda ya\u015fanan geli\u015fmeleri anl\u0131k olarak takip etmek, \u00e7o\u011fu zaman manuel y\u00f6ntemlerle m\u00fcmk\u00fcn de\u011fildir. F\u0131rsatlar\u0131 yakalamak, g\u00fcvenlik ihlallerini \u00f6nceden tespit etmek veya \u00f6nemli c\u00fczdan hareketlerini izlemek i\u00e7in otomatik sistemlere ihtiya\u00e7 duyar\u0131z. Peki, Python kullanarak ve hi\u00e7bir \u00f6zel blockchain k\u00fct\u00fcphanesine ba\u011f\u0131ml\u0131 kalmadan, do\u011frudan zincir \u00fczerindeki verileri \u00e7ekip bize uyar\u0131 g\u00f6nderecek bir botu nas\u0131l geli\u015ftirebiliriz? Bu makalede, bu sorunun cevab\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedecek, temelden ba\u015flayarak ileri seviye uygulamalara kadar uzanan bir yolculu\u011fa \u00e7\u0131kaca\u011f\u0131z.<\/p>\n<h2>Zincir \u00dczeri Olaylar\u0131 Takip Etmek Neden \u00d6nemli?<\/h2>\n<p>Blockchain teknolojisi, \u015feffafl\u0131k ve de\u011fi\u015fmezlik gibi temel \u00f6zellikleriyle finans, tedarik zinciri ve bir\u00e7ok farkl\u0131 sekt\u00f6rde devrim niteli\u011finde yenilikler sunuyor. Ancak bu \u015feffafl\u0131k, ayn\u0131 zamanda devasa bir veri ak\u0131\u015f\u0131n\u0131 da beraberinde getiriyor. Her saniye milyarlarca i\u015flem ger\u00e7ekle\u015fiyor, yeni bloklar olu\u015fuyor ve ak\u0131ll\u0131 s\u00f6zle\u015fmeler etkile\u015fime giriyor. Bu bilgi okyanusunda, ki\u015fisel veya kurumsal stratejilerimiz i\u00e7in kritik olabilecek belirli olaylar\u0131 manuel olarak izlemek neredeyse imkans\u0131zd\u0131r. \u0130\u015fte bu noktada, otomatik uyar\u0131 botlar\u0131 devreye girer ve bize paha bi\u00e7ilmez bir avantaj sa\u011flar.<\/p>\n<p>\u00d6zellikle h\u0131zl\u0131 hareket eden kripto piyasalar\u0131nda, anl\u0131k bilgiye eri\u015fim, yat\u0131r\u0131m kararlar\u0131 i\u00e7in hayati \u00f6nem ta\u015f\u0131r. \u00d6rne\u011fin, b\u00fcy\u00fck bir c\u00fczdan\u0131n (balina) \u00f6nemli miktarda token transferi yapmas\u0131, piyasada dalgalanmalara yol a\u00e7abilir. Bir merkeziyetsiz finans (DeFi) protokol\u00fcndeki likidite havuzunda beklenmedik bir de\u011fi\u015fiklik, arbitraj f\u0131rsatlar\u0131 yaratabilir. Veya bir ak\u0131ll\u0131 s\u00f6zle\u015fmede kritik bir g\u00fcvenlik a\u00e7\u0131\u011f\u0131n\u0131n tetiklenmesi, fon kayb\u0131na neden olabilir. Bu t\u00fcr senaryolarda, olaylar hen\u00fcz \u00e7ok tazeyken bilgi sahibi olmak, proaktif ad\u0131mlar atmam\u0131z\u0131 sa\u011flar. Geleneksel y\u00f6ntemlerle bu verileri s\u00fcrekli taramak hem zaman al\u0131c\u0131 hem de yorucudur. Bir uyar\u0131 botu, bu g\u00f6revi \u00fcstlenerek bize zaman kazand\u0131r\u0131r ve \u00f6nemli geli\u015fmeleri ka\u00e7\u0131rma riskimizi minimize eder. Bu otomasyon sayesinde, piyasa dinamiklerine daha h\u0131zl\u0131 adapte olabilir, potansiyel riskleri erken fark edebilir ve f\u0131rsatlar\u0131 de\u011ferlendirebiliriz.<\/p>\n<p>Peki, neden \u00f6zellikle Python ve neden &#8220;blockchain k\u00fct\u00fcphanesi kullanmadan&#8221;? Python, veri i\u015fleme, a\u011f istekleri ve otomasyon konular\u0131nda olduk\u00e7a g\u00fc\u00e7l\u00fc ve esnek bir dildir. Geni\u015f k\u00fct\u00fcphane ekosistemi ve okunabilir s\u00f6zdizimi sayesinde, karma\u015f\u0131k g\u00f6revleri bile nispeten kolayca ger\u00e7ekle\u015ftirebiliriz. Blockchain k\u00fct\u00fcphaneleri (\u00f6rne\u011fin <code>web3.py<\/code>), genellikle alt seviye detaylar\u0131 soyutlayarak geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r. Ancak, bu k\u00fct\u00fcphaneler bazen gereksiz ba\u011f\u0131ml\u0131l\u0131klar getirebilir, performans\u0131 d\u00fc\u015f\u00fcrebilir veya belirli zincirler i\u00e7in k\u0131s\u0131tl\u0131 destek sunabilir. K\u00fct\u00fcphane kullanmadan do\u011frudan RPC (Remote Procedure Call) aray\u00fczleriyle etkile\u015fim kurmak, bize hem daha derin bir anlay\u0131\u015f kazand\u0131r\u0131r hem de botumuz \u00fczerinde tam kontrol sa\u011flar. Bu yakla\u015f\u0131m, botumuzu daha hafif, daha esnek ve farkl\u0131 EVM (Ethereum Sanal Makinesi) uyumlu zincirlere kolayca adapte edilebilir hale getirir. Ayr\u0131ca, bu y\u00f6ntemle, blockchain&#8217;in temel i\u015fleyi\u015f mekanizmalar\u0131n\u0131 daha iyi kavrar ve veri ak\u0131\u015f\u0131n\u0131 en temel seviyeden y\u00f6netme becerisi kazan\u0131r\u0131z. Bu makale boyunca, bu avantajlar\u0131 kullanarak nas\u0131l g\u00fc\u00e7l\u00fc bir uyar\u0131 botu in\u015fa edece\u011fimizi ad\u0131m ad\u0131m g\u00f6sterece\u011fiz.<\/p>\n<h2>Blockchain Verilerine Do\u011frudan Eri\u015fim: Neden ve Nas\u0131l?<\/h2>\n<p>Blockchain a\u011flar\u0131, merkeziyetsiz yap\u0131lar\u0131 gere\u011fi, verileri do\u011frudan bir veritaban\u0131ndan \u00e7ekme imkan\u0131 sunmazlar. Bunun yerine, a\u011fdaki her kat\u0131l\u0131mc\u0131 (node), a\u011f\u0131n t\u00fcm ge\u00e7mi\u015fini i\u00e7eren bir kopyay\u0131 saklar ve bu verilere eri\u015fim i\u00e7in belirli aray\u00fczler sunar. Blockchain k\u00fct\u00fcphaneleri kullanmadan bir uyar\u0131 botu geli\u015ftirmek istedi\u011fimizde, bu aray\u00fczleri do\u011frudan kullanmam\u0131z gerekir. Bu yakla\u015f\u0131m, bize hem esneklik hem de a\u011f\u0131n temel i\u015fleyi\u015f mekanizmalar\u0131n\u0131 daha derinlemesine anlama f\u0131rsat\u0131 sunar.<\/p>\n<h3>Blockchain Node&#8217;lar\u0131 ve RPC Aray\u00fczleri Nedir?<\/h3>\n<p>Bir blockchain a\u011f\u0131, birbirine ba\u011fl\u0131 bilgisayarlar\u0131n (node&#8217;lar) bir koleksiyonudur. Her node, a\u011fdaki t\u00fcm i\u015flemleri ve bloklar\u0131 do\u011frular, saklar ve di\u011fer node&#8217;larla payla\u015f\u0131r. Bu node&#8217;lar, a\u011f\u0131n omurgas\u0131n\u0131 olu\u015fturur ve blockchain&#8217;in g\u00fcvenli\u011fini ve b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flar. Verilere eri\u015fmek veya a\u011f ile etkile\u015fim kurmak i\u00e7in, bir node&#8217;a ba\u011flanmam\u0131z gerekir. \u0130\u015fte bu noktada RPC (Remote Procedure Call) aray\u00fczleri devreye girer. RPC, bir program\u0131n ba\u015fka bir adresteki (genellikle bir a\u011fdaki ba\u015fka bir bilgisayardaki) bir programda bir prosed\u00fcr\u00fc (fonksiyonu) \u00e7al\u0131\u015ft\u0131rmas\u0131na olanak tan\u0131yan bir protokold\u00fcr. Blockchain ba\u011flam\u0131nda, bu genellikle HTTP veya WebSockets \u00fczerinden JSON-RPC standard\u0131 kullan\u0131larak yap\u0131l\u0131r.<\/p>\n<p>JSON-RPC, hafif ve durumsuz bir RPC protokol\u00fcd\u00fcr. \u0130stemciler (bizim botumuz gibi), belirli bir metodun ad\u0131n\u0131 ve ilgili parametreleri i\u00e7eren JSON format\u0131nda bir istek g\u00f6nderirler. Node, bu iste\u011fi i\u015fler ve yine JSON format\u0131nda bir yan\u0131t d\u00f6nd\u00fcr\u00fcr. \u00d6rne\u011fin, Ethereum a\u011f\u0131nda, <code>eth_blockNumber<\/code> metodu, a\u011fdaki en son blo\u011fun numaras\u0131n\u0131 d\u00f6nd\u00fcr\u00fcrken, <code>eth_getBlockByNumber<\/code> metodu, belirli bir blok numaras\u0131n\u0131n t\u00fcm detaylar\u0131n\u0131 (i\u00e7indeki i\u015flemler dahil) sa\u011flar. Bu metodlar arac\u0131l\u0131\u011f\u0131yla, blok zincirindeki her t\u00fcrl\u00fc veriye programatik olarak eri\u015febiliriz. Kendi node&#8217;umuzu \u00e7al\u0131\u015ft\u0131rmak yerine, Infura, Alchemy, QuickNode gibi \u00fc\u00e7\u00fcnc\u00fc taraf RPC sa\u011flay\u0131c\u0131lar\u0131n\u0131 kullanabiliriz. Bu servisler, y\u00fcksek performansl\u0131 ve g\u00fcvenilir node&#8217;lara eri\u015fim sa\u011flayarak kendi node&#8217;umuzu kurma ve y\u00f6netme y\u00fck\u00fcn\u00fc ortadan kald\u0131r\u0131r. Ancak bu servislerin de h\u0131z s\u0131n\u0131rlamalar\u0131 (rate limiting) ve kullan\u0131m limitleri olabilece\u011fini unutmamak gerekir.<\/p>\n<h3>\u0130\u015flem (Transaction) ve Blok (Block) Yap\u0131s\u0131<\/h3>\n<p>Blockchain&#8217;in temel yap\u0131 ta\u015flar\u0131, i\u015flemler ve bloklard\u0131r. Bir i\u015flem, a\u011fdaki bir varl\u0131k transferini (\u00f6rne\u011fin Ether g\u00f6nderimi) veya bir ak\u0131ll\u0131 s\u00f6zle\u015fme ile etkile\u015fimi temsil eder. Her i\u015flem, g\u00f6nderici adresi, al\u0131c\u0131 adresi, g\u00f6nderilen miktar (de\u011fer), i\u015flem \u00fccreti (gas), veri (data) ve bir i\u015flem hash&#8217;i gibi bilgileri i\u00e7erir. \u0130\u015flem hash&#8217;i, i\u015flemin benzersiz bir tan\u0131mlay\u0131c\u0131s\u0131d\u0131r ve blockchain \u00fczerinde o i\u015flemi bulmak i\u00e7in kullan\u0131l\u0131r. Ak\u0131ll\u0131 s\u00f6zle\u015fme etkile\u015fimlerinde, <code>data<\/code> alan\u0131, \u00e7a\u011fr\u0131lan fonksiyonu ve fonksiyon parametrelerini i\u00e7erir.<\/p>\n<p>Bloklar ise, belirli bir s\u00fcre i\u00e7inde onaylanm\u0131\u015f ve do\u011frulanm\u0131\u015f bir grup i\u015flemi bir araya getiren veri paketleridir. Her blok, bir \u00f6nceki blo\u011fun hash&#8217;ini (b\u00f6ylece zincirleme bir yap\u0131 olu\u015fur), kendi benzersiz hash&#8217;ini, bir zaman damgas\u0131n\u0131, madenci \u00f6d\u00fcl\u00fcn\u00fc, zorluk seviyesini ve i\u00e7inde bar\u0131nd\u0131rd\u0131\u011f\u0131 t\u00fcm i\u015flemlerin bir listesini i\u00e7erir. Blok numaras\u0131, bir blo\u011fun zincirdeki konumunu belirtir. Bizim uyar\u0131 botumuz, genellikle yeni olu\u015fan bloklar\u0131 ve bu bloklar\u0131n i\u00e7indeki i\u015flemleri tarayarak \u00e7al\u0131\u015f\u0131r. Belirli bir adrese g\u00f6nderilen Ether transferlerini, bir ak\u0131ll\u0131 s\u00f6zle\u015fmenin belirli bir fonksiyon \u00e7a\u011fr\u0131s\u0131n\u0131 veya bir olay\u0131n (event) tetiklenmesini izlemek i\u00e7in blok ve i\u015flem verilerini detayl\u0131 bir \u015fekilde incelememiz gerekecektir. Bu verileri do\u011fru bir \u015fekilde analiz etmek, botumuzun etkinli\u011fini do\u011frudan etkileyecektir. \u00d6rne\u011fin, bir bloktan t\u00fcm i\u015flemleri \u00e7ektikten sonra, her bir i\u015flemin <code>to<\/code>, <code>from<\/code> ve <code>value<\/code> alanlar\u0131n\u0131 kontrol ederek ilgilendi\u011fimiz kriterlere uyup uymad\u0131\u011f\u0131n\u0131 belirleyebiliriz. Bu ham verilere do\u011frudan eri\u015fim, bize filtreleme ve analiz s\u00fcre\u00e7lerinde tam kontrol sa\u011flar.<\/p>\n<h3>Gerekli Ara\u00e7lar: Python ve \u0130stek K\u00fct\u00fcphaneleri<\/h3>\n<p>Python ile blockchain node&#8217;lar\u0131 aras\u0131nda ileti\u015fim kurmak i\u00e7in temel olarak iki \u015feye ihtiyac\u0131m\u0131z olacak: HTTP istekleri yapabilen bir k\u00fct\u00fcphane ve JSON verilerini i\u015fleyebilen bir mekanizma. Python&#8217;\u0131n standart k\u00fct\u00fcphanesi bu yeteneklerin \u00e7o\u011funu zaten sunar, ancak daha kolay ve g\u00fc\u00e7l\u00fc bir kullan\u0131m i\u00e7in \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerden yararlanabiliriz.<\/p>\n<p><code>requests<\/code> k\u00fct\u00fcphanesi, Python&#8217;da HTTP istekleri yapmak i\u00e7in de facto (fiili) standartt\u0131r. Kullan\u0131m\u0131 son derece basittir ve POST istekleri, ba\u015fl\u0131k y\u00f6netimi, JSON veri g\u00f6nderimi gibi t\u00fcm ihtiya\u00e7lar\u0131m\u0131z\u0131 kar\u015f\u0131lar. Blockchain RPC \u00e7a\u011fr\u0131lar\u0131 genellikle HTTP POST metodunu ve JSON format\u0131nda bir g\u00f6vdeyi (body) kullan\u0131r. <code>requests<\/code> k\u00fct\u00fcphanesi, bu t\u00fcr istekleri olu\u015fturmay\u0131 ve yan\u0131tlar\u0131 i\u015flemeyi \u00e7ok kolayla\u015ft\u0131r\u0131r. \u00d6rne\u011fin, bir JSON y\u00fck\u00fcn\u00fc do\u011frudan <code>json<\/code> parametresi ile g\u00f6nderebiliriz ve yan\u0131t\u0131 da <code>response.json()<\/code> ile kolayca Python s\u00f6zl\u00fc\u011f\u00fcne d\u00f6n\u00fc\u015ft\u00fcrebiliriz.<\/p>\n<p>JSON verilerini Python&#8217;da i\u015flemek i\u00e7in ise, Python&#8217;\u0131n yerle\u015fik <code>json<\/code> mod\u00fcl\u00fc fazlas\u0131yla yeterlidir. RPC yan\u0131tlar\u0131 genellikle JSON format\u0131nda gelir ve bu mod\u00fcl sayesinde bu verileri Python s\u00f6zl\u00fcklerine veya listelerine d\u00f6n\u00fc\u015ft\u00fcrerek kolayca eri\u015febilir ve filtreleyebiliriz. \u00d6rne\u011fin, bir bloktan \u00e7ekilen i\u015flemler listesi, Python&#8217;da bir liste i\u00e7inde s\u00f6zl\u00fckler olarak temsil edilecek ve bu sayede belirli anahtarlara (\u00f6rne\u011fin <code>'to'<\/code> veya <code>'value'<\/code>) g\u00f6re filtreleme yapabilece\u011fiz. Bu temel ara\u00e7larla, karma\u015f\u0131k blockchain verilerini bile sorunsuz bir \u015fekilde \u00e7ekip i\u015fleyebiliriz.<\/p>\n<h2>Ad\u0131m Ad\u0131m Geli\u015ftirme: Zincir Verilerini \u00c7ekme ve \u0130\u015fleme<\/h2>\n<p>Art\u0131k temel kavramlar\u0131 anlad\u0131\u011f\u0131m\u0131za g\u00f6re, Python ile bir blockchain node&#8217;una nas\u0131l ba\u011flanaca\u011f\u0131m\u0131z\u0131 ve veri \u00e7ekece\u011fimizi ad\u0131m ad\u0131m g\u00f6relim. Bu b\u00f6l\u00fcmde, botumuzun veri toplama \u00e7ekirde\u011fini olu\u015fturaca\u011f\u0131z.<\/p>\n<h3>RPC Ba\u011flant\u0131s\u0131 Nas\u0131l Kurulur?<\/h3>\n<p>Blockchain verilerine eri\u015fmek i\u00e7in \u00f6ncelikle bir RPC (Remote Procedure Call) endpoint&#8217;ine ihtiyac\u0131m\u0131z var. Kendi Ethereum node&#8217;unuzu \u00e7al\u0131\u015ft\u0131rmak yerine, genellikle Infura, Alchemy, QuickNode gibi servis sa\u011flay\u0131c\u0131lar\u0131n\u0131 kullanmak daha pratik ve h\u0131zl\u0131d\u0131r. Bu servisler, y\u00fcksek eri\u015filebilirli\u011fe sahip, \u00f6l\u00e7eklenebilir ve y\u00f6netilen node&#8217;lar sunar. Bir hesap olu\u015fturarak \u00fccretsiz veya \u00fccretli bir plan dahilinde bir API anahtar\u0131 alabilir ve bu anahtar ile bir endpoint URL&#8217;i elde edebilirsiniz. \u00d6rne\u011fin, Infura&#8217;dan alaca\u011f\u0131n\u0131z bir endpoint URL&#8217;i \u015f\u00f6yle g\u00f6r\u00fcnebilir: <code>https:\/\/mainnet.infura.io\/v3\/YOUR_API_KEY<\/code>.<\/p>\n<p>Bu URL&#8217;i kullanarak bir HTTP POST iste\u011fi g\u00f6nderece\u011fiz. \u0130stek g\u00f6vdesi (body), JSON-RPC standard\u0131na uygun olmal\u0131d\u0131r. Bu, genellikle <code>jsonrpc<\/code> s\u00fcr\u00fcm\u00fcn\u00fc (genellikle &#8220;2.0&#8221;), \u00e7a\u011fr\u0131lacak metodun ad\u0131n\u0131 (<code>method<\/code>), metoda iletilecek parametreleri (<code>params<\/code>) ve bir istek kimli\u011fini (<code>id<\/code>) i\u00e7eren bir JSON nesnesidir. \u0130\u015fte Python&#8217;da <code>requests<\/code> k\u00fct\u00fcphanesi ile nas\u0131l bir RPC ba\u011flant\u0131s\u0131 kuraca\u011f\u0131m\u0131za dair bir \u00f6rnek:<\/p>\n<div class=\"code-container\">\n<pre><code>\nimport requests\nimport json\n\n# RPC endpoint URL'iniz. Kendi Infura\/Alchemy anahtar\u0131n\u0131zla de\u011fi\u015ftirin.\nRPC_URL = \"https:\/\/mainnet.infura.io\/v3\/YOUR_API_KEY\"\n\ndef make_rpc_call(method, params=[]):\n    headers = {\"Content-Type\": \"application\/json\"}\n    payload = {\n        \"jsonrpc\": \"2.0\",\n        \"method\": method,\n        \"params\": params,\n        \"id\": 1  # \u0130stek kimli\u011fi, genellikle sabit bir de\u011fer olabilir\n    }\n    try:\n        response = requests.post(RPC_URL, headers=headers, json=payload)\n        response.raise_for_status()  # HTTP hatalar\u0131 i\u00e7in istisna f\u0131rlat\u0131r\n        return response.json()\n    except requests.exceptions.RequestException as e:\n        print(f\"RPC \u00e7a\u011fr\u0131s\u0131 s\u0131ras\u0131nda hata olu\u015ftu: {e}\")\n        return None\n\n# \u00d6rnek kullan\u0131m: Son blok numaras\u0131n\u0131 \u00e7ekme\n# latest_block_number_response = make_rpc_call(\"eth_blockNumber\")\n# if latest_block_number_response:\n#    print(f\"Son blok numaras\u0131: {latest_block_number_response['result']}\")\n  <\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki <code>make_rpc_call<\/code> fonksiyonu, herhangi bir JSON-RPC metodunu \u00e7a\u011f\u0131rmak i\u00e7in genel bir yap\u0131d\u0131r. <code>method<\/code> parametresi \u00e7a\u011fr\u0131lacak RPC metodunu (\u00f6rne\u011fin <code>eth_blockNumber<\/code>), <code>params<\/code> ise bu metoda iletilecek arg\u00fcmanlar\u0131 al\u0131r. Yan\u0131t olarak gelen JSON objesini <code>response.json()<\/code> ile Python s\u00f6zl\u00fc\u011f\u00fcne d\u00f6n\u00fc\u015ft\u00fcr\u00fcyoruz. Bu temel fonksiyon, botumuzun t\u00fcm RPC etkile\u015fimleri i\u00e7in temelini olu\u015fturacakt\u0131r. Ba\u011flant\u0131 hatalar\u0131n\u0131 y\u00f6netmek i\u00e7in <code>try-except<\/code> blo\u011funu kullanmak, botunuzun daha sa\u011flam \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Son Blo\u011fu ve \u0130\u015flemleri \u00c7ekme<\/h3>\n<p>Uyar\u0131 botumuzun s\u00fcrekli olarak yeni olaylar\u0131 izleyebilmesi i\u00e7in, blockchain&#8217;deki en son blo\u011fu ve bu blo\u011fun i\u00e7indeki i\u015flemleri d\u00fczenli olarak kontrol etmesi gerekir. Bu i\u015flem iki ad\u0131mdan olu\u015fur: \u00f6nce en son blok numaras\u0131n\u0131 almak, ard\u0131ndan bu blok numaras\u0131n\u0131 kullanarak blo\u011fun t\u00fcm detaylar\u0131n\u0131 \u00e7ekmek. Ethereum a\u011f\u0131nda bu i\u015flemler i\u00e7in <code>eth_blockNumber<\/code> ve <code>eth_getBlockByNumber<\/code> RPC metodlar\u0131n\u0131 kullan\u0131r\u0131z.<\/p>\n<p><code>eth_blockNumber<\/code> metodu, a\u011fdaki en son blo\u011fun onalt\u0131l\u0131k (hexadecimal) format\u0131ndaki numaras\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr. Bu numaray\u0131 ald\u0131ktan sonra, <code>eth_getBlockByNumber<\/code> metoduna parametre olarak ileterek ilgili blo\u011fun t\u00fcm verilerini (i\u015flemler dahil) alabiliriz. <code>eth_getBlockByNumber<\/code> metodunun ikinci parametresi, i\u015flemlerin tam detaylar\u0131yla birlikte mi yoksa sadece i\u015flem hash&#8217;leriyle mi d\u00f6nd\u00fcr\u00fclece\u011fini belirler (<code>true<\/code> tam detaylar i\u00e7in). Bizim durumumuzda, i\u015flemleri filtreleyece\u011fimiz i\u00e7in tam detaylara ihtiyac\u0131m\u0131z olacak.<\/p>\n<div class=\"code-container\">\n<pre><code>\ndef get_latest_block_number():\n    response = make_rpc_call(\"eth_blockNumber\")\n    if response and 'result' in response:\n        # Hexadecimal blok numaras\u0131n\u0131 ondal\u0131k say\u0131ya \u00e7eviriyoruz\n        return int(response['result'], 16)\n    return None\n\ndef get_block_details(block_number):\n    # Blok numaras\u0131n\u0131 onalt\u0131l\u0131k formata \u00e7eviriyoruz\n    hex_block_number = hex(block_number)\n    # eth_getBlockByNumber metodu, ikinci parametre olarak true al\u0131rsa\n    # i\u015flemlerin tam detaylar\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr, aksi takdirde sadece hash'lerini.\n    response = make_rpc_call(\"eth_getBlockByNumber\", [hex_block_number, True])\n    if response and 'result' in response:\n        return response['result']\n    return None\n\n# \u00d6rnek kullan\u0131m\n# latest_num = get_latest_block_number()\n# if latest_num:\n#    print(f\"En son blok numaras\u0131: {latest_num}\")\n#    block_details = get_block_details(latest_num)\n#    if block_details:\n#        print(f\"Blok {latest_num} i\u00e7indeki i\u015flem say\u0131s\u0131: {len(block_details['transactions'])}\")\n#        # \u0130lk i\u015flemin detaylar\u0131n\u0131 yazd\u0131r\n#        if block_details['transactions']:\n#            print(f\"\u0130lk i\u015flem hash'i: {block_details['transactions'][0]['hash']}\")\n#            print(f\"\u0130lk i\u015flem g\u00f6nderici: {block_details['transactions'][0]['from']}\")\n#            print(f\"\u0130lk i\u015flem al\u0131c\u0131: {block_details['transactions'][0]['to']}\")\n#            # Value onalt\u0131l\u0131k formatta gelir, wei cinsindendir.\n#            value_wei = int(block_details['transactions'][0]['value'], 16)\n#            value_eth = value_wei \/ (10**18) # Wei'den Ether'e \u00e7evirme\n#            print(f\"\u0130lk i\u015flem de\u011feri: {value_eth} ETH\")\n  <\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki kodda, <code>get_latest_block_number<\/code> fonksiyonu en son blok numaras\u0131n\u0131 al\u0131p ondal\u0131k say\u0131ya \u00e7evirirken, <code>get_block_details<\/code> fonksiyonu bu numara ile blo\u011fun t\u00fcm detaylar\u0131n\u0131 \u00e7eker. \u00d6zellikle <code>value<\/code> alan\u0131 gibi say\u0131sal de\u011ferler, RPC yan\u0131tlar\u0131nda onalt\u0131l\u0131k (hexadecimal) string olarak gelir. Bu de\u011ferleri Python&#8217;da kullanabilmek i\u00e7in <code>int(value_str, 16)<\/code> ile ondal\u0131k say\u0131ya \u00e7evirmemiz gerekir. Ether miktarlar\u0131n\u0131 i\u015flerken, de\u011ferin genellikle Wei cinsinden (Ether&#8217;in en k\u00fc\u00e7\u00fck birimi, 1 Ether = 10^18 Wei) geldi\u011fini unutmamal\u0131 ve uygun d\u00f6n\u00fc\u015f\u00fcmleri yapmal\u0131y\u0131z. Bu fonksiyonlar, botumuzun her d\u00f6ng\u00fcde yeni bloklar\u0131 taramas\u0131n\u0131 sa\u011flayacak temel mekanizmay\u0131 olu\u015fturur.<\/p>\n<h3>Belirli \u0130\u015flemleri Filtreleme ve \u0130zleme<\/h3>\n<p>T\u00fcm bloktaki i\u015flemleri \u00e7ekmek g\u00fczel, ancak genellikle ilgilendi\u011fimiz belirli kriterlere uyan i\u015flemleri bulmak isteriz. Bu, botumuzun as\u0131l amac\u0131n\u0131 olu\u015fturur. \u0130\u015flemleri filtrelemek i\u00e7in, her i\u015flemin <code>from<\/code> (g\u00f6nderici), <code>to<\/code> (al\u0131c\u0131) adresleri, <code>value<\/code> (g\u00f6nderilen miktar) ve <code>input<\/code> (i\u015flem verisi) alanlar\u0131n\u0131 inceleyebiliriz. \u00d6rne\u011fin, belirli bir c\u00fczdan adresine yap\u0131lan t\u00fcm transferleri veya belirli bir miktar\u0131n \u00fczerindeki transferleri izlemek isteyebiliriz.<\/p>\n<p>A\u015fa\u011f\u0131daki \u00f6rnek, belirli bir hedef adrese yap\u0131lan ETH transferlerini nas\u0131l filtreleyece\u011fimizi g\u00f6steriyor. Ayr\u0131ca, belirli bir minimum transfer miktar\u0131n\u0131 da filtreleme kriteri olarak ekleyebiliriz. Bu, &#8220;balina&#8221; hareketlerini veya b\u00fcy\u00fck fon transferlerini izlemek i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<div class=\"code-container\">\n<pre><code>\ndef filter_transactions(transactions, target_address=None, min_value_eth=0):\n    filtered_txs = []\n    for tx in transactions:\n        # 'to' alan\u0131 null olabilir (\u00f6rne\u011fin, s\u00f6zle\u015fme da\u011f\u0131t\u0131m\u0131 i\u015flemleri i\u00e7in)\n        if tx.get('to') and tx['to'].lower() == target_address.lower():\n            # \u0130\u015flem de\u011ferini Wei'den Ether'e \u00e7evir\n            value_wei = int(tx['value'], 16)\n            value_eth = value_wei \/ (10**18)\n\n            if value_eth >= min_value_eth:\n                filtered_txs.append({\n                    \"hash\": tx['hash'],\n                    \"from\": tx['from'],\n                    \"to\": tx['to'],\n                    \"value_eth\": value_eth,\n                    \"gas_price\": int(tx['gasPrice'], 16) \/ (10**9), # Gwei\n                    \"gas_used\": int(tx['gas'], 16) # Max gas\n                })\n    return filtered_txs\n\n# \u00d6rnek kullan\u0131m: Binance s\u0131cak c\u00fczdanlar\u0131ndan birini izleyelim (\u00f6rnek adres)\n# Ger\u00e7ek bir Binance s\u0131cak c\u00fczdan\u0131 adresi kullan\u0131n veya kendi adresinizi.\n# Bu adres sadece \u00f6rnek ama\u00e7l\u0131d\u0131r.\nTARGET_WALLET_ADDRESS = \"0x28C6c06298d514Db089934071355E5743bf21d60\" # \u00d6rnek bir adres\nMIN_TRANSFER_AMOUNT_ETH = 100 # Sadece 100 ETH ve \u00fczeri transferleri izle\n\n# latest_num = get_latest_block_number()\n# if latest_num:\n#    block_details = get_block_details(latest_num)\n#    if block_details:\n#        important_transactions = filter_transactions(\n#            block_details['transactions'],\n#            target_address=TARGET_WALLET_ADDRESS,\n#            min_value_eth=MIN_TRANSFER_AMOUNT_ETH\n#        )\n#        if important_transactions:\n#            print(f\"Blok {latest_num} i\u00e7inde {TARGET_WALLET_ADDRESS} adresine\/adresinden {MIN_TRANSFER_AMOUNT_ETH} ETH \u00fczeri transferler:\")\n#            for tx in important_transactions:\n#                print(f\"  Hash: {tx['hash']}, De\u011fer: {tx['value_eth']} ETH\")\n#        else:\n#            print(f\"Blok {latest_num} i\u00e7inde belirlenen kriterlere uyan i\u015flem bulunamad\u0131.\")\n  <\/code><\/pre>\n<\/div>\n<p><code>filter_transactions<\/code> fonksiyonu, bir bloktaki t\u00fcm i\u015flemleri al\u0131r ve belirtilen hedef adres ile minimum ETH miktar\u0131na g\u00f6re filtreler. <code>tx.get('to')<\/code> kullan\u0131m\u0131, <code>to<\/code> alan\u0131 olmayan i\u015flemlerin (\u00f6rne\u011fin ak\u0131ll\u0131 s\u00f6zle\u015fme da\u011f\u0131t\u0131mlar\u0131) hataya yol a\u00e7mas\u0131n\u0131 engeller. Adres kar\u015f\u0131la\u015ft\u0131rmalar\u0131n\u0131 yaparken, b\u00fcy\u00fck\/k\u00fc\u00e7\u00fck harf duyarl\u0131l\u0131\u011f\u0131n\u0131 ortadan kald\u0131rmak i\u00e7in <code>.lower()<\/code> kullanmak iyi bir uygulamad\u0131r, zira Ethereum adresleri b\u00fcy\u00fck\/k\u00fc\u00e7\u00fck harf duyarl\u0131 de\u011fildir. Bu filtreleme mant\u0131\u011f\u0131, botumuzun sadece ger\u00e7ekten \u00f6nemli olan olaylara odaklanmas\u0131n\u0131 sa\u011flar ve gereksiz bildirimlerin \u00f6n\u00fcne ge\u00e7er. Bu sayede, botumuz daha verimli \u00e7al\u0131\u015f\u0131r ve bize sadece ilgili bilgileri sunar.<\/p>\n<h2>Uyar\u0131 Mekanizmas\u0131 Olu\u015fturma: Bildirimleri Nas\u0131l G\u00f6ndeririz?<\/h2>\n<p>Botumuzun zincir \u00fczerindeki verileri \u00e7ekip filtrelemesi harika, ancak bu bilgileri bize ula\u015ft\u0131rmad\u0131\u011f\u0131 s\u00fcrece bir anlam ifade etmez. Bu b\u00f6l\u00fcmde, botumuzun tespit etti\u011fi \u00f6nemli olaylar\u0131 bize bildirecek uyar\u0131 mekanizmalar\u0131n\u0131 nas\u0131l entegre edece\u011fimizi inceleyece\u011fiz. Telegram, anl\u0131k bildirimler i\u00e7in pop\u00fcler ve kullan\u0131m\u0131 kolay bir platformdur.<\/p>\n<h3>Farkl\u0131 Bildirim Kanallar\u0131 Nelerdir?<\/h3>\n<p>Uyar\u0131lar\u0131 g\u00f6ndermek i\u00e7in bir\u00e7ok farkl\u0131 kanal kullanabiliriz. Se\u00e7im, ki\u015fisel tercihlerinize ve botunuzun hedef kitlesine ba\u011fl\u0131d\u0131r:<\/p>\n<ul>\n<li><strong>Telegram:<\/strong> Anl\u0131k mesajla\u015fma uygulamas\u0131 olarak, botlar arac\u0131l\u0131\u011f\u0131yla h\u0131zl\u0131 ve etkili bildirimler g\u00f6ndermek i\u00e7in idealdir. Python i\u00e7in do\u011frudan Telegram Bot API&#8217;si ile etkile\u015fim kurabiliriz.<\/li>\n<li><strong>Discord:<\/strong> \u00d6zellikle oyun ve kripto topluluklar\u0131nda yayg\u0131n olarak kullan\u0131lan Discord, webhook&#8217;lar arac\u0131l\u0131\u011f\u0131yla kolayca bildirim g\u00f6nderme imkan\u0131 sunar.<\/li>\n<li><strong>E-posta:<\/strong> Daha geleneksel bir y\u00f6ntem olsa da, \u00f6nemli ve acil olmayan bildirimler i\u00e7in hala ge\u00e7erlidir. Python&#8217;\u0131n <code>smtplib<\/code> mod\u00fcl\u00fc ile e-posta g\u00f6ndermek m\u00fcmk\u00fcnd\u00fcr.<\/li>\n<li><strong>SMS:<\/strong> Ger\u00e7ekten kritik uyar\u0131lar i\u00e7in SMS, y\u00fcksek eri\u015filebilirli\u011fi nedeniyle tercih edilebilir. \u00dc\u00e7\u00fcnc\u00fc taraf SMS a\u011f ge\u00e7itleri (Twilio gibi) arac\u0131l\u0131\u011f\u0131yla entegre edilebilir.<\/li>\n<li><strong>Slack:<\/strong> \u0130\u015f ve ekip ileti\u015fimi i\u00e7in kullan\u0131lan Slack, webhook&#8217;lar veya bot API&#8217;si arac\u0131l\u0131\u011f\u0131yla bildirimler i\u00e7in uygun bir platformdur.<\/li>\n<\/ul>\n<p>Bu makalede, h\u0131zl\u0131 kurulumu ve geni\u015f kullan\u0131c\u0131 taban\u0131 nedeniyle Telegram&#8217;a odaklanaca\u011f\u0131z. Ancak temel mant\u0131k, di\u011fer platformlar i\u00e7in de benzerdir; sadece API etkile\u015fimleri farkl\u0131l\u0131k g\u00f6sterecektir.<\/p>\n<h3>Telegram Botu ile Entegrasyon<\/h3>\n<p>Telegram ile bildirim g\u00f6ndermek i\u00e7in \u00f6ncelikle bir Telegram botu olu\u015fturman\u0131z gerekir. Bu i\u015flem olduk\u00e7a basittir:<\/p>\n<ol>\n<li>Telegram uygulamas\u0131nda @BotFather ile sohbet ba\u015flat\u0131n.<\/li>\n<li><code>\/newbot<\/code> komutunu g\u00f6nderin ve botunuza bir isim verin (\u00f6rne\u011fin &#8220;KriptoUyar\u0131Botu&#8221;).<\/li>\n<li>BotFather size bir API token&#8217;\u0131 verecektir (\u00f6rne\u011fin <code>123456:ABC-DEF1234ghIkl-7890<\/code>). Bu token&#8217;\u0131 g\u00fcvenli bir yerde saklay\u0131n, \u00e7\u00fcnk\u00fc botunuzun kimli\u011fidir.<\/li>\n<li>Botunuzun size mesaj g\u00f6nderebilmesi i\u00e7in, botunuza bir mesaj g\u00f6ndermeniz ve botunuzun chat ID&#8217;nizi bilmesi gerekir. Botunuza herhangi bir mesaj g\u00f6nderdikten sonra, <code>https:\/\/api.telegram.org\/botYOUR_BOT_TOKEN\/getUpdates<\/code> adresine giderek (<code>YOUR_BOT_TOKEN<\/code> yerine kendi bot token&#8217;\u0131n\u0131z\u0131 yaz\u0131n) JSON \u00e7\u0131kt\u0131s\u0131nda <code>\"chat\":{\"id\":YOUR_CHAT_ID,\"first_name\":\"YourName\"}<\/code> k\u0131sm\u0131ndaki <code>YOUR_CHAT_ID<\/code> de\u011ferini bulabilirsiniz.<\/li>\n<\/ol>\n<p>Bot token&#8217;\u0131 ve chat ID&#8217;nizi ald\u0131ktan sonra, Python&#8217;da <code>requests<\/code> k\u00fct\u00fcphanesini kullanarak Telegram API&#8217;sine mesaj g\u00f6nderebiliriz:<\/p>\n<div class=\"code-container\">\n<pre><code>\nTELEGRAM_BOT_TOKEN = \"YOUR_TELEGRAM_BOT_TOKEN\" # BotFather'dan ald\u0131\u011f\u0131n\u0131z token\nTELEGRAM_CHAT_ID = \"YOUR_TELEGRAM_CHAT_ID\"     # Kendi chat ID'niz\n\ndef send_telegram_message(message):\n    url = f\"https:\/\/api.telegram.org\/bot{TELEGRAM_BOT_TOKEN}\/sendMessage\"\n    payload = {\n        \"chat_id\": TELEGRAM_CHAT_ID,\n        \"text\": message,\n        \"parse_mode\": \"HTML\" # Mesaj\u0131 HTML olarak formatlayabiliriz\n    }\n    try:\n        response = requests.post(url, json=payload)\n        response.raise_for_status()\n        print(\"Telegram mesaj\u0131 ba\u015far\u0131yla g\u00f6nderildi.\")\n    except requests.exceptions.RequestException as e:\n        print(f\"Telegram mesaj\u0131 g\u00f6nderilirken hata olu\u015ftu: {e}\")\n\n# \u00d6rnek kullan\u0131m:\n# send_telegram_message(\"Merhaba, bu bir test mesaj\u0131d\u0131r!\")\n# send_telegram_message(\"<b>Yeni bir i\u015flem tespit edildi!<\/b><br>Hash: 0x123...abc\")\n  <\/code><\/pre>\n<\/div>\n<p><code>send_telegram_message<\/code> fonksiyonu, ald\u0131\u011f\u0131 mesaj\u0131 Telegram API&#8217;sine POST iste\u011fi olarak g\u00f6nderir. <code>parse_mode=\"HTML\"<\/code> parametresi sayesinde, mesaj metninde HTML etiketleri (<code><b><\/code>, <code><br \/><\/code> vb.) kullanarak mesaj\u0131 daha okunakl\u0131 ve bilgilendirici hale getirebiliriz. Bu fonksiyon, botumuzun zincir \u00fczerindeki \u00f6nemli olaylar\u0131 bize an\u0131nda bildirmesini sa\u011flayacakt\u0131r.<\/p>\n<h3>Uyar\u0131 Mant\u0131\u011f\u0131n\u0131n Birle\u015ftirilmesi<\/h3>\n<p>\u015eimdiye kadar blok verilerini \u00e7ekmeyi, i\u015flemleri filtrelemeyi ve Telegram&#8217;a mesaj g\u00f6ndermeyi \u00f6\u011frendik. Bu par\u00e7alar\u0131 bir araya getirerek s\u00fcrekli \u00e7al\u0131\u015fan bir uyar\u0131 botu olu\u015fturabiliriz. Botumuzun temel mant\u0131\u011f\u0131, belirli aral\u0131klarla yeni bloklar\u0131 kontrol etmek, bu bloklardaki i\u015flemleri filtrelemek ve e\u011fer ilgili bir i\u015flem bulunursa uyar\u0131 g\u00f6ndermek olacakt\u0131r. Botun ayn\u0131 i\u015flemi tekrar tekrar bildirmesini \u00f6nlemek i\u00e7in, en son i\u015flenen blok numaras\u0131n\u0131 takip etmemiz \u00f6nemlidir.<\/p>\n<div class=\"code-container\">\n<pre><code>\nimport time\n\n# Daha \u00f6nceki fonksiyonlar\u0131m\u0131z\u0131 (make_rpc_call, get_latest_block_number, get_block_details, filter_transactions, send_telegram_message) buraya veya ayr\u0131 bir dosyadan import edebiliriz.\n\n# Global de\u011fi\u015fken olarak son i\u015flenen blok numaras\u0131n\u0131 tutal\u0131m\nlast_processed_block = None\n\ndef start_alert_bot():\n    global last_processed_block\n    print(\"Uyar\u0131 botu ba\u015flat\u0131l\u0131yor...\")\n\n    # Ba\u015flang\u0131\u00e7ta son blok numaras\u0131n\u0131 al\n    initial_block = get_latest_block_number()\n    if initial_block:\n        last_processed_block = initial_block\n        print(f\"Bot, {last_processed_block} numaral\u0131 bloktan itibaren izlemeye ba\u015flayacak.\")\n    else:\n        print(\"Ba\u015flang\u0131\u00e7 blok numaras\u0131n\u0131 alamad\u0131, bot ba\u015flat\u0131lam\u0131yor.\")\n        return\n\n    while True:\n        try:\n            current_block_number = get_latest_block_number()\n            if current_block_number is None:\n                print(\"Mevcut blok numaras\u0131n\u0131 alamad\u0131, tekrar deniyor...\")\n                time.sleep(10) # Hata durumunda bekle\n                continue\n\n            if current_block_number > last_processed_block:\n                print(f\"Yeni bloklar tespit edildi: {last_processed_block + 1} - {current_block_number}\")\n                for block_num_to_process in range(last_processed_block + 1, current_block_number + 1):\n                    block_details = get_block_details(block_num_to_process)\n                    if block_details and 'transactions' in block_details:\n                        print(f\"Blok {block_num_to_process} i\u015fleniyor...\")\n                        important_transactions = filter_transactions(\n                            block_details['transactions'],\n                            target_address=TARGET_WALLET_ADDRESS,\n                            min_value_eth=MIN_TRANSFER_AMOUNT_ETH\n                        )\n                        if important_transactions:\n                            for tx in important_transactions:\n                                message = (\n                                    f\"<b>\ud83d\udea8 Yeni \u0130\u015flem Uyar\u0131s\u0131!<\/b>\\n\"\n                                    f\"Zincir: Ethereum Mainnet\\n\"\n                                    f\"Blok: {block_num_to_process}\\n\"\n                                    f\"Hash: <a href='https:\/\/etherscan.io\/tx\/{tx['hash']}'>{tx['hash'][:10]}...<\/a>\\n\"\n                                    f\"G\u00f6nderen: <a href='https:\/\/etherscan.io\/address\/{tx['from']}'>{tx['from'][:10]}...<\/a>\\n\"\n                                    f\"Al\u0131c\u0131: <a href='https:\/\/etherscan.io\/address\/{tx['to']}'>{tx['to'][:10]}...<\/a>\\n\"\n                                    f\"Miktar: <b>{tx['value_eth']:.4f} ETH<\/b>\\n\"\n                                    f\"Gas \u00dccreti: {tx['gas_price'] * tx['gas_used'] \/ (10<strong>9 * 10<\/strong>9):.6f} ETH (yakla\u015f\u0131k)\"\n                                )\n                                send_telegram_message(message)\n                                time.sleep(1) # API h\u0131z s\u0131n\u0131rlamalar\u0131na tak\u0131lmamak i\u00e7in k\u00fc\u00e7\u00fck bir bekleme\n                    last_processed_block = block_num_to_process\n            else:\n                print(f\"Yeni blok yok. Son blok: {current_block_number}. Bekleniyor...\")\n\n            time.sleep(30) # Her 30 saniyede bir kontrol et\n        except Exception as e:\n            print(f\"Ana d\u00f6ng\u00fcde beklenmedik bir hata olu\u015ftu: {e}\")\n            time.sleep(60) # Hata durumunda daha uzun bekle\n\n# Botu ba\u015flatmak i\u00e7in:\n# if __name__ == \"__main__\":\n#    start_alert_bot()\n  <\/code><\/pre>\n<\/div>\n<p><code>start_alert_bot<\/code> fonksiyonu, s\u00fcrekli bir d\u00f6ng\u00fc i\u00e7inde \u00e7al\u0131\u015f\u0131r. Her d\u00f6ng\u00fcde, mevcut en son blok numaras\u0131n\u0131 al\u0131r ve bu numara, en son i\u015fledi\u011fimiz blok numaras\u0131ndan b\u00fcy\u00fckse, aradaki t\u00fcm yeni bloklar\u0131 s\u0131rayla i\u015fler. Her bloktaki i\u015flemleri filtreler ve e\u011fer kriterlere uyan bir i\u015flem bulursa, Telegram&#8217;a detayl\u0131 bir mesaj g\u00f6nderir. <code>time.sleep()<\/code> fonksiyonu, hem RPC sa\u011flay\u0131c\u0131s\u0131n\u0131n h\u0131z s\u0131n\u0131rlamalar\u0131na tak\u0131lmamak hem de CPU kullan\u0131m\u0131n\u0131 optimize etmek i\u00e7in \u00f6nemlidir. Hata y\u00f6netimi i\u00e7in <code>try-except<\/code> bloklar\u0131, botun beklenmedik durumlarda \u00e7\u00f6kmesini engeller ve daha sa\u011flam \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Bu temel yap\u0131, botunuzun omurgas\u0131n\u0131 olu\u015fturur ve onu ger\u00e7ek d\u00fcnyadaki olaylara tepki vermeye haz\u0131r hale getirir.<\/p>\n<h2>Vaka Analizi: B\u00fcy\u00fck Bir C\u00fczdan\u0131n Hareketlerini \u0130zlemek<\/h2>\n<p>\u015eimdiye kadar \u00f6\u011frendiklerimizi ger\u00e7ek\u00e7i bir senaryo \u00fczerinde uygulayal\u0131m. Kripto piyasalar\u0131nda &#8220;balina&#8221; olarak adland\u0131r\u0131lan, b\u00fcy\u00fck miktarlarda varl\u0131\u011fa sahip c\u00fczdanlar, yapt\u0131klar\u0131 transferlerle piyasa \u00fczerinde \u00f6nemli etkilere sahip olabilirler. Bu balina c\u00fczdanlar\u0131n\u0131n hareketlerini anl\u0131k olarak izlemek, piyasa trendlerini tahmin etmek veya arbitraj f\u0131rsatlar\u0131n\u0131 yakalamak i\u00e7in kritik bir bilgi kayna\u011f\u0131 olabilir. Bu vaka analizinde, belirli bir balina c\u00fczdan\u0131n\u0131n belirli bir miktar\u0131n \u00fczerindeki \u00e7\u0131k\u0131\u015f i\u015flemlerini nas\u0131l takip edece\u011fimizi ve bu i\u015flemler hakk\u0131nda nas\u0131l an\u0131nda uyar\u0131 alaca\u011f\u0131m\u0131z\u0131 g\u00f6sterece\u011fiz.<\/p>\n<p>Senaryomuz \u015f\u00f6yle: Bir yat\u0131r\u0131mc\u0131 olarak, belirli bir &#8220;balina&#8221; c\u00fczdan\u0131n\u0131n 500 ETH&#8217;den daha b\u00fcy\u00fck \u00e7\u0131k\u0131\u015f i\u015flemlerini takip etmek istiyorsunuz. Bu t\u00fcr b\u00fcy\u00fck transferler, genellikle piyasada \u00f6nemli bir sat\u0131\u015f bask\u0131s\u0131n\u0131n veya b\u00fcy\u00fck bir yat\u0131r\u0131m hareketinin habercisi olabilir. Botumuz, bu c\u00fczdandan yap\u0131lan her 500 ETH \u00fczeri transferi tespit edecek ve bize an\u0131nda Telegram \u00fczerinden bildirim g\u00f6nderecektir.<\/p>\n<p>\u00d6ncelikle, izlemek istedi\u011fimiz balina c\u00fczdan\u0131n\u0131n adresini ve minimum transfer miktar\u0131n\u0131 tan\u0131mlamam\u0131z gerekiyor. Bu de\u011ferleri global de\u011fi\u015fkenler olarak ayarlayabiliriz:<\/p>\n<div class=\"code-container\">\n<pre><code>\n# \u0130zlemek istedi\u011fimiz balina c\u00fczdan\u0131 adresi (\u00f6rnek adres, ger\u00e7ek bir balina adresiyle de\u011fi\u015ftirin)\n# Bu adres sadece \u00f6rnek ama\u00e7l\u0131d\u0131r.\nBALINA_CUZDAN_ADRESI = \"0xde0B295669a9FD93d5F28D9EeLnB38B008dC0d1\" # \u00d6rnek bir balina adresi\nMIN_BALINA_TRANSFER_ETH = 500 # Sadece 500 ETH ve \u00fczeri transferleri izle\n\ndef filter_balina_transactions(transactions, balina_address, min_value_eth):\n    \"\"\"\n    Belirli bir balina adresinden yap\u0131lan, belirli bir miktar\u0131n \u00fczerindeki \u00e7\u0131k\u0131\u015f i\u015flemlerini filtreler.\n    \"\"\"\n    filtered_txs = []\n    for tx in transactions:\n        # \u0130\u015flemin g\u00f6ndericisi balina adresi mi?\n        if tx.get('from') and tx['from'].lower() == balina_address.lower():\n            # \u0130\u015flem de\u011ferini Wei'den Ether'e \u00e7evir\n            value_wei = int(tx['value'], 16)\n            value_eth = value_wei \/ (10**18)\n\n            # Belirlenen minimum miktardan b\u00fcy\u00fck m\u00fc?\n            if value_eth >= min_value_eth:\n                filtered_txs.append({\n                    \"hash\": tx['hash'],\n                    \"from\": tx['from'],\n                    \"to\": tx['to'],\n                    \"value_eth\": value_eth,\n                    \"gas_price\": int(tx['gasPrice'], 16) \/ (10**9), # Gwei\n                    \"gas_used\": int(tx['gas'], 16) # Max gas\n                })\n    return filtered_txs\n  <\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki <code>filter_balina_transactions<\/code> fonksiyonu, \u00f6nceki genel filtreleme fonksiyonumuza benzer, ancak bu sefer sadece <code>from<\/code> (g\u00f6nderici) adresi bizim belirledi\u011fimiz balina c\u00fczdan\u0131 olan i\u015flemleri ve belirli bir minimum miktar\u0131n \u00fczerindeki transferleri hedef al\u0131yor. Bu, botumuzun sadece balina c\u00fczdan\u0131n\u0131n \u00e7\u0131k\u0131\u015f hareketlerine odaklanmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>\u015eimdi bu filtreleme fonksiyonunu ana bot d\u00f6ng\u00fcm\u00fcze entegre edelim. <code>start_alert_bot<\/code> fonksiyonumuzun i\u00e7indeki i\u015flem i\u015fleme k\u0131sm\u0131n\u0131 g\u00fcncelleyece\u011fiz:<\/p>\n<div class=\"code-container\">\n<pre><code>\n# ... (\u00f6nceki make_rpc_call, get_latest_block_number, get_block_details, send_telegram_message fonksiyonlar\u0131 ve global de\u011fi\u015fkenler) ...\n\n# Global de\u011fi\u015fken olarak son i\u015flenen blok numaras\u0131n\u0131 tutal\u0131m\nlast_processed_block = None\n\ndef start_balina_alert_bot():\n    global last_processed_block\n    print(\"Balina uyar\u0131 botu ba\u015flat\u0131l\u0131yor...\")\n\n    initial_block = get_latest_block_number()\n    if initial_block:\n        last_processed_block = initial_block\n        print(f\"Bot, {last_processed_block} numaral\u0131 bloktan itibaren izlemeye ba\u015flayacak.\")\n    else:\n        print(\"Ba\u015flang\u0131\u00e7 blok numaras\u0131n\u0131 alamad\u0131, bot ba\u015flat\u0131lam\u0131yor.\")\n        return\n\n    while True:\n        try:\n            current_block_number = get_latest_block_number()\n            if current_block_number is None:\n                print(\"Mevcut blok numaras\u0131n\u0131 alamad\u0131, tekrar deniyor...\")\n                time.sleep(10)\n                continue\n\n            if current_block_number > last_processed_block:\n                print(f\"Yeni bloklar tespit edildi: {last_processed_block + 1} - {current_block_number}\")\n                for block_num_to_process in range(last_processed_block + 1, current_block_number + 1):\n                    block_details = get_block_details(block_num_to_process)\n                    if block_details and 'transactions' in block_details:\n                        print(f\"Blok {block_num_to_process} i\u015fleniyor...\")\n                        important_transactions = filter_balina_transactions(\n                            block_details['transactions'],\n                            balina_address=BALINA_CUZDAN_ADRESI,\n                            min_value_eth=MIN_BALINA_TRANSFER_ETH\n                        )\n                        if important_transactions:\n                            for tx in important_transactions:\n                                message = (\n                                    f\"\ud83d\udc33 <b>BALINA UYARISI!<\/b> \ud83d\udc33\\n\"\n                                    f\"Zincir: Ethereum Mainnet\\n\"\n                                    f\"Blok: {block_num_to_process}\\n\"\n                                    f\"Hash: <a href='https:\/\/etherscan.io\/tx\/{tx['hash']}'>{tx['hash'][:10]}...<\/a>\\n\"\n                                    f\"G\u00f6nderen (Balina): <a href='https:\/\/etherscan.io\/address\/{tx['from']}'>{tx['from'][:10]}...<\/a>\\n\"\n                                    f\"Al\u0131c\u0131: <a href='https:\/\/etherscan.io\/address\/{tx['to']}'>{tx['to'][:10]}...<\/a>\\n\"\n                                    f\"Miktar: <b>{tx['value_eth']:.4f} ETH<\/b>\\n\"\n                                    f\"Gas \u00dccreti: {tx['gas_price'] * tx['gas_used'] \/ (10<strong>9 * 10<\/strong>9):.6f} ETH (yakla\u015f\u0131k)\"\n                                )\n                                send_telegram_message(message)\n                                time.sleep(1)\n                    last_processed_block = block_num_to_process\n            else:\n                print(f\"Yeni blok yok. Son blok: {current_block_number}. Bekleniyor...\")\n\n            time.sleep(30)\n        except Exception as e:\n            print(f\"Ana d\u00f6ng\u00fcde beklenmedik bir hata olu\u015ftu: {e}\")\n            time.sleep(60)\n\n# Botu ba\u015flatmak i\u00e7in:\n# if __name__ == \"__main__\":\n#    start_balina_alert_bot()\n  <\/code><\/pre>\n<\/div>\n<p>Bu g\u00fcncellenmi\u015f bot, art\u0131k sadece belirli bir balina c\u00fczdan\u0131ndan yap\u0131lan b\u00fcy\u00fck transferleri izleyecek ve bu olaylar ger\u00e7ekle\u015fti\u011finde bize \u00f6zel bir &#8220;Balina Uyar\u0131s\u0131&#8221; g\u00f6nderecektir. Bu vaka analizi, k\u00fct\u00fcphane kullanmadan do\u011frudan RPC \u00e7a\u011fr\u0131lar\u0131yla bile ne kadar g\u00fc\u00e7l\u00fc ve \u00f6zelle\u015ftirilebilir bir izleme sistemi kurabilece\u011fimizi g\u00f6stermektedir. Bu yakla\u015f\u0131m, sadece balina c\u00fczdanlar\u0131n\u0131 de\u011fil, ayn\u0131 zamanda belirli bir ak\u0131ll\u0131 s\u00f6zle\u015fmenin etkile\u015fimlerini, belirli bir token transferlerini veya likidite havuzu hareketlerini de benzer mant\u0131kla izlemek i\u00e7in geni\u015fletilebilir. \u00d6nemli olan, hangi veriyi nerede arayaca\u011f\u0131n\u0131z\u0131 ve bu veriyi nas\u0131l yorumlayaca\u011f\u0131n\u0131z\u0131 bilmektir.<\/p>\n<h2>Geli\u015fmi\u015f Konular ve Optimizasyon: Botunuzu Daha Ak\u0131ll\u0131 Hale Getirme<\/h2>\n<p>Botumuz art\u0131k \u00e7al\u0131\u015f\u0131yor ve temel uyar\u0131lar\u0131 g\u00f6nderebiliyor. Ancak ger\u00e7ek d\u00fcnya ko\u015fullar\u0131nda, botun performans\u0131n\u0131, g\u00fcvenilirli\u011fini ve yeteneklerini art\u0131rmak i\u00e7in baz\u0131 geli\u015fmi\u015f konular\u0131 ele almam\u0131z gerekir. Bu b\u00f6l\u00fcmde, botumuzu daha sa\u011flam, verimli ve ak\u0131ll\u0131 hale getirecek optimizasyon ve hata y\u00f6netimi stratejilerini inceleyece\u011fiz.<\/p>\n<h3>Performans ve Kaynak Y\u00f6netimi<\/h3>\n<p>Botumuzun s\u00fcrekli \u00e7al\u0131\u015fmas\u0131, \u00f6zellikle y\u00fcksek frekansl\u0131 veri \u00e7ekme i\u015flemlerinde performans ve kaynak y\u00f6netimi kritik hale gelir. \u0130\u015fte dikkat etmemiz gereken baz\u0131 noktalar:<\/p>\n<ul>\n<li><strong>Polling Aral\u0131\u011f\u0131 Optimizasyonu:<\/strong> <code>time.sleep(30)<\/code> ile belirledi\u011fimiz bekleme s\u00fcresi, RPC sa\u011flay\u0131c\u0131n\u0131z\u0131n h\u0131z s\u0131n\u0131rlamalar\u0131 (rate limiting) ve sizin anl\u0131k bildirim ihtiyac\u0131n\u0131za g\u00f6re ayarlanmal\u0131d\u0131r. \u00c7ok s\u0131k kontrol etmek, IP adresinizin engellenmesine veya \u00fccretli plan limitlerinizi a\u015fman\u0131za neden olabilir. \u00c7ok seyrek kontrol etmek ise, f\u0131rsatlar\u0131 ka\u00e7\u0131rman\u0131za yol a\u00e7abilir. Genellikle 5-15 saniye aras\u0131 bir aral\u0131k \u00e7o\u011fu kullan\u0131m durumu i\u00e7in uygun olabilir.<\/li>\n<li><strong>RPC Sa\u011flay\u0131c\u0131 Se\u00e7imi:<\/strong> Infura, Alchemy gibi pop\u00fcler sa\u011flay\u0131c\u0131lar genellikle \u00fccretsiz katmanlarda belirli bir istek limitine sahiptir. Daha y\u00fcksek hacimli i\u015flemler i\u00e7in \u00fccretli planlara ge\u00e7mek veya birden fazla sa\u011flay\u0131c\u0131y\u0131 yedekli olarak kullanmak gerekebilir.<\/li>\n<li><strong>Asenkron Programlama:<\/strong> Python&#8217;\u0131n <code>asyncio<\/code> k\u00fct\u00fcphanesi ve <code>httpx<\/code> gibi asenkron HTTP k\u00fct\u00fcphaneleri, birden fazla RPC iste\u011fini ayn\u0131 anda yapabilme yetene\u011fi sunar. Bu, \u00f6zellikle birden fazla zinciri veya birden fazla adresi ayn\u0131 anda izlerken botunuzun verimini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir. \u00d6rne\u011fin, ayn\u0131 anda hem Ethereum hem de Polygon a\u011f\u0131ndaki son bloklar\u0131 sorgulayabilirsiniz.<\/li>\n<li><strong>Veri Depolama:<\/strong> E\u011fer botunuzun ge\u00e7mi\u015f bloklar\u0131 tekrar tekrar sorgulamas\u0131n\u0131 istemiyorsan\u0131z, i\u015fledi\u011fi son blok numaras\u0131n\u0131 bir dosyaya veya basit bir veritaban\u0131na (SQLite gibi) kaydetmesi iyi bir pratiktir. Bot yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda, kald\u0131\u011f\u0131 yerden devam edebilir.<\/li>\n<\/ul>\n<h3>Hata Y\u00f6netimi ve G\u00fcvenilirlik<\/h3>\n<p>A\u011f kesintileri, RPC sa\u011flay\u0131c\u0131 sorunlar\u0131 veya beklenmedik veri formatlar\u0131 gibi durumlar botunuzun \u00e7al\u0131\u015fmas\u0131n\u0131 aksatabilir. Sa\u011flam bir bot, bu t\u00fcr hatalar\u0131 uygun \u015fekilde y\u00f6netmelidir:<\/p>\n<ul>\n<li><strong>Yeniden Deneme (Retry) Mekanizmalar\u0131:<\/strong> RPC \u00e7a\u011fr\u0131lar\u0131 s\u0131ras\u0131nda a\u011f hatalar\u0131 veya ge\u00e7ici sunucu sorunlar\u0131 ya\u015fanabilir. <code>requests<\/code> k\u00fct\u00fcphanesi ile birlikte <code>requests.adapters.HTTPAdapter<\/code> kullanarak otomatik yeniden deneme mant\u0131\u011f\u0131 ekleyebilirsiniz. \u00d6rne\u011fin, 500 veya 503 HTTP durum kodlar\u0131 al\u0131nd\u0131\u011f\u0131nda birka\u00e7 kez daha deneme yapmak botunuzun dayan\u0131kl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/li>\n<li><strong>Loglama:<\/strong> <code>logging<\/code> mod\u00fcl\u00fc kullanarak botunuzun ne zaman ba\u015flad\u0131\u011f\u0131n\u0131, hangi bloklar\u0131 i\u015fledi\u011fini, hangi hatalarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131 ve hangi uyar\u0131lar\u0131 g\u00f6nderdi\u011fini kaydetmek \u00e7ok \u00f6nemlidir. Bu loglar, sorun giderme ve botun performans\u0131n\u0131 analiz etme a\u00e7\u0131s\u0131ndan paha bi\u00e7ilmezdir. Log seviyelerini (DEBUG, INFO, WARNING, ERROR) kullanarak farkl\u0131 detay seviyelerinde \u00e7\u0131kt\u0131 alabilirsiniz.<\/li>\n<li><strong>Hata Bildirimleri:<\/strong> Kritik hatalar olu\u015ftu\u011funda (\u00f6rne\u011fin RPC ba\u011flant\u0131s\u0131 tamamen kesildi\u011finde), botun size bir e-posta veya ayr\u0131 bir Telegram mesaj\u0131 ile bildirim g\u00f6ndermesi, sorunu h\u0131zl\u0131ca fark etmenizi sa\u011flar.<\/li>\n<li><strong>Parametre Do\u011frulama:<\/strong> RPC yan\u0131tlar\u0131ndan gelen verilerin bekledi\u011finiz formatta olup olmad\u0131\u011f\u0131n\u0131 kontrol edin. \u00d6rne\u011fin, bir i\u015flemde <code>'value'<\/code> alan\u0131 yoksa veya ge\u00e7ersiz bir formatta ise, botunuzun \u00e7\u00f6kmesini \u00f6nlemek i\u00e7in uygun hata i\u015fleme mekanizmalar\u0131 ekleyin.<\/li>\n<\/ul>\n<h3>Ak\u0131ll\u0131 S\u00f6zle\u015fme Etkinliklerini \u0130zleme (Olaylar &#8211; Events)<\/h3>\n<p>\u015eimdiye kadar sadece do\u011frudan ETH transferlerini izledik. Ancak blockchain&#8217;deki i\u015flemlerin b\u00fcy\u00fck bir k\u0131sm\u0131 ak\u0131ll\u0131 s\u00f6zle\u015fme etkile\u015fimleridir ve bu etkile\u015fimler genellikle &#8220;olaylar&#8221; (events) yayar. Olaylar, ak\u0131ll\u0131 s\u00f6zle\u015fmelerin harici uygulamalarla ileti\u015fim kurmas\u0131n\u0131n birincil yoludur ve belirli bir fon transferi, bir token mint edilmesi veya bir y\u00f6neti\u015fim karar\u0131 gibi \u00f6nemli durumu de\u011fi\u015fikliklerini belirtir. Blockchain k\u00fct\u00fcphanesi kullanmadan olaylar\u0131 izlemek biraz daha karma\u015f\u0131kt\u0131r, \u00e7\u00fcnk\u00fc olay verilerini (loglar\u0131) yorumlamak i\u00e7in genellikle s\u00f6zle\u015fmenin ABI&#8217;sine (Application Binary Interface) ihtiya\u00e7 duyulur. Ancak, <code>eth_getLogs<\/code> RPC metodunu kullanarak ham olay verilerini \u00e7ekebiliriz.<\/p>\n<p><code>eth_getLogs<\/code> metodu, belirli bir blok aral\u0131\u011f\u0131nda, belirli bir adres taraf\u0131ndan yay\u0131lan ve belirli &#8220;topic&#8221;lere (konulara) sahip loglar\u0131 sorgulamam\u0131z\u0131 sa\u011flar. Her olay\u0131n benzersiz bir &#8220;topic&#8221; hash&#8217;i vard\u0131r (genellikle olay\u0131n fonksiyon imzas\u0131 SHA3 hash&#8217;i). \u00d6rne\u011fin, ERC-20 token transferleri i\u00e7in <code>Transfer(address from, address to, uint256 value)<\/code> olay\u0131n\u0131n topic hash&#8217;i sabittir.<\/p>\n<div class=\"code-container\">\n<pre><code>\n# \u00d6rnek ERC-20 Transfer event imzas\u0131 hash'i (keccak256(\"Transfer(address,address,uint256)\"))\nTRANSFER_EVENT_TOPIC = \"0xddf252ad1be2c89b69c2b068fc378fa423fbc06593bb298642756aed87445579\"\n\ndef get_contract_events(from_block, to_block, contract_address=None, topics=None):\n    \"\"\"\n    Belirli bir blok aral\u0131\u011f\u0131ndaki ve belirli kriterlere uyan olay loglar\u0131n\u0131 \u00e7eker.\n    \"\"\"\n    params = [{\n        \"fromBlock\": hex(from_block),\n        \"toBlock\": hex(to_block)\n    }]\n    if contract_address:\n        params[0][\"address\"] = contract_address\n    if topics:\n        params[0][\"topics\"] = topics\n\n    response = make_rpc_call(\"eth_getLogs\", params)\n    if response and 'result' in response:\n        return response['result']\n    return None\n\n# \u00d6rnek kullan\u0131m: USDC (0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48) token'\u0131n\u0131n transfer olaylar\u0131n\u0131 izle\n# USDC_CONTRACT_ADDRESS = \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\"\n#\n# latest_num = get_latest_block_number()\n# if latest_num:\n#    # Son 10 bloktaki USDC transfer olaylar\u0131n\u0131 \u00e7ekelim\n#    events = get_contract_events(latest_num - 10, latest_num,\n#                                 contract_address=USDC_CONTRACT_ADDRESS,\n#                                 topics=[TRANSFER_EVENT_TOPIC])\n#    if events:\n#        print(f\"Son 10 blokta {len(events)} adet USDC Transfer olay\u0131 bulundu:\")\n#        for event in events:\n#            print(f\"  Blok: {int(event['blockNumber'], 16)}, Tx Hash: {event['transactionHash'][:10]}...\")\n#            # Olay verilerini yorumlamak i\u00e7in ABI ve daha fazla mant\u0131k gerekir.\n#            # Burada sadece ham log verilerini g\u00f6r\u00fcyoruz.\n#            print(f\"  Topics: {event['topics']}\")\n#            print(f\"  Data: {event['data']}\")\n  <\/code><\/pre>\n<\/div>\n<p><code>get_contract_events<\/code> fonksiyonu, belirli bir blok aral\u0131\u011f\u0131nda, iste\u011fe ba\u011fl\u0131 olarak belirli bir s\u00f6zle\u015fme adresinden ve belirli topic&#8217;lere sahip loglar\u0131 \u00e7eker. ERC-20 <code>Transfer<\/code> olay\u0131 gibi bilinen olaylar i\u00e7in topic hash&#8217;ini do\u011frudan kullanabiliriz. Ancak, <code>event['data']<\/code> ve <code>event['topics']<\/code> alanlar\u0131ndaki ham verileri anlaml\u0131 bilgilere d\u00f6n\u00fc\u015ft\u00fcrmek (\u00f6rne\u011fin g\u00f6nderilen token miktar\u0131n\u0131 veya g\u00f6nderici\/al\u0131c\u0131 adreslerini \u00e7\u0131karmak) genellikle s\u00f6zle\u015fmenin ABI&#8217;sine ve bu verileri ayr\u0131\u015ft\u0131racak \u00f6zel bir koda ihtiya\u00e7 duyar. Blockchain k\u00fct\u00fcphaneleri genellikle bu ayr\u0131\u015ft\u0131rma i\u015flemini otomatik olarak yapar. K\u00fct\u00fcphane kullanmadan bu ayr\u0131\u015ft\u0131rmay\u0131 yapmak m\u00fcmk\u00fcnd\u00fcr ancak daha fazla \u00e7aba gerektirir ve bu makalenin kapsam\u0131n\u0131 a\u015far. Yine de, sadece olay\u0131n varl\u0131\u011f\u0131n\u0131 ve hangi topic&#8217;lere sahip oldu\u011funu bilmek bile bir\u00e7ok uyar\u0131 senaryosu i\u00e7in yeterli olabilir. \u00d6rne\u011fin, bir s\u00f6zle\u015fmenin kritik bir fonksiyonu \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda yay\u0131lan bir olay\u0131n sadece varl\u0131\u011f\u0131n\u0131 tespit ederek bile uyar\u0131 g\u00f6nderebiliriz.<\/p>\n<h2>Sonu\u00e7 ve Gelecek Perspektifleri: Zincir \u00dczeri Botlar\u0131n Potansiyeli<\/h2>\n<p>Bu makale boyunca, Python&#8217;\u0131n temel a\u011f ve veri i\u015fleme yeteneklerini kullanarak, hi\u00e7bir \u00f6zel blockchain k\u00fct\u00fcphanesine ihtiya\u00e7 duymadan nas\u0131l g\u00fc\u00e7l\u00fc bir zincir \u00fczeri uyar\u0131 botu geli\u015ftirebilece\u011fimizi ad\u0131m ad\u0131m \u00f6\u011frendik. RPC ba\u011flant\u0131s\u0131 kurmaktan, blok verilerini \u00e7ekmeye, i\u015flemleri filtrelemeye ve Telegram \u00fczerinden anl\u0131k bildirimler g\u00f6ndermeye kadar t\u00fcm s\u00fcre\u00e7leri detayland\u0131rd\u0131k. Bir balina c\u00fczdan\u0131n\u0131n hareketlerini izleme vaka analiziyle, bu temel prensiplerin ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l uygulanabilece\u011fini g\u00f6sterdik.<\/p>\n<p>K\u00fct\u00fcphanesiz bir yakla\u015f\u0131m benimseyerek, blockchain a\u011flar\u0131n\u0131n temel \u00e7al\u0131\u015fma prensiplerine daha derinlemesine hakim olduk. Bu y\u00f6ntem, botumuz \u00fczerinde tam kontrol sa\u011flamam\u0131za, gereksiz ba\u011f\u0131ml\u0131l\u0131klar\u0131 ortadan kald\u0131rmam\u0131za ve botu daha hafif ve esnek hale getirmemize olanak tan\u0131d\u0131. Ayr\u0131ca, performans optimizasyonlar\u0131, hata y\u00f6netimi stratejileri ve ak\u0131ll\u0131 s\u00f6zle\u015fme olaylar\u0131n\u0131 izleme gibi geli\u015fmi\u015f konular\u0131 ele alarak botumuzun g\u00fcvenilirli\u011fini ve yeteneklerini nas\u0131l art\u0131rabilece\u011fimizi de g\u00f6rd\u00fck.<\/p>\n<p>Zincir \u00fczeri uyar\u0131 botlar\u0131n\u0131n potansiyeli olduk\u00e7a geni\u015ftir. Sadece basit transferleri izlemekle kalmay\u0131p, arbitraj f\u0131rsatlar\u0131n\u0131 tespit etme, belirli bir token&#8217;\u0131n likidite havuzu hareketlerini takip etme, yeni da\u011f\u0131t\u0131lan ak\u0131ll\u0131 s\u00f6zle\u015fmeleri izleme, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 erken fark etme veya hatta rakip projelerin zincir \u00fczeri aktivitelerini analiz etme gibi bir\u00e7ok farkl\u0131 alanda kullan\u0131labilirler. Gelecekte, bu t\u00fcr botlar yapay zeka ve makine \u00f6\u011frenimi algoritmalar\u0131yla entegre edilerek daha karma\u015f\u0131k desenleri tespit edebilir, anormallikleri \u00f6ng\u00f6rebilir ve daha ak\u0131ll\u0131 kararlar almam\u0131za yard\u0131mc\u0131 olabilir. Bu teknoloji, hem bireysel yat\u0131r\u0131mc\u0131lar hem de kurumsal oyuncular i\u00e7in vazge\u00e7ilmez bir ara\u00e7 haline gelmeye devam edecektir. Bu makalede edindi\u011finiz bilgilerle, kendi \u00f6zel ihtiya\u00e7lar\u0131n\u0131za g\u00f6re uyarlanm\u0131\u015f, g\u00fc\u00e7l\u00fc ve otonom blockchain izleme \u00e7\u00f6z\u00fcmleri geli\u015ftirmek i\u00e7in sa\u011flam bir temele sahipsiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<p><strong>1. Neden bir blockchain k\u00fct\u00fcphanesi (\u00f6rne\u011fin <code>web3.py<\/code>) kullanmad\u0131k?<\/strong><\/p>\n<p>Bu makalede bir blockchain k\u00fct\u00fcphanesi kullanmaman\u0131n temel nedenleri esneklik, ba\u011f\u0131ms\u0131zl\u0131k ve \u00f6\u011frenmedir. Do\u011frudan RPC \u00e7a\u011fr\u0131lar\u0131 yaparak, botumuz \u00fczerinde tam kontrol sahibi oluruz, gereksiz ba\u011f\u0131ml\u0131l\u0131klardan ka\u00e7\u0131n\u0131r\u0131z ve blockchain&#8217;in alt seviye ileti\u015fim mekanizmalar\u0131n\u0131 daha derinlemesine anlar\u0131z. Bu yakla\u015f\u0131m, botu daha hafif hale getirebilir ve farkl\u0131 EVM uyumlu zincirlere (Ethereum, Polygon, BSC vb.) daha kolay adapte etme imkan\u0131 sunar.<\/p>\n<p><strong>2. Geli\u015ftirdi\u011fim bot ne kadar g\u00fcvenli? API anahtarlar\u0131m\u0131 nas\u0131l korumal\u0131y\u0131m?<\/strong><\/p>\n<p>Botunuzun g\u00fcvenli\u011fi, \u00f6zellikle API anahtarlar\u0131 ve hassas bilgilerin y\u00f6netimi ile do\u011frudan ili\u015fkilidir. RPC sa\u011flay\u0131c\u0131lar\u0131n\u0131z\u0131n API anahtarlar\u0131n\u0131, Telegram bot token&#8217;\u0131n\u0131z\u0131 ve di\u011fer hassas verileri asla do\u011frudan kod i\u00e7inde (hardcode) saklamamal\u0131s\u0131n\u0131z. Bunun yerine, ortam de\u011fi\u015fkenleri (environment variables) veya bir yap\u0131land\u0131rma dosyas\u0131 (\u00f6rne\u011fin <code>.env<\/code> dosyas\u0131) kullanarak bu bilgileri g\u00fcvenli bir \u015fekilde y\u00f6netmelisiniz. Ayr\u0131ca, botunuzu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131z sunucunun g\u00fcvenli\u011fini sa\u011flamak da \u00f6nemlidir.<\/p>\n<p><strong>3. Bu bot hangi blockchain a\u011flar\u0131n\u0131 destekler?<\/strong><\/p>\n<p>Geli\u015ftirdi\u011fimiz bu bot, Ethereum Sanal Makinesi (EVM) ile uyumlu olan t\u00fcm blockchain a\u011flar\u0131n\u0131 destekler. Bu, Ethereum ana a\u011f\u0131, Binance Smart Chain (BSC), Polygon, Avalanche, Fantom ve di\u011fer bir\u00e7ok EVM uyumlu layer-1 veya layer-2 a\u011f\u0131n\u0131 kapsar. Tek yapman\u0131z gereken, <code>RPC_URL<\/code> de\u011fi\u015fkenini ilgili a\u011f\u0131n RPC endpoint&#8217;i ile de\u011fi\u015ftirmektir. RPC metodlar\u0131 (<code>eth_blockNumber<\/code>, <code>eth_getBlockByNumber<\/code> vb.) bu zincirler aras\u0131nda genellikle ayn\u0131d\u0131r.<\/p>\n<p><strong>4. Botumu nas\u0131l \u00f6l\u00e7eklendirebilirim veya daha fazla c\u00fczdan\u0131 ayn\u0131 anda izleyebilir miyim?<\/strong><\/p>\n<p>Botunuzu \u00f6l\u00e7eklendirmek i\u00e7in birden fazla strateji izleyebilirsiniz. Daha fazla c\u00fczdan\u0131 izlemek i\u00e7in filtreleme fonksiyonunuzu birden fazla adresi kontrol edecek \u015fekilde geni\u015fletebilirsiniz. Performans i\u00e7in, <code>asyncio<\/code> ve <code>httpx<\/code> gibi asenkron k\u00fct\u00fcphaneler kullanarak birden fazla RPC iste\u011fini paralel olarak g\u00f6nderebilirsiniz. Ayr\u0131ca, birden fazla RPC sa\u011flay\u0131c\u0131s\u0131n\u0131 yedekli olarak kullanmak veya kendi node&#8217;unuzu kurarak istek limitlerinden ba\u011f\u0131ms\u0131z olmak da \u00f6l\u00e7eklendirme se\u00e7enekleridir. Daha b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar i\u00e7in, botunuzu Docker konteynerleri i\u00e7inde da\u011f\u0131tmak ve Kubernetes gibi orkestrasyon ara\u00e7lar\u0131yla y\u00f6netmek de d\u00fc\u015f\u00fcnebilirsiniz.<\/p>\n<p><strong>5. Botu bir sunucuda nas\u0131l s\u00fcrekli \u00e7al\u0131\u015f\u0131r durumda tutabilirim?<\/strong><\/p>\n<p>Botunuzu bir sunucuda (\u00f6rne\u011fin bir VPS &#8211; Sanal \u00d6zel Sunucu) s\u00fcrekli \u00e7al\u0131\u015f\u0131r durumda tutmak i\u00e7in birka\u00e7 y\u00f6ntem vard\u0131r. En yayg\u0131n olanlar\u0131 \u015funlard\u0131r:<\/p>\n<ol>\n<li><strong><code>screen<\/code> veya <code>tmux<\/code>:<\/strong> Bu ara\u00e7lar, terminal oturumlar\u0131n\u0131z\u0131 ay\u0131rman\u0131za olanak tan\u0131r, b\u00f6ylece SSH ba\u011flant\u0131n\u0131z kesilse bile botunuz arka planda \u00e7al\u0131\u015fmaya devam eder.<\/li>\n<li><strong><code>nohup<\/code>:<\/strong> <code>nohup python bot.py &<\/code> komutunu kullanarak botunuzu arka planda \u00e7al\u0131\u015ft\u0131rabilir ve oturumunuzu kapatt\u0131\u011f\u0131n\u0131zda bile \u00e7al\u0131\u015fmaya devam etmesini sa\u011flayabilirsiniz.<\/li>\n<li><strong>Sistem servisleri (<code>systemd<\/code>):<\/strong> Linux sistemlerde botunuzu bir <code>systemd<\/code> servisi olarak yap\u0131land\u0131rmak, otomatik ba\u015flatma, yeniden ba\u015flatma ve log y\u00f6netimi gibi geli\u015fmi\u015f \u00f6zellikler sunar. Bu, profesyonel uygulamalar i\u00e7in \u00f6nerilen y\u00f6ntemdir.<\/li>\n<li><strong>Docker:<\/strong> Botunuzu bir Docker konteyneri i\u00e7inde \u00e7al\u0131\u015ft\u0131rmak, ba\u011f\u0131ml\u0131l\u0131klar\u0131 izole eder ve da\u011f\u0131t\u0131m\u0131 kolayla\u015ft\u0131r\u0131r.<\/li>\n<\/ol>\n<p>Her durumda, botunuzun loglar\u0131n\u0131 d\u00fczenli olarak kontrol etmek ve hata durumlar\u0131nda bildirim almay\u0131 sa\u011flamak \u00f6nemlidir.<\/p>\n<p>#Blockchain #Python #Web3 #Otomasyon #Kripto<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/python-on-chain-block-alert-bot\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/python-on-chain-block-alert-bot<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Kripto para piyasalar\u0131nda veya merkeziyetsiz uygulamalar (dApp) d\u00fcnyas\u0131nda ya\u015fanan geli\u015fmeleri anl\u0131k olarak takip etmek, \u00e7o\u011fu zaman manuel y\u00f6ntemlerle m\u00fcmk\u00fcn de\u011fildir.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1403],"tags":[],"class_list":{"0":"post-42045","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-python","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Blockchain K\u00fct\u00fcphanesi Kullanmadan Python ile Zincir \u00dczeri Uyar\u0131 Botu Nas\u0131l Geli\u015ftirilir? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Blockchain K\u00fct\u00fcphanesi Kullanmadan Python ile Zincir \u00dczeri Uyar\u0131 Botu Nas\u0131l Geli\u015ftirilir?\" \/>\n<meta property=\"og:description\" content=\"Kripto para piyasalar\u0131nda veya merkeziyetsiz uygulamalar (dApp) d\u00fcnyas\u0131nda ya\u015fanan geli\u015fmeleri anl\u0131k olarak takip etmek, \u00e7o\u011fu zaman manuel y\u00f6ntemlerle m\u00fcmk\u00fcn de\u011fildir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-24T18:14:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-24T18:14:58+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"36 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Blockchain K\u00fct\u00fcphanesi Kullanmadan Python ile Zincir \u00dczeri Uyar\u0131 Botu Nas\u0131l Geli\u015ftirilir?\",\"datePublished\":\"2026-05-24T18:14:35+00:00\",\"dateModified\":\"2026-05-24T18:14:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/\"},\"wordCount\":5232,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Python\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/\",\"name\":\"Blockchain K\u00fct\u00fcphanesi Kullanmadan Python ile Zincir \u00dczeri Uyar\u0131 Botu Nas\u0131l Geli\u015ftirilir? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-05-24T18:14:35+00:00\",\"dateModified\":\"2026-05-24T18:14:58+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blockchain K\u00fct\u00fcphanesi Kullanmadan Python ile Zincir \u00dczeri Uyar\u0131 Botu Nas\u0131l Geli\u015ftirilir?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Blockchain K\u00fct\u00fcphanesi Kullanmadan Python ile Zincir \u00dczeri Uyar\u0131 Botu Nas\u0131l Geli\u015ftirilir? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/","og_locale":"tr_TR","og_type":"article","og_title":"Blockchain K\u00fct\u00fcphanesi Kullanmadan Python ile Zincir \u00dczeri Uyar\u0131 Botu Nas\u0131l Geli\u015ftirilir?","og_description":"Kripto para piyasalar\u0131nda veya merkeziyetsiz uygulamalar (dApp) d\u00fcnyas\u0131nda ya\u015fanan geli\u015fmeleri anl\u0131k olarak takip etmek, \u00e7o\u011fu zaman manuel y\u00f6ntemlerle m\u00fcmk\u00fcn de\u011fildir.","og_url":"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-05-24T18:14:35+00:00","article_modified_time":"2026-05-24T18:14:58+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"36 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Blockchain K\u00fct\u00fcphanesi Kullanmadan Python ile Zincir \u00dczeri Uyar\u0131 Botu Nas\u0131l Geli\u015ftirilir?","datePublished":"2026-05-24T18:14:35+00:00","dateModified":"2026-05-24T18:14:58+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/"},"wordCount":5232,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Python"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/","url":"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/","name":"Blockchain K\u00fct\u00fcphanesi Kullanmadan Python ile Zincir \u00dczeri Uyar\u0131 Botu Nas\u0131l Geli\u015ftirilir? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-05-24T18:14:35+00:00","dateModified":"2026-05-24T18:14:58+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/blockchain-kutuphanesi-kullanmadan-python-ile-zincir-uzeri-uyari-botu-nasil-gelistirilir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Blockchain K\u00fct\u00fcphanesi Kullanmadan Python ile Zincir \u00dczeri Uyar\u0131 Botu Nas\u0131l Geli\u015ftirilir?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42045","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=42045"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42045\/revisions"}],"predecessor-version":[{"id":42046,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42045\/revisions\/42046"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=42045"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=42045"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=42045"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}