{"id":45169,"date":"2026-10-13T09:13:08","date_gmt":"2026-10-13T06:13:08","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/"},"modified":"2026-10-13T09:13:08","modified_gmt":"2026-10-13T06:13:08","slug":"viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/","title":{"rendered":"Viral Bir Taray\u0131c\u0131 Oyununun Hayran Rehberini GitHub Actions Cron ile Nas\u0131l G\u00fcncel Tutar\u0131m?"},"content":{"rendered":"<h2>Viral Bir Taray\u0131c\u0131 Oyununun Hayran Rehberini GitHub Actions Cron ile Nas\u0131l G\u00fcncel Tutar\u0131m?<\/h2>\n<p>Pop\u00fcler bir taray\u0131c\u0131 oyununun dinamik verilerini otomatik olarak \u00e7ekip, GitHub Actions cron i\u015fleri sayesinde hayran rehberinizi her zaman g\u00fcncel tutman\u0131n pratik yollar\u0131n\u0131 ke\u015ffedin. Bu makale, oyun d\u00fcnyas\u0131n\u0131n h\u0131zla de\u011fi\u015fen dinamiklerine ayak uydurarak, hayran i\u00e7eri\u011finizi manuel m\u00fcdahale olmadan nas\u0131l taze ve do\u011fru tutaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.<\/p>\n<h2>Dijital D\u00fcnyan\u0131n H\u0131zl\u0131 De\u011fi\u015fimi ve G\u00fcncel Kalman\u0131n Zorluklar\u0131 Nelerdir?<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda, \u00f6zellikle online oyunlar ve taray\u0131c\u0131 tabanl\u0131 deneyimler, s\u00fcrekli bir de\u011fi\u015fim ve geli\u015fim i\u00e7indedir. Yeni g\u00fcncellemeler, dengelemeler, karakterler, \u00f6\u011feler veya etkinlikler neredeyse her hafta hatta bazen her g\u00fcn yay\u0131nlanabiliyor. Bu durum, oyun topluluklar\u0131 i\u00e7in vazge\u00e7ilmez olan hayran rehberleri (fan guides), wiki&#8217;ler veya strateji siteleri gibi i\u00e7erik platformlar\u0131n\u0131 y\u00f6neten ki\u015filer i\u00e7in b\u00fcy\u00fck bir zorluk te\u015fkil ediyor. Bir hayran olarak, sevdi\u011finiz oyun hakk\u0131nda en do\u011fru ve g\u00fcncel bilgiyi sunmak istersiniz. Ancak, manuel olarak her yeni yama notunu takip etmek, oyun i\u00e7i verileri kontrol etmek ve ard\u0131ndan rehberinizi g\u00fcncellemek, zaman al\u0131c\u0131, yorucu ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7tir.<\/p>\n<p>D\u00fc\u015f\u00fcnsenize, viral hale gelmi\u015f bir taray\u0131c\u0131 oyununun h\u0131zla b\u00fcy\u00fcyen bir toplulu\u011fu var. Oyuncular, en iyi karakter build&#8217;leri, nadir \u00f6\u011felerin d\u00fc\u015fme oranlar\u0131 veya gizli g\u00f6revlerin \u00e7\u00f6z\u00fcmleri hakk\u0131nda bilgi ar\u0131yor. Sizin haz\u0131rlad\u0131\u011f\u0131n\u0131z rehber, bu bilgiyi sunan ana kaynaklardan biri. Ancak oyun geli\u015ftiricileri yeni bir g\u00fcncelleme yay\u0131nlad\u0131\u011f\u0131nda, \u00f6rne\u011fin bir karakterin yetenek puanlar\u0131 de\u011fi\u015fti\u011finde veya yeni bir zindan eklendi\u011finde, rehberinizdeki bilgiler an\u0131nda eskimi\u015f hale gelir. E\u011fer bu de\u011fi\u015fiklikleri h\u0131zla yans\u0131tamazsan\u0131z, rehberinizin g\u00fcvenilirli\u011fi azal\u0131r, oyuncular ba\u015fka kaynaklara y\u00f6nelir ve eme\u011finizin de\u011feri d\u00fc\u015fer. Bu durum, hem i\u00e7erik \u00fcreticisi i\u00e7in motivasyon kayb\u0131na yol a\u00e7ar hem de topluluk i\u00e7in de\u011ferli bir kayna\u011f\u0131n k\u00f6relmesine neden olur. Bu problemi \u00e7\u00f6zmek i\u00e7in, manuel m\u00fcdahaleyi minimuma indiren, hatta tamamen ortadan kald\u0131ran otomatik bir sisteme ihtiya\u00e7 duyar\u0131z. \u0130\u015fte tam bu noktada, GitHub Actions ve cron i\u015fleri gibi otomasyon ara\u00e7lar\u0131 devreye giriyor.<\/p>\n<p>Otomasyon, sadece zaman ve emekten tasarruf etmekle kalmaz, ayn\u0131 zamanda insan hatas\u0131 riskini de \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r. Bir veriyi manuel olarak kopyalay\u0131p yap\u0131\u015ft\u0131r\u0131rken yap\u0131lan basit bir yaz\u0131m hatas\u0131 bile, binlerce oyuncunun yanl\u0131\u015f bilgiye ula\u015fmas\u0131na neden olabilir. Otomatik sistemler ise, belirlenen kurallar ve algoritmalar dahilinde tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015f\u0131r. Bu makalede, bu t\u00fcr bir otomasyonu nas\u0131l kuraca\u011f\u0131m\u0131z\u0131, viral bir taray\u0131c\u0131 oyununun dinamik verilerini d\u00fczenli aral\u0131klarla nas\u0131l \u00e7ekip i\u015fleyece\u011fimizi ve sonras\u0131nda bu verileri GitHub Actions&#8217;\u0131n zamanlanm\u0131\u015f g\u00f6revleri (cron jobs) arac\u0131l\u0131\u011f\u0131yla hayran rehberinize nas\u0131l entegre edece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz. Amac\u0131m\u0131z, rehberinizin her zaman g\u00fcncel, do\u011fru ve topluluk i\u00e7in paha bi\u00e7ilmez bir kaynak olmas\u0131n\u0131 sa\u011flamakt\u0131r. Bu yolculukta, veri \u00e7ekme tekniklerinden (web scraping), s\u00fcr\u00fcm kontrol sistemlerine (version control systems) ve s\u00fcrekli entegrasyon\/s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) s\u00fcre\u00e7lerine kadar bir\u00e7ok temel teknolojiye de\u011finece\u011fiz. B\u00f6ylece, sadece bir fan rehberini g\u00fcncel tutmay\u0131 de\u011fil, ayn\u0131 zamanda modern yaz\u0131l\u0131m geli\u015ftirme pratiklerinin temel ta\u015flar\u0131n\u0131 da \u00f6\u011frenmi\u015f olacaks\u0131n\u0131z.<\/p>\n<h2>Temel Kavramlar: GitHub Actions, Cron ve Web Kaz\u0131ma Temellerini Anlamak<\/h2>\n<p>Otomatik bir fan rehberi olu\u015fturma yolculu\u011funa \u00e7\u0131kmadan \u00f6nce, kullanaca\u011f\u0131m\u0131z temel ara\u00e7lar\u0131 ve kavramlar\u0131 iyi anlamak \u00f6nemlidir. Bu b\u00f6l\u00fcmde, GitHub Actions&#8217;\u0131n ne oldu\u011funu, cron i\u015flerinin otomasyondaki rol\u00fcn\u00fc ve veri \u00e7ekme y\u00f6ntemlerini (web kaz\u0131ma ve API entegrasyonu) detayl\u0131 bir \u015fekilde ele alaca\u011f\u0131z.<\/p>\n<h3>GitHub Actions Nedir ve Neden Kullanmal\u0131y\u0131z?<\/h3>\n<p>GitHub Actions, GitHub taraf\u0131ndan sunulan, yaz\u0131l\u0131m geli\u015ftirme i\u015f ak\u0131\u015flar\u0131n\u0131z\u0131 otomatikle\u015ftirmeye yarayan bir s\u00fcrekli entegrasyon ve s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) platformudur. Basit\u00e7e ifade etmek gerekirse, kodunuzu bir depoya (repository) her g\u00f6nderdi\u011finizde (push), bir \u00e7ekme iste\u011fi (pull request) a\u00e7t\u0131\u011f\u0131n\u0131zda veya belirli bir zaman aral\u0131\u011f\u0131nda (cron) otomatik olarak \u00e7al\u0131\u015facak g\u00f6revler tan\u0131mlaman\u0131z\u0131 sa\u011flar. Bu g\u00f6revler, kodunuzu test etmek, derlemek, da\u011f\u0131tmak veya bizim senaryomuzda oldu\u011fu gibi veri \u00e7ekmek ve bir web sitesini g\u00fcncellemek olabilir.<\/p>\n<p>GitHub Actions&#8217;\u0131 tercih etmemizin birka\u00e7 \u00f6nemli nedeni var:<\/p>\n<ul>\n<li><strong>Entegrasyon:<\/strong> GitHub ile derinlemesine entegre olmas\u0131 sayesinde, projenizin kod taban\u0131na yak\u0131n bir yerde otomasyonu y\u00f6netebilirsiniz. Bu, i\u015f ak\u0131\u015flar\u0131n\u0131z\u0131n kodunuzla birlikte s\u00fcr\u00fcm kontrol\u00fcne al\u0131nmas\u0131 anlam\u0131na gelir.<\/li>\n<li><strong>YAML Tabanl\u0131 Yap\u0131land\u0131rma:<\/strong> \u0130\u015f ak\u0131\u015flar\u0131, okunmas\u0131 ve yazmas\u0131 kolay YAML dosyalar\u0131yla tan\u0131mlan\u0131r. Bu dosyalar, hangi ad\u0131mlar\u0131n hangi s\u0131rayla \u00e7al\u0131\u015faca\u011f\u0131n\u0131, hangi ortamda (\u00f6rne\u011fin, Ubuntu veya Windows sanal makinesi) \u00e7al\u0131\u015faca\u011f\u0131n\u0131 ve hangi olaylar\u0131n (events) i\u015f ak\u0131\u015f\u0131n\u0131 tetikleyece\u011fini belirtir.<\/li>\n<li><strong>Geni\u015f Eylem K\u00fct\u00fcphanesi:<\/strong> GitHub Marketplace&#8217;te, dosya kopyalamadan bulut hizmetlerine da\u011f\u0131t\u0131ma kadar bir\u00e7ok haz\u0131r eylem (action) bulunur. Bu, karma\u015f\u0131k g\u00f6revleri bile birka\u00e7 sat\u0131r kodla ger\u00e7ekle\u015ftirebilece\u011finiz anlam\u0131na gelir.<\/li>\n<li><strong>\u00dccretsiz Kullan\u0131m:<\/strong> Bireysel geli\u015ftiriciler ve a\u00e7\u0131k kaynak projeleri i\u00e7in belirli limitler dahilinde \u00fccretsiz kullan\u0131m sunar. Bu, projemiz i\u00e7in olduk\u00e7a maliyet etkin bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/li>\n<li><strong>Topluluk Deste\u011fi:<\/strong> Geni\u015f bir geli\u015ftirici toplulu\u011fu sayesinde, kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131z sorunlara h\u0131zl\u0131ca \u00e7\u00f6z\u00fcm bulabilir, \u00f6rnek i\u015f ak\u0131\u015flar\u0131ndan faydalanabilirsiniz.<\/li>\n<\/ul>\n<p>K\u0131sacas\u0131, GitHub Actions, bir projenin ya\u015fam d\u00f6ng\u00fcs\u00fcndeki tekrarlayan g\u00f6revleri otomatikle\u015ftirerek verimlili\u011fi art\u0131ran g\u00fc\u00e7l\u00fc ve esnek bir ara\u00e7t\u0131r. Bizim senaryomuzda, bu platformu kullanarak oyun verilerini d\u00fczenli olarak \u00e7ekip rehberimizi g\u00fcncel tutaca\u011f\u0131z.<\/p>\n<h3>Cron \u0130\u015fleri Ne Anlama Geliyor ve Otomasyonda Nas\u0131l Rol Oynar?<\/h3>\n<p>Cron, Unix benzeri i\u015fletim sistemlerinde zamanlanm\u0131\u015f g\u00f6revleri (scheduled tasks) otomatikle\u015ftirmek i\u00e7in kullan\u0131lan bir yard\u0131mc\u0131 programd\u0131r. Bir &#8220;cron i\u015fi&#8221; (cron job) ise, belirli bir zamanda veya d\u00fczenli aral\u0131klarla otomatik olarak \u00e7al\u0131\u015facak bir komut veya betiktir. Ad\u0131n\u0131, zaman anlam\u0131na gelen &#8220;chronos&#8221; kelimesinden al\u0131r.<\/p>\n<p>Cron i\u015fleri, otomasyon d\u00fcnyas\u0131n\u0131n temel ta\u015flar\u0131ndan biridir ve \u00e7ok \u00e7e\u015fitli senaryolarda kullan\u0131l\u0131r:<\/p>\n<ul>\n<li>G\u00fcnl\u00fck yedeklemeler almak.<\/li>\n<li>Sistem g\u00fcnl\u00fck dosyalar\u0131n\u0131 (log files) temizlemek.<\/li>\n<li>Veritaban\u0131 bak\u0131m\u0131 yapmak.<\/li>\n<li>Belirli aral\u0131klarla harici bir kaynaktan veri \u00e7ekmek.<\/li>\n<\/ul>\n<p>Bizim durumumuzda, GitHub Actions&#8217;\u0131 bir cron i\u015fi gibi kullanarak, belirli bir taray\u0131c\u0131 oyununun web sitesinden veya API&#8217;sinden d\u00fczenli aral\u0131klarla veri \u00e7ekece\u011fiz. \u00d6rne\u011fin, her g\u00fcn sabah 3&#8217;te veya her 6 saatte bir bu i\u015flemi otomatik olarak tetikleyebiliriz. Cron s\u00f6zdizimi, be\u015f veya alt\u0131 y\u0131ld\u0131z i\u015faretinden olu\u015fan bir dizi ile \u00e7al\u0131\u015f\u0131r, her bir y\u0131ld\u0131z bir zaman birimini temsil eder:<\/p>\n<pre><code>\n* * * * *\n| | | | |\n| | | | ----- Haftan\u0131n g\u00fcn\u00fc (0 - 7) (Pazar hem 0 hem 7 olabilir)\n| | | ------- Ay (1 - 12)\n| | --------- Ay\u0131n g\u00fcn\u00fc (1 - 31)\n| ----------- Saat (0 - 23)\n------------- Dakika (0 - 59)\n<\/code><\/pre>\n<p>\u00d6rne\u011fin, &#8220;her g\u00fcn saat 03:00&#8217;te&#8221; anlam\u0131na gelen cron ifadesi <code>0 3 * * *<\/code> \u015feklindedir. Bu esneklik sayesinde, veri \u00e7ekme ve g\u00fcncelleme i\u015fleminizi oyunun g\u00fcncelleme s\u0131kl\u0131\u011f\u0131na veya kendi ihtiya\u00e7lar\u0131n\u0131za g\u00f6re ayarlayabilirsiniz. GitHub Actions, bu cron s\u00f6zdizimini do\u011frudan destekleyerek zamanlanm\u0131\u015f i\u015f ak\u0131\u015flar\u0131 olu\u015fturmam\u0131za olanak tan\u0131r.<\/p>\n<h3>Web Kaz\u0131ma (Web Scraping) ve API Entegrasyonu: Veriye Eri\u015fim Y\u00f6ntemleri<\/h3>\n<p>Hayran rehberimizi g\u00fcncel tutmak i\u00e7in oyun verilerine eri\u015fmemiz gerekiyor. Bu eri\u015fimi sa\u011flaman\u0131n ba\u015fl\u0131ca iki yolu vard\u0131r: Web kaz\u0131ma ve API entegrasyonu.<\/p>\n<h4>Web Kaz\u0131ma (Web Scraping)<\/h4>\n<p>Web kaz\u0131ma, bir web sitesinden otomatik olarak veri \u00e7ekme i\u015flemidir. Bu y\u00f6ntem genellikle, bir web sitesinin resmi bir uygulama programlama aray\u00fcz\u00fc (API) sa\u011flamad\u0131\u011f\u0131 durumlarda kullan\u0131l\u0131r. Web kaz\u0131y\u0131c\u0131lar (web scrapers), web sayfalar\u0131n\u0131n HTML i\u00e7eri\u011fini analiz eder, belirli desenleri veya etiketleri arar ve bu etiketler i\u00e7indeki verileri \u00e7\u0131kar\u0131r. \u00d6rne\u011fin, bir oyunun web sitesindeki \u00f6\u011fe tablosundaki adlar\u0131, a\u00e7\u0131klamalar\u0131 ve istatistikleri \u00e7ekmek i\u00e7in web kaz\u0131ma kullan\u0131labilir.<\/p>\n<p>Web kaz\u0131man\u0131n avantajlar\u0131:<\/p>\n<ul>\n<li>API&#8217;si olmayan sitelerden veri \u00e7ekme imkan\u0131 sunar.<\/li>\n<li>\u00c7ok \u00e7e\u015fitli web sitelerinden veri toplanabilir.<\/li>\n<\/ul>\n<p>Dezavantajlar\u0131 ve dikkat edilmesi gerekenler:<\/p>\n<ul>\n<li>Web sitesinin HTML yap\u0131s\u0131 de\u011fi\u015fti\u011finde kaz\u0131y\u0131c\u0131 bozulabilir.<\/li>\n<li>Yo\u011fun istekler siteye y\u00fck bindirebilir ve IP adresinizin engellenmesine neden olabilir.<\/li>\n<li>Yasal ve etik boyutlar\u0131 vard\u0131r. Her zaman sitenin <code>robots.txt<\/code> dosyas\u0131n\u0131 kontrol etmeli ve kullan\u0131m ko\u015fullar\u0131n\u0131 okumal\u0131s\u0131n\u0131z. Ticari ama\u00e7 g\u00fctmeden, siteye zarar vermeden ve herkese a\u00e7\u0131k verileri \u00e7ekmek genellikle daha az risklidir.<\/li>\n<\/ul>\n<p>Python&#8217;da <code>requests<\/code> ve <code>BeautifulSoup<\/code> gibi k\u00fct\u00fcphaneler web kaz\u0131ma i\u00e7in olduk\u00e7a pop\u00fclerdir.<\/p>\n<h4>API Entegrasyonu<\/h4>\n<p>API (Application Programming Interface), iki yaz\u0131l\u0131m sisteminin birbiriyle ileti\u015fim kurmas\u0131n\u0131 sa\u011flayan bir dizi kural ve protokoller b\u00fct\u00fcn\u00fcd\u00fcr. E\u011fer bir oyun geli\u015ftiricisi, oyun verilerine programatik eri\u015fim sa\u011flayan bir API sunuyorsa, bu, veri \u00e7ekmek i\u00e7in en tercih edilen ve en g\u00fcvenilir y\u00f6ntemdir. API&#8217;ler genellikle yap\u0131land\u0131r\u0131lm\u0131\u015f veriler (JSON veya XML format\u0131nda) sunar ve web kaz\u0131maya g\u00f6re daha stabil ve daha az hataya a\u00e7\u0131kt\u0131r.<\/p>\n<p>API entegrasyonunun avantajlar\u0131:<\/p>\n<ul>\n<li>Veri \u00e7ekme i\u015flemi daha h\u0131zl\u0131 ve g\u00fcvenilirdir.<\/li>\n<li>Veri format\u0131 genellikle tutarl\u0131d\u0131r ve i\u015flenmesi daha kolayd\u0131r.<\/li>\n<li>Yasal ve etik a\u00e7\u0131dan daha az sorunludur, \u00e7\u00fcnk\u00fc geli\u015ftirici taraf\u0131ndan veri eri\u015fimi i\u00e7in tasarlanm\u0131\u015ft\u0131r.<\/li>\n<\/ul>\n<p>Dezavantajlar\u0131:<\/p>\n<ul>\n<li>Her oyunun veya web sitesinin bir API&#8217;si olmayabilir.<\/li>\n<li>API&#8217;ler kullan\u0131m limitleri (rate limits) veya kimlik do\u011frulama (authentication) gerektirebilir.<\/li>\n<\/ul>\n<p>Bizim senaryomuzda, \u00f6ncelikle oyunun bir API&#8217;si olup olmad\u0131\u011f\u0131n\u0131 kontrol etmeliyiz. E\u011fer yoksa, web kaz\u0131ma y\u00f6ntemine ba\u015fvuraca\u011f\u0131z. Her iki durumda da, Python gibi g\u00fc\u00e7l\u00fc bir programlama dili, bu verileri \u00e7ekmek ve i\u015flemek i\u00e7in ideal bir ara\u00e7 olacakt\u0131r.<\/p>\n<h2>Uygulamal\u0131 K\u0131s\u0131m: Hayran Rehberini Otomatik G\u00fcncelleme Ad\u0131m Ad\u0131m Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>\u015eimdi teorik bilgileri prati\u011fe d\u00f6kelim ve viral bir taray\u0131c\u0131 oyununun hayran rehberini otomatik olarak g\u00fcncelleyecek sistemi ad\u0131m ad\u0131m nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 inceleyelim. Bu b\u00f6l\u00fcmde, veri kayna\u011f\u0131n\u0131 belirlemekten, Python ile bir veri \u00e7ekme beti\u011fi olu\u015fturmaya ve son olarak GitHub Actions i\u015f ak\u0131\u015f\u0131n\u0131 yap\u0131land\u0131rmaya kadar t\u00fcm s\u00fcreci ele alaca\u011f\u0131z.<\/p>\n<h3>Veri Kayna\u011f\u0131n\u0131 Belirleme ve Analiz Etme: Nereden Ba\u015flamal\u0131y\u0131z?<\/h3>\n<p>Her otomasyon projesinde oldu\u011fu gibi, ilk ad\u0131m veri kayna\u011f\u0131m\u0131z\u0131 do\u011fru bir \u015fekilde belirlemek ve anlamakt\u0131r. Hayran rehberimizi g\u00fcncel tutmak istedi\u011fimiz oyunun hangi verilerini \u00e7ekmek istiyoruz? Bu veriler nerede bulunuyor? Bu sorular\u0131n yan\u0131tlar\u0131n\u0131 bulmak, projemizin temelini olu\u015fturur.<\/p>\n<p>\u00d6ncelikle, hangi t\u00fcr bilgilerin rehberiniz i\u00e7in kritik oldu\u011funu d\u00fc\u015f\u00fcnmelisiniz. \u00d6rne\u011fin:<\/p>\n<ul>\n<li><strong>\u00d6\u011fe Listeleri:<\/strong> Oyun i\u00e7i e\u015fyalar\u0131n adlar\u0131, a\u00e7\u0131klamalar\u0131, istatistikleri, nadirli\u011fi.<\/li>\n<li><strong>Karakter\/S\u0131n\u0131f Bilgileri:<\/strong> Yetenekler, istatistikler, seviye atlama gereksinimleri.<\/li>\n<li><strong>Canavar\/D\u00fc\u015fman Bilgileri:<\/strong> Sa\u011fl\u0131k, sald\u0131r\u0131, d\u00fc\u015f\u00fcrd\u00fckleri e\u015fyalar.<\/li>\n<li><strong>G\u00f6revler:<\/strong> G\u00f6rev adlar\u0131, \u00f6d\u00fcller, gereksinimler.<\/li>\n<li><strong>Yama Notlar\u0131\/Haberler:<\/strong> Oyunun resmi blogu veya forumlar\u0131ndaki duyurular.<\/li>\n<\/ul>\n<p>Bu verilerin nerede bulundu\u011funu tespit etmek i\u00e7in oyunun resmi web sitesini, resmi forumlar\u0131n\u0131, oyun i\u00e7i wiki&#8217;lerini veya varsa geli\u015ftirici dok\u00fcmantasyonunu ara\u015ft\u0131rmal\u0131s\u0131n\u0131z. \u0130deal senaryo, oyunun bir API (Uygulama Programlama Aray\u00fcz\u00fc) sunmas\u0131d\u0131r. E\u011fer bir API varsa, bu genellikle en g\u00fcvenilir ve yap\u0131land\u0131r\u0131lm\u0131\u015f veri kayna\u011f\u0131 olacakt\u0131r. API dok\u00fcmantasyonunu inceleyerek hangi u\u00e7 noktalardan (endpoints) hangi verilere eri\u015febilece\u011finizi \u00f6\u011frenirsiniz.<\/p>\n<p>E\u011fer bir API yoksa veya API&#8217;nin sundu\u011fu veriler rehberiniz i\u00e7in yeterli de\u011filse, web kaz\u0131ma (web scraping) yoluna ba\u015fvurman\u0131z gerekecektir. Bu durumda, oyunun web sitesindeki ilgili sayfalar\u0131 (\u00f6rne\u011fin, &#8220;\u00d6\u011feler&#8221; sayfas\u0131, &#8220;Karakterler&#8221; sayfas\u0131) dikkatlice incelemelisiniz. Taray\u0131c\u0131n\u0131z\u0131n geli\u015ftirici ara\u00e7lar\u0131n\u0131 (Developer Tools) kullanarak sayfan\u0131n HTML yap\u0131s\u0131n\u0131 analiz etmek, hangi verilerin hangi HTML etiketleri i\u00e7inde yer ald\u0131\u011f\u0131n\u0131 anlaman\u0131za yard\u0131mc\u0131 olacakt\u0131r. \u00d6rne\u011fin, \u00f6\u011fe listeleri genellikle <code>&lt;table&gt;<\/code> veya <code>&lt;div&gt;<\/code> elementleri i\u00e7inde belirli s\u0131n\u0131flar (classes) veya kimlikler (IDs) ile d\u00fczenlenmi\u015f olabilir. Bu yap\u0131sal bilgileri not almak, veri \u00e7ekme beti\u011finizi yazarken size yol g\u00f6sterecektir.<\/p>\n<p>\u00d6rne\u011fin, &#8220;Fantastik Diyarlar&#8221; adl\u0131 viral bir taray\u0131c\u0131 oyununun web sitesindeki \u00f6\u011fe listesini \u00e7ekmek istedi\u011fimizi varsayal\u0131m. Sayfay\u0131 inceledi\u011fimizde, \u00f6\u011felerin bir HTML tablosu i\u00e7inde, her \u00f6\u011fenin ad\u0131n\u0131n ilk s\u00fctunda (<code>&lt;td&gt;<\/code>) ve a\u00e7\u0131klamas\u0131n\u0131n ikinci s\u00fctunda yer ald\u0131\u011f\u0131n\u0131 g\u00f6rebiliriz. Bu tabloya <code>class=&quot;game-items&quot;<\/code> gibi bir s\u0131n\u0131f verilmi\u015f olabilir. Bu t\u00fcr detaylar\u0131 belirlemek, bir sonraki ad\u0131mda yazaca\u011f\u0131m\u0131z Python beti\u011fi i\u00e7in hayati \u00f6nem ta\u015f\u0131r.<\/p>\n<h3>Veri \u00c7ekme Mekanizmas\u0131n\u0131 Olu\u015fturma: Python ile Basit Bir Web Kaz\u0131y\u0131c\u0131<\/h3>\n<p>Veri kayna\u011f\u0131m\u0131z\u0131 belirledikten sonra, s\u0131ra bu verileri otomatik olarak \u00e7ekecek bir mekanizma olu\u015fturmaya gelir. Python, bu t\u00fcr g\u00f6revler i\u00e7in olduk\u00e7a g\u00fc\u00e7l\u00fc ve kullan\u0131c\u0131 dostu k\u00fct\u00fcphanelere sahip oldu\u011fu i\u00e7in ideal bir se\u00e7imdir. Bu b\u00f6l\u00fcmde, Python kullanarak basit bir web kaz\u0131y\u0131c\u0131 beti\u011fi nas\u0131l yazaca\u011f\u0131m\u0131z\u0131 g\u00f6sterece\u011fiz.<\/p>\n<p>\u00d6rnek senaryomuzda, &#8220;Fantastik Diyarlar&#8221; adl\u0131 taray\u0131c\u0131 oyununun web sitesindeki bir sayfadan \u00f6\u011fe adlar\u0131n\u0131 ve a\u00e7\u0131klamalar\u0131n\u0131 \u00e7ekece\u011fiz. Bu verileri daha sonra JSON format\u0131nda bir dosyaya kaydedece\u011fiz. Bu i\u015flem i\u00e7in <code>requests<\/code> k\u00fct\u00fcphanesini (HTTP istekleri yapmak i\u00e7in) ve <code>BeautifulSoup4<\/code> k\u00fct\u00fcphanesini (HTML i\u00e7eri\u011fini ayr\u0131\u015ft\u0131rmak i\u00e7in) kullanaca\u011f\u0131z. \u00d6ncelikle bu k\u00fct\u00fcphaneleri y\u00fcklemeniz gerekebilir:<\/p>\n<pre><code class=\"language-bash\">\npip install requests beautifulsoup4\n<\/code><\/pre>\n<p>\u015eimdi, veri \u00e7ekme beti\u011fimizi yazal\u0131m. Bu beti\u011fi projenizin k\u00f6k dizininde <code>src\/data_fetcher.py<\/code> olarak kaydedebilirsiniz:<\/p>\n<div class=\"code-container\">\n<pre><code class=\"language-python\">\nimport requests\nfrom bs4 import BeautifulSoup\nimport json\nimport os\n\ndef fetch_game_items(url):\n    \"\"\"\n    Belirtilen URL'den oyun \u00f6\u011felerini \u00e7eker.\n    \u00d6rnek olarak, bir HTML tablosundan \u00f6\u011fe adlar\u0131n\u0131 ve a\u00e7\u0131klamalar\u0131n\u0131 ayr\u0131\u015ft\u0131r\u0131r.\n    \"\"\"\n    try:\n        response = requests.get(url, timeout=10) # 10 saniye zaman a\u015f\u0131m\u0131\n        response.raise_for_status() # HTTP hatalar\u0131n\u0131 kontrol et\n\n        soup = BeautifulSoup(response.text, 'html.parser')\n        \n        items = []\n        # Web sitesindeki \u00f6\u011fe tablosunun CSS s\u0131n\u0131f\u0131n\u0131 veya ID'sini buraya yaz\u0131n\n        # \u00d6rnek: &lt;table class=\"game-items\"&gt;\n        item_table = soup.find('table', class_='game-items') \n\n        if item_table:\n            # Tablonun ilk sat\u0131r\u0131 genellikle ba\u015fl\u0131k sat\u0131r\u0131d\u0131r, bu y\u00fczden onu atl\u0131yoruz.\n            for row in item_table.find_all('tr')[1:]: \n                cols = row.find_all('td')\n                if len(cols) >= 2: # En az iki s\u00fctun (ad ve a\u00e7\u0131klama) olmal\u0131\n                    item_name = cols[0].get_text(strip=True) # Bo\u015fluklar\u0131 temizle\n                    item_desc = cols[1].get_text(strip=True)\n                    items.append({'name': item_name, 'description': item_desc})\n        else:\n            print(f\"Uyar\u0131: '{url}' adresinde 'game-items' s\u0131n\u0131f\u0131na sahip tablo bulunamad\u0131.\")\n        \n        return items\n\n    except requests.exceptions.RequestException as e:\n        print(f\"HTTP iste\u011fi s\u0131ras\u0131nda bir hata olu\u015ftu: {e}\")\n        return []\n    except Exception as e:\n        print(f\"Veri \u00e7ekme veya ayr\u0131\u015ft\u0131rma s\u0131ras\u0131nda bir hata olu\u015ftu: {e}\")\n        return []\n\ndef save_data_to_json(data, filename='game_items.json'):\n    \"\"\"\n    \u00c7ekilen veriyi JSON format\u0131nda bir dosyaya kaydeder.\n    \"\"\"\n    output_dir = 'data' # Verilerin kaydedilece\u011fi klas\u00f6r\n    os.makedirs(output_dir, exist_ok=True) # Klas\u00f6r\u00fc olu\u015ftur (varsa atla)\n    filepath = os.path.join(output_dir, filename)\n\n    try:\n        with open(filepath, 'w', encoding='utf-8') as f:\n            json.dump(data, f, ensure_ascii=False, indent=4)\n        print(f\"Veriler '{filepath}' dosyas\u0131na ba\u015far\u0131yla kaydedildi.\")\n    except IOError as e:\n        print(f\"Dosyaya yazma hatas\u0131: {e}\")\n\nif __name__ == \"__main__\":\n    # Buraya oyunun ilgili URL'sini yaz\u0131n. Bu bir \u00f6rnek URL'dir.\n    game_url = \"https:\/\/example.com\/fantastik-diyarlar\/items\" \n    \n    print(f\"'{game_url}' adresinden veri \u00e7ekiliyor...\")\n    fetched_data = fetch_game_items(game_url)\n    \n    if fetched_data:\n        save_data_to_json(fetched_data)\n    else:\n        print(\"Veri \u00e7ekme i\u015flemi ba\u015far\u0131s\u0131z oldu veya hi\u00e7 veri bulunamad\u0131.\")\n  <\/code><\/pre>\n<\/div>\n<p>Bu betik, belirtilen URL&#8217;den HTML i\u00e7eri\u011fini \u00e7eker, <code>BeautifulSoup<\/code> kullanarak <code>game-items<\/code> s\u0131n\u0131f\u0131na sahip bir tablo arar ve bu tablodaki her sat\u0131rdan \u00f6\u011fe ad\u0131n\u0131 ve a\u00e7\u0131klamas\u0131n\u0131 \u00e7\u0131kar\u0131r. Son olarak, \u00e7ekilen verileri <code>data\/game_items.json<\/code> ad\u0131nda bir JSON dosyas\u0131na kaydeder. Hata y\u00f6netimi (<code>try-except<\/code> bloklar\u0131) ekleyerek, a\u011f sorunlar\u0131 veya ayr\u0131\u015ft\u0131rma hatalar\u0131 gibi beklenmedik durumlar\u0131 da ele al\u0131yoruz. Ayr\u0131ca, <code>os.makedirs(output_dir, exist_ok=True)<\/code> sat\u0131r\u0131 ile verilerin kaydedilece\u011fi <code>data<\/code> klas\u00f6r\u00fcn\u00fc otomatik olarak olu\u015fturuyoruz. Bu, GitHub Actions ortam\u0131nda dosya sistemini d\u00fczenli tutmak i\u00e7in \u00f6nemlidir.<\/p>\n<p>Bu JSON dosyas\u0131n\u0131 daha sonra statik site olu\u015fturucunuzun (\u00f6rne\u011fin Jekyll, Hugo veya Next.js) okuyabilece\u011fi bir formata d\u00f6n\u00fc\u015ft\u00fcrebilir veya do\u011frudan Markdown dosyalar\u0131 olu\u015fturmak i\u00e7in kullanabilirsiniz. \u00d6rne\u011fin, her bir \u00f6\u011fe i\u00e7in ayr\u0131 bir Markdown dosyas\u0131 olu\u015fturarak rehberinizi dinamik hale getirebilirsiniz. Bu, rehberinizin i\u00e7eri\u011fini otomatik olarak olu\u015fturman\u0131n ilk ad\u0131m\u0131d\u0131r.<\/p>\n<h3>GitHub Actions \u0130\u015f Ak\u0131\u015f\u0131n\u0131 Yap\u0131land\u0131rma: Cron Tetikleyicisi Nas\u0131l Ayarlan\u0131r?<\/h3>\n<p>Veri \u00e7ekme beti\u011fimiz haz\u0131r oldu\u011funa g\u00f6re, \u015fimdi bu beti\u011fi d\u00fczenli aral\u0131klarla \u00e7al\u0131\u015ft\u0131racak GitHub Actions i\u015f ak\u0131\u015f\u0131n\u0131 (workflow) yap\u0131land\u0131ral\u0131m. GitHub Actions i\u015f ak\u0131\u015flar\u0131, projenizin k\u00f6k dizinindeki <code>.github\/workflows\/<\/code> klas\u00f6r\u00fcnde YAML dosyalar\u0131 olarak tan\u0131mlan\u0131r. Bu dosyalar, i\u015f ak\u0131\u015f\u0131n\u0131z\u0131n ad\u0131n\u0131, ne zaman tetiklenece\u011fini, hangi ad\u0131mlar\u0131 i\u00e7erece\u011fini ve hangi ortamda \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtir.<\/p>\n<p>Projenizin k\u00f6k dizininde <code>.github\/workflows\/sync.yml<\/code> ad\u0131nda yeni bir dosya olu\u015fturun ve a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyin:<\/p>\n<div class=\"code-container\">\n<pre><code class=\"language-yaml\">\nname: Oyun Rehberi Senkronizasyonu # \u0130\u015f ak\u0131\u015f\u0131n\u0131n ad\u0131\n\non:\n  schedule:\n    # Bu cron ifadesi, i\u015f ak\u0131\u015f\u0131n\u0131 her g\u00fcn saat 03:00'te UTC zaman diliminde \u00e7al\u0131\u015ft\u0131r\u0131r.\n    # Kendi ihtiyac\u0131n\u0131za g\u00f6re bu de\u011feri de\u011fi\u015ftirebilirsiniz.\n    # \u00d6rne\u011fin, '0 *\/6 * * *' her 6 saatte bir \u00e7al\u0131\u015ft\u0131r\u0131r.\n    - cron: '0 3 * * *' \n  workflow_dispatch: # Bu sat\u0131r, i\u015f ak\u0131\u015f\u0131n\u0131 GitHub aray\u00fcz\u00fcnden manuel olarak tetiklemenizi sa\u011flar.\n\njobs:\n  sync-guide: # Tan\u0131mlad\u0131\u011f\u0131m\u0131z tek i\u015fin ad\u0131\n    runs-on: ubuntu-latest # \u0130\u015fin \u00e7al\u0131\u015faca\u011f\u0131 i\u015fletim sistemi (Ubuntu'nun en son s\u00fcr\u00fcm\u00fc)\n    steps:\n      - name: Depoyu Kopyala # Ad\u0131m 1: GitHub deposunu Actions ortam\u0131na kopyala\n        uses: actions\/checkout@v4 # GitHub'\u0131n haz\u0131r checkout eylemini kullan\n\n      - name: Python Ortam\u0131n\u0131 Kur # Ad\u0131m 2: Python ortam\u0131n\u0131 ayarla\n        uses: actions\/setup-python@v5 # GitHub'\u0131n haz\u0131r setup-python eylemini kullan\n        with:\n          python-version: '3.x' # Kullanmak istedi\u011finiz Python s\u00fcr\u00fcm\u00fcn\u00fc belirtin (\u00f6rn: '3.9' veya '3.10')\n\n      - name: Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00fckle # Ad\u0131m 3: Python k\u00fct\u00fcphanelerini y\u00fckle\n        run: |\n          python -m pip install --upgrade pip # pip'i g\u00fcncelle\n          pip install requests beautifulsoup4 # Veri \u00e7ekme i\u00e7in gerekli k\u00fct\u00fcphaneleri y\u00fckle\n\n      - name: Veriyi \u00c7ek ve G\u00fcncelle # Ad\u0131m 4: Kendi veri \u00e7ekme beti\u011fimizi \u00e7al\u0131\u015ft\u0131r\n        run: |\n          python src\/data_fetcher.py # Beti\u011finizin do\u011fru yolunu belirtti\u011finizden emin olun\n\n      - name: De\u011fi\u015fiklikleri Kontrol Et # Ad\u0131m 5: Depoda herhangi bir de\u011fi\u015fiklik olup olmad\u0131\u011f\u0131n\u0131 kontrol et\n        id: git_status # Bu ad\u0131ma bir ID vererek \u00e7\u0131kt\u0131s\u0131na eri\u015febiliriz\n        run: |\n          git config user.name \"GitHub Actions Bot\" # Git kullan\u0131c\u0131 ad\u0131n\u0131 ayarla\n          git config user.email \"actions@github.com\" # Git e-posta adresini ayarla\n          git add . # T\u00fcm de\u011fi\u015fiklikleri sahneye ekle\n          # E\u011fer sahnelenmi\u015f de\u011fi\u015fiklikler varsa, 'changes_detected' \u00e7\u0131kt\u0131s\u0131n\u0131 true yap\n          git diff --cached --exit-code || echo \"changes_detected=true\" >> $GITHUB_OUTPUT\n\n      - name: De\u011fi\u015fiklikleri Kaydet ve G\u00f6nder (Commit & Push) # Ad\u0131m 6: E\u011fer de\u011fi\u015fiklik varsa, commit et ve depoya g\u00f6nder\n        if: steps.git_status.outputs.changes_detected == 'true' # Sadece de\u011fi\u015fiklik varsa bu ad\u0131m\u0131 \u00e7al\u0131\u015ft\u0131r\n        run: |\n          git commit -m \"Otomatik rehber g\u00fcncellemesi: $(date +'%Y-%m-%d %H:%M')\" # Anlaml\u0131 bir commit mesaj\u0131\n          git push # De\u011fi\u015fiklikleri uzak depoya g\u00f6nder\n          <\/code><\/pre>\n<\/div>\n<p>Bu YAML dosyas\u0131, i\u015f ak\u0131\u015f\u0131n\u0131z\u0131n nas\u0131l \u00e7al\u0131\u015faca\u011f\u0131n\u0131 tan\u0131mlar:<\/p>\n<ul>\n<li><code>name<\/code>: \u0130\u015f ak\u0131\u015f\u0131na okunabilir bir isim verir.<\/li>\n<li><code>on<\/code>: \u0130\u015f ak\u0131\u015f\u0131n\u0131n ne zaman tetiklenece\u011fini belirler. Burada <code>schedule<\/code> (cron i\u015fi) ve <code>workflow_dispatch<\/code> (manuel tetikleme) kullan\u0131yoruz.<\/li>\n<li><code>jobs<\/code>: \u0130\u015f ak\u0131\u015f\u0131n\u0131n i\u00e7erece\u011fi bir veya daha fazla i\u015fi tan\u0131mlar. Bizim senaryomuzda <code>sync-guide<\/code> ad\u0131nda tek bir i\u015f var.<\/li>\n<li><code>runs-on<\/code>: \u0130\u015fin \u00e7al\u0131\u015faca\u011f\u0131 i\u015fletim sistemini belirtir (\u00f6rne\u011fin, <code>ubuntu-latest<\/code>).<\/li>\n<li><code>steps<\/code>: \u0130\u015fin s\u0131rayla ger\u00e7ekle\u015ftirece\u011fi ad\u0131mlar\u0131 tan\u0131mlar.\n<ul>\n<li><strong>Depoyu Kopyala:<\/strong> <code>actions\/checkout@v4<\/code> eylemi, projenizin kodunu GitHub Actions sanal makinesine kopyalar.<\/li>\n<li><strong>Python Ortam\u0131n\u0131 Kur:<\/strong> <code>actions\/setup-python@v5<\/code> eylemi, belirtilen Python s\u00fcr\u00fcm\u00fcn\u00fc kurar.<\/li>\n<li><strong>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00fckle:<\/strong> Python beti\u011fimizin ihtiya\u00e7 duydu\u011fu <code>requests<\/code> ve <code>beautifulsoup4<\/code> k\u00fct\u00fcphanelerini y\u00fckler.<\/li>\n<li><strong>Veriyi \u00c7ek ve G\u00fcncelle:<\/strong> Kendi <code>src\/data_fetcher.py<\/code> beti\u011fimizi \u00e7al\u0131\u015ft\u0131r\u0131r. Bu betik, oyun verilerini \u00e7eker ve <code>data\/game_items.json<\/code> dosyas\u0131n\u0131 olu\u015fturur\/g\u00fcnceller.<\/li>\n<li><strong>De\u011fi\u015fiklikleri Kontrol Et:<\/strong> Bu kritik ad\u0131m, veri \u00e7ekme i\u015flemi sonucunda depoda bir de\u011fi\u015fiklik olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. E\u011fer <code>data\/game_items.json<\/code> dosyas\u0131 de\u011fi\u015ftiyse, bu ad\u0131m\u0131n \u00e7\u0131kt\u0131s\u0131 (<code>changes_detected<\/code>) <code>true<\/code> olur.<\/li>\n<li><strong>De\u011fi\u015fiklikleri Kaydet ve G\u00f6nder (Commit &#038; Push):<\/strong> Yaln\u0131zca <code>changes_detected<\/code> <code>true<\/code> ise (yani veri de\u011fi\u015ftiyse), bu ad\u0131m \u00e7al\u0131\u015f\u0131r. \u00c7ekilen verideki de\u011fi\u015fiklikleri bir Git commit&#8217;i olarak kaydeder ve bu commit&#8217;i GitHub deposuna geri g\u00f6nderir. Bu sayede, rehberinizdeki veriler otomatik olarak g\u00fcncellenmi\u015f olur.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Bu i\u015f ak\u0131\u015f\u0131n\u0131 deponuza y\u00fckledikten sonra (<code>git push<\/code>), GitHub Actions sekmesinde i\u015f ak\u0131\u015f\u0131n\u0131z\u0131n durumunu takip edebilirsiniz. Belirledi\u011finiz cron zaman\u0131nda otomatik olarak \u00e7al\u0131\u015facak ve oyun verilerindeki de\u011fi\u015fiklikleri deponuza yans\u0131tacakt\u0131r.<\/p>\n<h3>\u00c7ekilen Veriyi Rehbere Entegre Etme: Statik Site Olu\u015fturucularla \u00c7al\u0131\u015fmak<\/h3>\n<p>Veriyi \u00e7ekme ve GitHub deposuna kaydetme otomasyonunu kurduktan sonra, s\u0131ra bu verileri hayran rehberinize entegre etmeye gelir. \u00c7o\u011fu modern hayran rehberi, \u00f6zellikle GitHub Pages gibi hizmetler \u00fczerinde bar\u0131nd\u0131r\u0131lanlar, statik site olu\u015fturucular (static site generators) kullan\u0131larak olu\u015fturulur. Jekyll, Hugo, Gatsby veya Next.js gibi ara\u00e7lar, Markdown dosyalar\u0131, JSON verileri veya di\u011fer \u015fablon dilleri kullanarak statik HTML sayfalar\u0131 \u00fcretir.<\/p>\n<p>Bizim senaryomuzda, <code>data\/game_items.json<\/code> dosyas\u0131n\u0131 olu\u015fturduk. \u015eimdi bu JSON dosyas\u0131n\u0131 kullanarak rehberimizdeki ilgili sayfalar\u0131 (\u00f6rne\u011fin, &#8220;Oyun \u00d6\u011feleri&#8221; sayfas\u0131) nas\u0131l g\u00fcncelleyece\u011fimizi d\u00fc\u015f\u00fcnelim. \u0130\u015fte birka\u00e7 yayg\u0131n yakla\u015f\u0131m:<\/p>\n<h4>1. Markdown Dosyalar\u0131 Olu\u015fturma\/G\u00fcncelleme<\/h4>\n<p>E\u011fer rehberiniz Markdown tabanl\u0131 statik bir site olu\u015fturucu (\u00f6rne\u011fin Jekyll veya Hugo) kullan\u0131yorsa, Python beti\u011finizi JSON verilerini okuyup her bir \u00f6\u011fe i\u00e7in ayr\u0131 bir Markdown dosyas\u0131 olu\u015fturacak veya mevcut dosyalar\u0131 g\u00fcncelleyecek \u015fekilde geni\u015fletebilirsiniz. \u00d6rne\u011fin:<\/p>\n<div class=\"code-container\">\n<pre><code class=\"language-python\">\n# data_fetcher.py i\u00e7inde veya ayr\u0131 bir betikte\nimport json\nimport os\n\ndef generate_markdown_files(items_data, output_dir='_items'):\n    \"\"\"\n    JSON verilerini kullanarak Markdown dosyalar\u0131 olu\u015fturur.\n    Her \u00f6\u011fe i\u00e7in bir Markdown dosyas\u0131 olu\u015fturulur.\n    \"\"\"\n    os.makedirs(output_dir, exist_ok=True) # Markdown dosyalar\u0131n\u0131n kaydedilece\u011fi klas\u00f6r\n\n    for item in items_data:\n        # Dosya ad\u0131n\u0131 \u00f6\u011fe ad\u0131na g\u00f6re olu\u015ftur (ge\u00e7ersiz karakterleri temizle)\n        filename = f\"{item['name'].lower().replace(' ', '-')}.md\"\n        filepath = os.path.join(output_dir, filename)\n\n        # Markdown i\u00e7eri\u011fi\n        markdown_content = f\"\"\"---\nlayout: item\ntitle: \"{item['name']}\"\ndescription: \"{item['description']}\"\n---\n\n## {item['name']}\n\n<strong>A\u00e7\u0131klama:<\/strong> {item['description']}\n\n<!-- Di\u011fer \u00f6\u011fe istatistikleri buraya eklenebilir -->\n\"\"\"\n        with open(filepath, 'w', encoding='utf-8') as f:\n            f.write(markdown_content)\n        print(f\"'{filename}' dosyas\u0131 olu\u015fturuldu\/g\u00fcncellendi.\")\n\nif __name__ == \"__main__\":\n    # \u00d6nceki ad\u0131mdan gelen JSON dosyas\u0131n\u0131 oku\n    with open('data\/game_items.json', 'r', encoding='utf-8') as f:\n        items = json.load(f)\n    \n    generate_markdown_files(items)\n  <\/code><\/pre>\n<\/div>\n<p>Bu betik, her oyun \u00f6\u011fesi i\u00e7in <code>_items\/item-adi.md<\/code> \u015feklinde bir Markdown dosyas\u0131 olu\u015fturur. Statik site olu\u015fturucunuz bu dosyalar\u0131 okuyarak otomatik olarak web sayfalar\u0131 \u00fcretecektir. GitHub Actions i\u015f ak\u0131\u015f\u0131n\u0131zda, <code>data_fetcher.py<\/code> beti\u011fini \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra bu Markdown olu\u015fturma beti\u011fini de \u00e7al\u0131\u015ft\u0131rman\u0131z gerekir.<\/p>\n<h4>2. Do\u011frudan JSON Verilerini Kullanma<\/h4>\n<p>Baz\u0131 statik site olu\u015fturucular (\u00f6zellikle modern JavaScript tabanl\u0131 olanlar gibi Next.js veya Hugo&#8217;nun baz\u0131 temalar\u0131), do\u011frudan JSON dosyalar\u0131n\u0131 veri kayna\u011f\u0131 olarak kullanabilir. Bu durumda, \u00e7ekilen <code>game_items.json<\/code> dosyas\u0131n\u0131 do\u011frudan projenizin veri klas\u00f6r\u00fcne (\u00f6rne\u011fin, Hugo i\u00e7in <code>data\/<\/code> klas\u00f6r\u00fc) yerle\u015ftirebilirsiniz. Site olu\u015fturucunuz, bu JSON dosyas\u0131n\u0131 okuyarak dinamik sayfalar veya listeler olu\u015fturabilir.<\/p>\n<h4>3. Rehberin Yay\u0131nlanmas\u0131 (Deployment)<\/h4>\n<p>Veriler g\u00fcncellenip Markdown veya JSON dosyalar\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcld\u00fckten sonra, rehberinizin yay\u0131nlanmas\u0131 (deployment) gerekir. E\u011fer projenizi GitHub Pages \u00fczerinde bar\u0131nd\u0131r\u0131yorsan\u0131z, GitHub Actions i\u015f ak\u0131\u015f\u0131n\u0131zdaki <code>git push<\/code> ad\u0131m\u0131, otomatik olarak yeni de\u011fi\u015fiklikleri GitHub Pages&#8217;e tetikleyecektir. Bu sayede, deponuza her yeni commit g\u00f6nderildi\u011finde (ki bu bizim otomatik veri g\u00fcncelleme commit&#8217;imiz olacak), GitHub Pages siteniz yeniden olu\u015fturulacak ve g\u00fcncel verilerle yay\u0131nlanacakt\u0131r.<\/p>\n<p>Ba\u015fka bir statik site bar\u0131nd\u0131rma hizmeti (\u00f6rne\u011fin Netlify veya Vercel) kullan\u0131yorsan\u0131z, bu hizmetler genellikle GitHub deponuzdaki de\u011fi\u015fiklikleri otomatik olarak alg\u0131lay\u0131p sitenizi yeniden da\u011f\u0131tacak \u015fekilde yap\u0131land\u0131r\u0131labilir. GitHub Actions i\u015f ak\u0131\u015f\u0131n\u0131za, bu hizmetlere \u00f6zel da\u011f\u0131t\u0131m ad\u0131mlar\u0131n\u0131 da ekleyebilirsiniz (\u00f6rne\u011fin, Netlify CLI kullanarak da\u011f\u0131t\u0131m yapmak).<\/p>\n<p>Bu entegrasyon ad\u0131mlar\u0131 sayesinde, ba\u015ftan sona otomatik bir veri ak\u0131\u015f\u0131 sa\u011flam\u0131\u015f olursunuz: Oyun verileri \u00e7ekilir, i\u015flenir, rehberinizin kaynak dosyalar\u0131 g\u00fcncellenir ve son olarak g\u00fcncel rehber otomatik olarak yay\u0131nlan\u0131r. T\u00fcm bunlar, sizin manuel m\u00fcdahaleniz olmadan, GitHub Actions&#8217;\u0131n zamanlanm\u0131\u015f cron i\u015fleri sayesinde ger\u00e7ekle\u015fir. B\u00f6ylece, oyuncular\u0131n\u0131z her zaman en do\u011fru ve g\u00fcncel bilgilere eri\u015febilirken, siz de zaman\u0131n\u0131z\u0131 daha yarat\u0131c\u0131 i\u00e7erikler \u00fcretmeye ay\u0131rabilirsiniz.<\/p>\n<h2>Vaka Analizi: Ger\u00e7ek D\u00fcnya Senaryolar\u0131nda Otomasyonun G\u00fcc\u00fc<\/h2>\n<p>Teorik bilgileri ve uygulama ad\u0131mlar\u0131n\u0131 \u00f6\u011frendikten sonra, bu otomasyon sisteminin ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l bir fark yaratabilece\u011fine dair somut bir vaka analizine g\u00f6z atal\u0131m. Bu analiz, bir taray\u0131c\u0131 oyununun hayran rehberini g\u00fcncel tutman\u0131n getirdi\u011fi zorluklar\u0131 ve GitHub Actions cron i\u015flerinin bu zorluklar\u0131 nas\u0131l a\u015ft\u0131\u011f\u0131n\u0131 ortaya koyacakt\u0131r.<\/p>\n<p>Hayal edelim ki, &#8220;Galaksi Sava\u015f\u00e7\u0131lar\u0131&#8221; ad\u0131nda, on binlerce aktif oyuncusu olan pop\u00fcler bir taray\u0131c\u0131 oyunu var. Bu oyun, uzay gemileri in\u015fa etme, gezegenleri kolonize etme ve di\u011fer oyuncularla sava\u015fma \u00fczerine kurulu. Oyun geli\u015ftiricileri, dengeyi korumak ve yeni i\u00e7erikler sunmak i\u00e7in haftal\u0131k yamalar (patches) yay\u0131nl\u0131yor. Bu yamalar genellikle \u015funlar\u0131 i\u00e7eriyor:<\/p>\n<ul>\n<li>Yeni gemi mod\u00fclleri veya mevcut mod\u00fcllerin istatistik de\u011fi\u015fiklikleri.<\/li>\n<li>Yeni gezegen t\u00fcrleri veya kaynak oranlar\u0131ndaki farkl\u0131l\u0131klar.<\/li>\n<li>Karakter yetenek a\u011fa\u00e7lar\u0131ndaki (skill trees) d\u00fczenlemeler.<\/li>\n<li>Yeni g\u00f6revler veya etkinlikler.<\/li>\n<\/ul>\n<p>Siz de &#8220;Galaksi Sava\u015f\u00e7\u0131lar\u0131 Wiki&#8221; ad\u0131nda kapsaml\u0131 bir hayran rehberi y\u00f6netiyorsunuz. Rehberiniz, en iyi gemi build&#8217;leri, gezegen kolonizasyon stratejileri, nadir mod\u00fcllerin d\u00fc\u015fme yerleri ve g\u00f6rev \u00e7\u00f6z\u00fcmleri gibi kritik bilgileri bar\u0131nd\u0131r\u0131yor. Ancak her yama geldi\u011finde, rehberinizdeki y\u00fczlerce sayfan\u0131n manuel olarak kontrol edilmesi ve g\u00fcncellenmesi gerekiyor. Bu, tek ki\u015filik bir ekip i\u00e7in haftada 10-15 saatlik ek bir i\u015f y\u00fck\u00fc anlam\u0131na geliyor. Hatalar ka\u00e7\u0131n\u0131lmaz oluyor, baz\u0131 bilgiler g\u00f6zden ka\u00e7abiliyor ve oyuncular, g\u00fcncel olmayan bilgiler nedeniyle hayal k\u0131r\u0131kl\u0131\u011f\u0131na u\u011frayabiliyor.<\/p>\n<h3>Otomasyon \u00c7\u00f6z\u00fcm\u00fcn\u00fcn Uygulanmas\u0131<\/h3>\n<p>Bu sorunu \u00e7\u00f6zmek i\u00e7in GitHub Actions cron otomasyonunu uygulamaya karar verdiniz. \u0130\u015fte s\u00fcre\u00e7:<\/p>\n<ol>\n<li><strong>Veri Kayna\u011f\u0131 Tespiti:<\/strong> Oyunun resmi web sitesinde, &#8220;Gemi Mod\u00fclleri&#8221;, &#8220;Gezegen Kaynaklar\u0131&#8221; ve &#8220;Yetenekler&#8221; sayfalar\u0131n\u0131n d\u00fczenli HTML tablolar\u0131 veya listeler halinde sunuldu\u011funu fark ettiniz. Ayr\u0131ca, geli\u015ftiricilerin bir &#8220;API&#8221; sunmad\u0131\u011f\u0131n\u0131 da \u00f6\u011frendiniz. Bu durumda, web kaz\u0131ma en uygun y\u00f6ntem oldu.<\/li>\n<li><strong>Python Betikleri Geli\u015ftirme:<\/strong> \u00dc\u00e7 ayr\u0131 Python beti\u011fi olu\u015fturdunuz:\n<ul>\n<li><code>src\/ship_modules_scraper.py<\/code>: Gemi mod\u00fcllerinin adlar\u0131n\u0131, seviyelerini, sald\u0131r\u0131\/savunma istatistiklerini \u00e7eker.<\/li>\n<li><code>src\/planet_resources_scraper.py<\/code>: Gezegen t\u00fcrlerine g\u00f6re kaynak \u00fcretim oranlar\u0131n\u0131 \u00e7eker.<\/li>\n<li><code>src\/skill_tree_scraper.py<\/code>: Karakter yetenek a\u011fa\u00e7lar\u0131ndaki her yetene\u011fin ad\u0131n\u0131 ve a\u00e7\u0131klamas\u0131n\u0131 \u00e7eker.<\/li>\n<\/ul>\n<p>        Bu betikler, \u00e7ekilen verileri <code>data\/ship_modules.json<\/code>, <code>data\/planet_resources.json<\/code> ve <code>data\/skill_tree.json<\/code> dosyalar\u0131na kaydeder.\n    <\/li>\n<li><strong>Markdown Olu\u015fturma Beti\u011fi:<\/strong> Ayr\u0131ca, bu JSON dosyalar\u0131n\u0131 okuyup, rehberinizin statik site olu\u015fturucusu (\u00f6rne\u011fin Hugo) i\u00e7in <code>content\/modules\/<\/code>, <code>content\/planets\/<\/code> ve <code>content\/skills\/<\/code> klas\u00f6rlerine uygun Markdown dosyalar\u0131 olu\u015fturan bir <code>src\/markdown_generator.py<\/code> beti\u011fi yazd\u0131n\u0131z. Bu betik, her \u00f6\u011fe i\u00e7in bir Markdown dosyas\u0131 olu\u015fturur ve \u00f6n y\u00fcz (front matter) bilgilerini (ba\u015fl\u0131k, a\u00e7\u0131klama vb.) otomatik olarak doldurur.<\/li>\n<li><strong>GitHub Actions \u0130\u015f Ak\u0131\u015f\u0131:<\/strong> <code>.github\/workflows\/sync.yml<\/code> dosyas\u0131n\u0131 yap\u0131land\u0131rd\u0131n\u0131z. Bu i\u015f ak\u0131\u015f\u0131, her g\u00fcn gece 02:00 UTC&#8217;de \u00e7al\u0131\u015facak \u015fekilde ayarland\u0131. \u0130\u015f ak\u0131\u015f\u0131 \u015fu ad\u0131mlar\u0131 i\u00e7eriyor:\n<ul>\n<li>Depoyu kopyala.<\/li>\n<li>Python ortam\u0131n\u0131 kur ve gerekli k\u00fct\u00fcphaneleri y\u00fckle.<\/li>\n<li>\u00dc\u00e7 web kaz\u0131ma beti\u011fini s\u0131rayla \u00e7al\u0131\u015ft\u0131r.<\/li>\n<li>Markdown olu\u015fturma beti\u011fini \u00e7al\u0131\u015ft\u0131rarak JSON verilerini Markdown dosyalar\u0131na d\u00f6n\u00fc\u015ft\u00fcr.<\/li>\n<li>Git de\u011fi\u015fikliklerini kontrol et.<\/li>\n<li>E\u011fer de\u011fi\u015fiklik varsa, otomatik bir commit mesaj\u0131yla depoya g\u00f6nder.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3>Kar\u015f\u0131la\u015f\u0131lan Zorluklar ve \u00c7\u00f6z\u00fcmler<\/h3>\n<p>Bu s\u00fcre\u00e7te baz\u0131 zorluklarla kar\u015f\u0131la\u015f\u0131ld\u0131:<\/p>\n<ul>\n<li><strong>Anti-Scraping Mekanizmalar\u0131:<\/strong> Oyunun web sitesi, baz\u0131 sayfalarda basit anti-bot kontrolleri kullan\u0131yordu. Bu durum, <code>User-Agent<\/code> ba\u015fl\u0131\u011f\u0131n\u0131 taklit ederek veya istekler aras\u0131na k\u0131sa gecikmeler (<code>time.sleep()<\/code>) ekleyerek a\u015f\u0131ld\u0131.<\/li>\n<li><strong>HTML Yap\u0131s\u0131 De\u011fi\u015fiklikleri:<\/strong> B\u00fcy\u00fck bir yama sonras\u0131, gemi mod\u00fclleri tablosunun CSS s\u0131n\u0131f\u0131 de\u011fi\u015fti. Bu, kaz\u0131ma beti\u011finin hata vermesine neden oldu. GitHub Actions&#8217;\u0131n hata bildirimleri sayesinde (e-posta ile), sorunu h\u0131zla fark ettiniz ve beti\u011fi g\u00fcncelleyerek \u00e7\u00f6zd\u00fcn\u00fcz. Bu, otomasyonun %100 &#8220;ayarla ve unut&#8221; olmad\u0131\u011f\u0131, ancak bak\u0131m gerektirdi\u011finde sizi uyard\u0131\u011f\u0131 anlam\u0131na gelir.<\/li>\n<li><strong>Veri Tutars\u0131zl\u0131klar\u0131:<\/strong> Bazen oyunun web sitesindeki veriler tutars\u0131z olabiliyordu (\u00f6rne\u011fin, bir \u00f6\u011fe i\u00e7in a\u00e7\u0131klama eksikli\u011fi). Betik, bu t\u00fcr durumlar\u0131 ele almak i\u00e7in ek kontrol ve varsay\u0131lan de\u011fer atama mant\u0131\u011f\u0131yla g\u00fc\u00e7lendirildi.<\/li>\n<\/ul>\n<h3>Elde Edilen Faydalar<\/h3>\n<p>Bu otomasyon sistemi sayesinde, &#8220;Galaksi Sava\u015f\u00e7\u0131lar\u0131 Wiki&#8221; y\u00f6netimi b\u00fcy\u00fck faydalar sa\u011flad\u0131:<\/p>\n<ul>\n<li><strong>S\u00fcrekli G\u00fcncellik:<\/strong> Rehber, oyunun yamalar\u0131ndan k\u0131sa s\u00fcre sonra (birka\u00e7 saat i\u00e7inde) otomatik olarak g\u00fcncellenir hale geldi. Oyuncular her zaman en do\u011fru bilgilere eri\u015fti.<\/li>\n<li><strong>Zaman ve Emek Tasarrufu:<\/strong> Haftal\u0131k 10-15 saatlik manuel g\u00fcncelleme i\u015f y\u00fck\u00fc neredeyse s\u0131f\u0131ra indi. Bu sayede, rehberin y\u00f6neticisi zaman\u0131n\u0131 yeni makaleler yazmaya, toplulukla etkile\u015fime ge\u00e7meye veya oyunun daha derinlemesine analizlerini yapmaya ay\u0131rabildi.<\/li>\n<li><strong>Do\u011fruluk ve G\u00fcvenilirlik:<\/strong> \u0130nsan hatas\u0131 riski ortadan kalkt\u0131\u011f\u0131 i\u00e7in, rehberin veri do\u011frulu\u011fu \u00f6nemli \u00f6l\u00e7\u00fcde artt\u0131. Bu da toplulu\u011fun rehbere olan g\u00fcvenini peki\u015ftirdi.<\/li>\n<li><strong>Topluluk Memnuniyeti:<\/strong> Oyuncular, her zaman g\u00fcncel bilgilere sahip olmaktan memnuniyet duydu. Bu, wiki&#8217;nin ziyaret\u00e7i trafi\u011fini ve etkile\u015fimini art\u0131rd\u0131.<\/li>\n<li><strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Oyuna yeni i\u00e7erikler eklendi\u011finde (yeni gemi t\u00fcrleri, gezegenler vb.), mevcut betikler k\u00fc\u00e7\u00fck ayarlamalarla bu yeni verileri de \u00e7ekebilecek \u015fekilde kolayca geni\u015fletilebildi.<\/li>\n<\/ul>\n<p>Bu vaka analizi, GitHub Actions cron i\u015flerinin ve web kaz\u0131ma tekniklerinin, dinamik bir online oyun ortam\u0131nda hayran i\u00e7eri\u011fini g\u00fcncel tutmak i\u00e7in ne kadar g\u00fc\u00e7l\u00fc ve d\u00f6n\u00fc\u015ft\u00fcr\u00fcc\u00fc bir ara\u00e7 olabilece\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Do\u011fru planlama ve biraz kodlama ile, tekrarlayan ve zaman al\u0131c\u0131 g\u00f6revleri otomatikle\u015ftirerek hem kendi verimlili\u011finizi art\u0131rabilir hem de toplulu\u011funuza daha iyi bir hizmet sunabilirsiniz.<\/p>\n<h2>\u0130leri D\u00fczey Kullan\u0131m: Otomasyonu Daha Verimli Hale Getirmek \u0130\u00e7in \u0130pu\u00e7lar\u0131<\/h2>\n<p>\u015eimdiye kadar, temel bir GitHub Actions cron i\u015fi ile bir hayran rehberini nas\u0131l g\u00fcncelleyece\u011fimizi \u00f6\u011frendik. Ancak otomasyon potansiyeli bununla s\u0131n\u0131rl\u0131 de\u011fil. Bu b\u00f6l\u00fcmde, sisteminizi daha sa\u011flam, verimli ve g\u00fcvenli hale getirmek i\u00e7in baz\u0131 ileri d\u00fczey ipu\u00e7lar\u0131na ve p\u00fcf noktalar\u0131na de\u011finece\u011fiz.<\/p>\n<h3>Hata Y\u00f6netimi ve Bildirimler: \u0130\u015f Ak\u0131\u015f\u0131n\u0131z Durdu\u011funda Ne Yapmal\u0131s\u0131n\u0131z?<\/h3>\n<p>Otomatik sistemler harikad\u0131r, ancak sorunsuz \u00e7al\u0131\u015facaklar\u0131n\u0131n garantisi yoktur. Web sitelerinin yap\u0131s\u0131 de\u011fi\u015febilir, a\u011f sorunlar\u0131 ya\u015fanabilir veya API limitleri a\u015f\u0131labilir. Bu gibi durumlarda, i\u015f ak\u0131\u015f\u0131n\u0131z\u0131n ba\u015far\u0131s\u0131z oldu\u011funu h\u0131zl\u0131ca \u00f6\u011frenmek ve m\u00fcdahale etmek hayati \u00f6nem ta\u015f\u0131r.<\/p>\n<ul>\n<li><strong>Beti\u011finizde Kapsaml\u0131 Hata Y\u00f6netimi:<\/strong> Python beti\u011finizde <code>try-except<\/code> bloklar\u0131n\u0131 c\u00f6mert\u00e7e kullan\u0131n. \u00d6zellikle HTTP istekleri (<code>requests.get()<\/code>) ve HTML ayr\u0131\u015ft\u0131rma (<code>BeautifulSoup<\/code>) k\u0131s\u0131mlar\u0131nda olas\u0131 hatalar\u0131 (a\u011f ba\u011flant\u0131s\u0131 sorunlar\u0131, zaman a\u015f\u0131m\u0131, element bulunamamas\u0131 vb.) yakalay\u0131n ve anlaml\u0131 hata mesajlar\u0131 yazd\u0131r\u0131n. Bu, GitHub Actions g\u00fcnl\u00fcklerinde sorunun k\u00f6k nedenini h\u0131zl\u0131ca bulman\u0131za yard\u0131mc\u0131 olur.<\/li>\n<li><strong>GitHub Actions Bildirimleri:<\/strong> GitHub, i\u015f ak\u0131\u015f\u0131 \u00e7al\u0131\u015ft\u0131rmalar\u0131n\u0131z ba\u015far\u0131s\u0131z oldu\u011funda e-posta bildirimleri g\u00f6nderebilir. Bu ayarlar\u0131 deponuzun &#8220;Settings&#8221; (Ayarlar) -> &#8220;Notifications&#8221; (Bildirimler) k\u0131sm\u0131ndan kontrol edebilirsiniz.<\/li>\n<li><strong>\u00d6zel Bildirim Entegrasyonlar\u0131:<\/strong> Daha geli\u015fmi\u015f bir bildirim sistemi i\u00e7in, i\u015f ak\u0131\u015f\u0131n\u0131za Slack, Discord veya Telegram gibi platformlara mesaj g\u00f6nderecek ad\u0131mlar ekleyebilirsiniz. GitHub Marketplace&#8217;te bu entegrasyonlar i\u00e7in haz\u0131r eylemler bulunur. \u00d6rne\u011fin, bir i\u015f ak\u0131\u015f\u0131 ba\u015far\u0131s\u0131z oldu\u011funda bir Discord kanal\u0131na mesaj g\u00f6ndermek i\u00e7in \u015f\u00f6yle bir ad\u0131m ekleyebilirsiniz:\n<div class=\"code-container\">\n<pre><code class=\"language-yaml\">\n      - name: Discord Bildirimi G\u00f6nder\n        if: failure() # Sadece i\u015f ak\u0131\u015f\u0131 ba\u015far\u0131s\u0131z olursa \u00e7al\u0131\u015ft\u0131r\n        uses: rjstone\/discord-webhook-notify@v1 # \u00d6rnek bir Discord webhook eylemi\n        with:\n          severity: error\n          description: \"Oyun rehberi senkronizasyon i\u015f ak\u0131\u015f\u0131 ba\u015far\u0131s\u0131z oldu!\"\n          webhookUrl: ${{ secrets.DISCORD_WEBHOOK }} # Webhook URL'sini GitHub Secrets'ta saklay\u0131n\n          <\/code><\/pre>\n<\/p><\/div>\n<p>        Bu, sorunun fark\u0131na varman\u0131z\u0131 ve h\u0131zl\u0131ca m\u00fcdahale etmenizi sa\u011flar.<\/li>\n<\/ul>\n<h3>G\u00fcvenlik ve Performans Optimizasyonu: API Anahtarlar\u0131 ve Cache Kullan\u0131m\u0131<\/h3>\n<p>Otomasyon sisteminizin g\u00fcvenli\u011fini ve verimlili\u011fini art\u0131rmak i\u00e7in baz\u0131 \u00f6nemli noktalar vard\u0131r:<\/p>\n<ul>\n<li><strong>API Anahtarlar\u0131n\u0131 G\u00fcvenli Bir \u015eekilde Y\u00f6netme:<\/strong> E\u011fer oyunun bir API&#8217;sini kullan\u0131yorsan\u0131z ve bu API bir anahtar gerektiriyorsa, bu anahtar\u0131 do\u011frudan YAML dosyan\u0131za yazmaktan ka\u00e7\u0131n\u0131n. Bunun yerine, GitHub Secrets \u00f6zelli\u011fini kullan\u0131n. Deponuzun &#8220;Settings&#8221; (Ayarlar) -> &#8220;Secrets and variables&#8221; (Gizlilikler ve de\u011fi\u015fkenler) -> &#8220;Actions&#8221; (Eylemler) b\u00f6l\u00fcm\u00fcnden yeni bir gizlilik (secret) olu\u015fturabilirsiniz (\u00f6rne\u011fin, <code>API_KEY<\/code>). Ard\u0131ndan, i\u015f ak\u0131\u015f\u0131n\u0131zda bu anahtara <code>${{ secrets.API_KEY }}<\/code> \u015feklinde g\u00fcvenli bir \u015fekilde eri\u015febilirsiniz.<\/li>\n<li><strong>Web Kaz\u0131mada Sunucuya Y\u00fck Bindirmemeye Dikkat:<\/strong> Web kaz\u0131ma yaparken, hedef sunucuya a\u015f\u0131r\u0131 y\u00fck bindirmemeye \u00f6zen g\u00f6sterin. \u00c7ok s\u0131k ve h\u0131zl\u0131 istekler yapmak, IP adresinizin engellenmesine veya sitenin performans\u0131n\u0131 olumsuz etkilemeye neden olabilir. \u0130stekler aras\u0131na makul gecikmeler (\u00f6rne\u011fin, <code>time.sleep(1)<\/code> ile 1 saniye bekleme) eklemek iyi bir pratiktir. Ayr\u0131ca, <code>User-Agent<\/code> ba\u015fl\u0131\u011f\u0131n\u0131 do\u011fru ayarlamak da \u00f6nemlidir.<\/li>\n<li><strong>S\u0131k\u00e7a De\u011fi\u015fmeyen Veriler \u0130\u00e7in Cacheleme (\u00d6nbellekleme):<\/strong> E\u011fer baz\u0131 veriler \u00e7ok s\u0131k de\u011fi\u015fmiyorsa, her seferinde yeniden \u00e7ekmek yerine \u00f6nbelle\u011fe almay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. GitHub Actions&#8217;\u0131n <code>actions\/cache@v3<\/code> eylemi, ba\u011f\u0131ml\u0131l\u0131klar\u0131 veya \u00e7\u0131kt\u0131 dosyalar\u0131n\u0131 \u00f6nbelle\u011fe alman\u0131za olanak tan\u0131r. Bu, i\u015f ak\u0131\u015f\u0131n\u0131z\u0131n \u00e7al\u0131\u015fma s\u00fcresini azaltabilir ve harici kaynaklara yap\u0131lan istek say\u0131s\u0131n\u0131 d\u00fc\u015f\u00fcrebilir. \u00d6rne\u011fin, belirli bir resim seti veya \u00e7ok nadir g\u00fcncellenen bir \u00f6\u011fe listesi i\u00e7in cache kullanabilirsiniz.<\/li>\n<li><strong>Ko\u015fullu \u00c7al\u0131\u015ft\u0131rmalar:<\/strong> \u0130\u015f ak\u0131\u015f\u0131n\u0131zdaki ad\u0131mlar\u0131 ko\u015fullu olarak \u00e7al\u0131\u015ft\u0131rmak, performans\u0131 art\u0131rabilir. \u00d6rne\u011fin, sadece belirli bir dosya t\u00fcr\u00fc de\u011fi\u015fti\u011finde bir beti\u011fi \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>if<\/code> ko\u015fullar\u0131n\u0131 kullanabilirsiniz. Bizim \u00f6rne\u011fimizde, <code>git commit<\/code> ve <code>git push<\/code> ad\u0131mlar\u0131n\u0131 sadece <code>changes_detected<\/code> \u00e7\u0131kt\u0131s\u0131 <code>true<\/code> oldu\u011funda \u00e7al\u0131\u015ft\u0131rarak gereksiz Git i\u015flemlerinden ka\u00e7\u0131nd\u0131k.<\/li>\n<\/ul>\n<h3>Farkl\u0131 Veri Kaynaklar\u0131n\u0131 Birle\u015ftirme ve Zenginle\u015ftirme<\/h3>\n<p>Hayran rehberinizi daha kapsaml\u0131 hale getirmek i\u00e7in, farkl\u0131 kaynaklardan gelen verileri birle\u015ftirmeyi d\u00fc\u015f\u00fcnebilirsiniz. \u00d6rne\u011fin:<\/p>\n<ul>\n<li><strong>Birden Fazla Web Sitesinden Veri \u00c7ekme:<\/strong> Oyunun resmi sitesinden temel \u00f6\u011fe bilgilerini \u00e7ekerken, oyuncu forumlar\u0131ndan veya topluluk wiki&#8217;lerinden kullan\u0131c\u0131 yorumlar\u0131n\u0131 veya stratejilerini de \u00e7ekebilirsiniz. Bu verileri birle\u015ftirerek daha zengin ve ba\u011flaml\u0131 rehber sayfalar\u0131 olu\u015fturabilirsiniz.<\/li>\n<li><strong>Harici Veri Kaynaklar\u0131 ile Birle\u015ftirme:<\/strong> Oyununuzun evreniyle ilgili harici API&#8217;ler (\u00f6rne\u011fin, bir hava durumu API&#8217;si veya bir harita API&#8217;si) varsa, bu verileri de rehberinize entegre edebilirsiniz. \u00d6rne\u011fin, oyun i\u00e7i hava durumu olaylar\u0131n\u0131 veya belirli b\u00f6lgelerin harita koordinatlar\u0131n\u0131 otomatik olarak g\u00fcncelleyebilirsiniz.<\/li>\n<li><strong>Verileri D\u00f6n\u00fc\u015ft\u00fcrme ve Normalize Etme:<\/strong> Farkl\u0131 kaynaklardan gelen veriler farkl\u0131 formatlarda olabilir. Python beti\u011finizde bu verileri standart bir yap\u0131ya (\u00f6rne\u011fin, t\u00fcm \u00f6\u011felerin &#8220;isim&#8221;, &#8220;a\u00e7\u0131klama&#8221;, &#8220;istatistikler&#8221; alanlar\u0131na sahip oldu\u011fu bir JSON format\u0131) d\u00f6n\u00fc\u015ft\u00fcrmek, rehberinizde tutarl\u0131l\u0131k sa\u011flar ve y\u00f6netimi kolayla\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Bu ileri d\u00fczey teknikleri uygulayarak, otomasyon sisteminizi sadece i\u015flevsel de\u011fil, ayn\u0131 zamanda sa\u011flam, g\u00fcvenli, verimli ve gelece\u011fe d\u00f6n\u00fck hale getirebilirsiniz. Unutmay\u0131n, otomasyon s\u00fcrekli bir iyile\u015ftirme s\u00fcrecidir ve ihtiya\u00e7lar\u0131n\u0131za g\u00f6re sisteminizi zamanla geli\u015ftirmeye devam etmelisiniz.<\/p>\n<h2>Sonu\u00e7: Otomatik Fan Rehberi ile Oyuncu Deneyimini Zenginle\u015ftirin<\/h2>\n<p>Bu makale boyunca, viral bir taray\u0131c\u0131 oyununun hayran rehberini GitHub Actions&#8217;\u0131n zamanlanm\u0131\u015f cron i\u015flerini kullanarak nas\u0131l otomatik olarak g\u00fcncel tutaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceledik. Dijital d\u00fcnyan\u0131n h\u0131zla de\u011fi\u015fen dinamikleri kar\u015f\u0131s\u0131nda g\u00fcncel kalman\u0131n zorluklar\u0131ndan ba\u015flayarak, GitHub Actions, cron i\u015fleri ve web kaz\u0131ma gibi temel kavramlar\u0131 ele ald\u0131k. Ard\u0131ndan, Python ile bir veri \u00e7ekme beti\u011fi olu\u015fturma, GitHub Actions i\u015f ak\u0131\u015f\u0131n\u0131 yap\u0131land\u0131rma ve \u00e7ekilen verileri rehbere entegre etme s\u00fcre\u00e7lerini detayland\u0131rd\u0131k.<\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, bu otomasyon sistemi sadece manuel g\u00fcncelleme y\u00fck\u00fcn\u00fc ortadan kald\u0131rmakla kalm\u0131yor, ayn\u0131 zamanda hayran rehberinizin do\u011frulu\u011funu, g\u00fcncelli\u011fini ve g\u00fcvenilirli\u011fini de \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131yor. &#8220;Galaksi Sava\u015f\u00e7\u0131lar\u0131 Wiki&#8221; vaka analizimiz, bu yakla\u015f\u0131m\u0131n ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l somut faydalar sa\u011flayabilece\u011fini g\u00f6zler \u00f6n\u00fcne serdi: zaman tasarrufu, insan hatas\u0131n\u0131n azalmas\u0131, topluluk memnuniyeti ve \u00f6l\u00e7eklenebilirlik. Ayr\u0131ca, hata y\u00f6netimi, g\u00fcvenlik optimizasyonu ve farkl\u0131 veri kaynaklar\u0131n\u0131 birle\u015ftirme gibi ileri d\u00fczey konulara de\u011finerek, sisteminizi daha da g\u00fc\u00e7lendirme yollar\u0131n\u0131 ke\u015ffettik.<\/p>\n<p>Bir hayran olarak, sevdi\u011finiz oyuna olan tutkunuzu payla\u015f\u0131rken, bu t\u00fcr teknolojik ara\u00e7lar\u0131 kullanarak toplulu\u011funuza paha bi\u00e7ilmez bir hizmet sunabilirsiniz. Otomatik bir hayran rehberi, oyuncular\u0131n her zaman en g\u00fcncel bilgilere eri\u015fmesini sa\u011flayarak onlar\u0131n oyun deneyimini zenginle\u015ftirir. Siz de zaman\u0131n\u0131z\u0131, veri giri\u015fi gibi tekrarlayan g\u00f6revler yerine, daha yarat\u0131c\u0131 i\u00e7erikler \u00fcretmeye, derinlemesine analizler yapmaya veya toplulu\u011funuzla etkile\u015fim kurmaya ay\u0131rabilirsiniz. Unutmay\u0131n, teknolojinin amac\u0131 hayat\u0131m\u0131z\u0131 kolayla\u015ft\u0131rmakt\u0131r ve bu otomasyon, dijital i\u00e7erik \u00fcretimi d\u00fcnyas\u0131nda bunun m\u00fckemmel bir \u00f6rne\u011fidir. \u015eimdi s\u0131ra sizde! Kendi otomatik fan rehberinizi olu\u015fturarak, oyun toplulu\u011funuza de\u011fer katmaya ba\u015flay\u0131n.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular:<\/h2>\n<p><strong>Soru 1: GitHub Actions kullanmak \u00fccretsiz mi?<\/strong><\/p>\n<p>Cevap: Evet, GitHub Actions, bireysel geli\u015ftiriciler ve a\u00e7\u0131k kaynak projeleri i\u00e7in belirli limitler dahilinde \u00fccretsizdir. Ayl\u0131k belirli dakikalar (genellikle 2000 dakika) ve depolama alan\u0131 sunulur. Bu limitler \u00e7o\u011fu ki\u015fisel proje ve hayran rehberi i\u00e7in yeterli olacakt\u0131r. Daha b\u00fcy\u00fck projeler veya daha fazla kaynak gerektiren durumlar i\u00e7in \u00fccretli planlar mevcuttur.<\/p>\n<p><strong>Soru 2: Web kaz\u0131ma (web scraping) yasal m\u0131d\u0131r?<\/strong><\/p>\n<p>Cevap: Web kaz\u0131man\u0131n yasal durumu karma\u015f\u0131kt\u0131r ve \u00fclkeye, web sitesinin kullan\u0131m ko\u015fullar\u0131na (Terms of Service) ve kaz\u0131nan verinin niteli\u011fine g\u00f6re de\u011fi\u015fir. Genellikle, herkese a\u00e7\u0131k verileri ticari ama\u00e7 g\u00fctmeden, siteye zarar vermeden (a\u015f\u0131r\u0131 y\u00fck bindirmeden) ve telif hakk\u0131 ihlali yapmadan kaz\u0131mak daha az risklidir. Her zaman sitenin <code>robots.txt<\/code> dosyas\u0131n\u0131 kontrol etmeli ve kullan\u0131m ko\u015fullar\u0131n\u0131 okumal\u0131s\u0131n\u0131z. \u015e\u00fcpheye d\u00fc\u015ft\u00fc\u011f\u00fcn\u00fczde, hukuki dan\u0131\u015fmanl\u0131k alman\u0131z \u00f6nerilir.<\/p>\n<p><strong>Soru 3: Herhangi bir taray\u0131c\u0131 oyunu i\u00e7in bu y\u00f6ntemi kullanabilir miyim?<\/strong><\/p>\n<p>Cevap: Teknik olarak evet, ancak oyunun verileri bir web sayfas\u0131nda eri\u015filebilir olmal\u0131 veya bir API sunmal\u0131d\u0131r. Baz\u0131 oyunlar, veri \u00e7ekmeyi zorla\u015ft\u0131ran karma\u015f\u0131k JavaScript yap\u0131lar\u0131 (dinamik olarak y\u00fcklenen i\u00e7erik gibi) veya anti-bot \u00f6nlemleri (CAPTCHA&#8217;lar, IP engelleme) kullanabilir. Bu durumlarda, daha geli\u015fmi\u015f kaz\u0131ma teknikleri (\u00f6rne\u011fin, headless taray\u0131c\u0131lar kullanarak JavaScript&#8217;i \u00e7al\u0131\u015ft\u0131rma) veya API anahtarlar\u0131yla kimlik do\u011frulama gerekebilir.<\/p>\n<p><strong>Soru 4: GitHub Actions cron i\u015fleri ne s\u0131kl\u0131kla \u00e7al\u0131\u015ft\u0131r\u0131labilir?<\/strong><\/p>\n<p>Cevap: GitHub Actions cron i\u015fleri en az 5 dakikada bir \u00e7al\u0131\u015facak \u015fekilde ayarlanabilir. Ancak, sunucuya gereksiz y\u00fck bindirmemek, API limitlerini a\u015fmamak ve GitHub Actions&#8217;\u0131n \u00fccretsiz kullan\u0131m limitlerini t\u00fcketmemek ad\u0131na veri g\u00fcncelleme s\u0131kl\u0131\u011f\u0131n\u0131 ihtiyaca g\u00f6re belirlemek \u00f6nemlidir. \u00d6rne\u011fin, g\u00fcnde bir veya birka\u00e7 saatte bir \u00e7al\u0131\u015ft\u0131rmak \u00e7o\u011fu fan rehberi i\u00e7in yeterli ve daha s\u00fcrd\u00fcr\u00fclebilir olacakt\u0131r.<\/p>\n<p><strong>Soru 5: Veri \u00e7ekme beti\u011fim hata verirse ne olur?<\/strong><\/p>\n<p>Cevap: E\u011fer veri \u00e7ekme beti\u011finiz veya i\u015f ak\u0131\u015f\u0131n\u0131zdaki herhangi bir ad\u0131m hata verirse, GitHub Actions i\u015f ak\u0131\u015f\u0131n\u0131z ba\u015far\u0131s\u0131z olarak i\u015faretlenir. Bu durumu GitHub aray\u00fcz\u00fcnde &#8220;Actions&#8221; sekmesi alt\u0131nda g\u00f6rebilirsiniz. Ayr\u0131ca, i\u015f ak\u0131\u015f\u0131n\u0131za e-posta veya ba\u015fka bildirim mekanizmalar\u0131 (\u00f6rne\u011fin Discord veya Slack webhook&#8217;lar\u0131) ekleyerek hatalardan an\u0131nda haberdar olabilirsiniz. Beti\u011finizde uygun hata y\u00f6netimi (<code>try-except<\/code> bloklar\u0131) kullanarak beklenmedik durumlar\u0131 ele alman\u0131z, hatalar\u0131n daha kolay te\u015fhis edilmesini ve \u00e7\u00f6z\u00fclmesini sa\u011flar.<\/p>\n<p>#GitHubActions #WebOtomasyonu #CronJob #WebScraping #FanRehberi #Teknoloji #Yaz\u0131l\u0131mGeli\u015ftirme #VeriSenkronizasyonu<\/p>\n","protected":false},"excerpt":{"rendered":"Pop\u00fcler bir taray\u0131c\u0131 oyununun dinamik verilerini otomatik olarak \u00e7ekip, GitHub Actions cron i\u015fleri sayesinde hayran rehberinizi her zaman g\u00fcncel tutman\u0131n pratik yollar\u0131n\u0131 ke\u015ffedin.","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":[1401],"tags":[],"class_list":{"0":"post-45169","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-git","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>Viral Bir Taray\u0131c\u0131 Oyununun Hayran Rehberini GitHub Actions Cron ile Nas\u0131l G\u00fcncel Tutar\u0131m? - 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\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Viral Bir Taray\u0131c\u0131 Oyununun Hayran Rehberini GitHub Actions Cron ile Nas\u0131l G\u00fcncel Tutar\u0131m?\" \/>\n<meta property=\"og:description\" content=\"Pop\u00fcler bir taray\u0131c\u0131 oyununun dinamik verilerini otomatik olarak \u00e7ekip, GitHub Actions cron i\u015fleri sayesinde hayran rehberinizi her zaman g\u00fcncel tutman\u0131n pratik yollar\u0131n\u0131 ke\u015ffedin.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-13T06:13:08+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\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Viral Bir Taray\u0131c\u0131 Oyununun Hayran Rehberini GitHub Actions Cron ile Nas\u0131l G\u00fcncel Tutar\u0131m?\",\"datePublished\":\"2026-10-13T06:13:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/\"},\"wordCount\":6055,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Git\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/\",\"name\":\"Viral Bir Taray\u0131c\u0131 Oyununun Hayran Rehberini GitHub Actions Cron ile Nas\u0131l G\u00fcncel Tutar\u0131m? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-10-13T06:13:08+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Viral Bir Taray\u0131c\u0131 Oyununun Hayran Rehberini GitHub Actions Cron ile Nas\u0131l G\u00fcncel Tutar\u0131m?\"}]},{\"@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":"Viral Bir Taray\u0131c\u0131 Oyununun Hayran Rehberini GitHub Actions Cron ile Nas\u0131l G\u00fcncel Tutar\u0131m? - 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\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/","og_locale":"tr_TR","og_type":"article","og_title":"Viral Bir Taray\u0131c\u0131 Oyununun Hayran Rehberini GitHub Actions Cron ile Nas\u0131l G\u00fcncel Tutar\u0131m?","og_description":"Pop\u00fcler bir taray\u0131c\u0131 oyununun dinamik verilerini otomatik olarak \u00e7ekip, GitHub Actions cron i\u015fleri sayesinde hayran rehberinizi her zaman g\u00fcncel tutman\u0131n pratik yollar\u0131n\u0131 ke\u015ffedin.","og_url":"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-10-13T06:13:08+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\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Viral Bir Taray\u0131c\u0131 Oyununun Hayran Rehberini GitHub Actions Cron ile Nas\u0131l G\u00fcncel Tutar\u0131m?","datePublished":"2026-10-13T06:13:08+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/"},"wordCount":6055,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Git"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/","url":"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/","name":"Viral Bir Taray\u0131c\u0131 Oyununun Hayran Rehberini GitHub Actions Cron ile Nas\u0131l G\u00fcncel Tutar\u0131m? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-10-13T06:13:08+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/viral-bir-tarayici-oyununun-hayran-rehberini-github-actions-cron-ile-nasil-guncel-tutarim\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Viral Bir Taray\u0131c\u0131 Oyununun Hayran Rehberini GitHub Actions Cron ile Nas\u0131l G\u00fcncel Tutar\u0131m?"}]},{"@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\/45169","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=45169"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/45169\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=45169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=45169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=45169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}