{"id":241,"title":"Mastodon\u2019a Giri\u015f ve Bot Geli\u015ftirme Rehberi","content":"<p>Sosyal medya d\u00fcnyas\u0131nda merkezi olmayan, \u00f6zg\u00fcr ve a\u00e7\u0131k kaynakl\u0131 bir platform ar\u0131yorsan\u0131z, Mastodon tam size g\u00f6re. Bu yaz\u0131da Mastodon\u2019u tan\u0131yacak ve Python kullanarak nas\u0131l bot geli\u015ftirebilece\u011fimizi \u00f6\u011frenece\u011fiz.<\/p><p>## Mastodon Nedir?<\/p><p>Mastodon, merkezi olmayan bir mikroblog platformudur. Twitter\u2019a benzer ancak \u00f6nemli farklarla ayr\u0131l\u0131r. En \u00f6nemli fark\u0131, tek bir merkezi sunucu yerine bir\u00e7ok ba\u011f\u0131ms\u0131z sunucudan (instance) olu\u015fmas\u0131d\u0131r. Her instance kendi kurallar\u0131n\u0131 belirleyebilir, ancak di\u011fer instance\u2019larla ileti\u015fim kurabilir.<\/p><p>### Mastodon\u2019un Temel \u00d6zellikleri:<\/p><p>- **Tootlar**: Tweet yerine \u201ctoot\u201d olarak adland\u0131r\u0131lan payla\u015f\u0131mlar<br>- **Boost**: Retweet benzeri payla\u015f\u0131m \u00f6zelli\u011fi<br>- **Instance\u2019lar**: Ba\u011f\u0131ms\u0131z sunucular<br>- **Federe Yap\u0131**: Instance\u2019lar\u0131n birbiriyle ileti\u015fim kurabilmesi<br>- **500 karakter limit**: Twitter\u2019dan daha uzun payla\u015f\u0131mlar<br>- **Reklams\u0131z Deneyim**: Ticari kayg\u0131lardan uzak platform<\/p><p>## Neden Bot Geli\u015ftirmeliyiz?<\/p><p>Mastodon botlar\u0131, platformun etkile\u015fimini art\u0131rmak ve otomatik i\u015flemler ger\u00e7ekle\u015ftirmek i\u00e7in \u00f6nemli ara\u00e7lard\u0131r. Botlar sayesinde:<\/p><p>1. Otomatik i\u00e7erik payla\u015f\u0131m\u0131 yapabilirsiniz<br>2. Belirli hashtag\u2019leri takip edebilirsiniz<br>3. Toplulu\u011funuzla otomatik etkile\u015fim kurabilirsiniz<br>4. \u0130statistikler toplayabilirsiniz<\/p><p>## Bot Geli\u015ftirme S\u00fcreci<\/p><p>### 1. Haz\u0131rl\u0131k A\u015famas\u0131<\/p><p>Bot geli\u015ftirmeye ba\u015flamadan \u00f6nce \u015funlara ihtiyac\u0131n\u0131z olacak:<\/p><p>- Python programlama dili<br>- Mastodon.py k\u00fct\u00fcphanesi<br>- Mastodon API eri\u015fim bilgileri<br>- Geli\u015ftirme ortam\u0131<\/p><p>### 2. API Eri\u015fimi Alma<\/p><p>1. Mastodon hesab\u0131n\u0131z\u0131n ayarlar\u0131na gidin<br>2. Geli\u015ftirme (Development) b\u00f6l\u00fcm\u00fcn\u00fc bulun<br>3. Yeni uygulama olu\u015fturun<br>4. \u015eu bilgileri not al\u0131n:<br>\u2014 Client ID<br>\u2014 Client Secret<br>\u2014 Access Token<\/p><p>### 3. Bot T\u00fcrleri<\/p><p>#### Basit Konsol Botu<br>Komut sat\u0131r\u0131ndan \u00e7al\u0131\u015fan, temel i\u015flevleri yerine getiren botlar.<\/p><p>#### GUI (Grafiksel Aray\u00fcz) Botu<br>Kullan\u0131c\u0131 dostu aray\u00fcze sahip, kontrol edilmesi kolay botlar.<\/p><p>#### Otomasyon Botu<br>7\/24 \u00e7al\u0131\u015fabilen, belirli g\u00f6revleri otomatik yapan botlar.<\/p><p>## \u0130yi Bot Geli\u015ftirme Pratikleri<\/p><p>### 1. Etik Kurallar<br>- Instance kurallar\u0131na uyun<br>- Spam yapmaktan ka\u00e7\u0131n\u0131n<br>- Kullan\u0131c\u0131 gizlili\u011fine sayg\u0131 g\u00f6sterin<\/p><p>### 2. Teknik En \u0130yi Uygulamalar<br>- Hata y\u00f6netimi implement edin<br>- Rate limiting kurallar\u0131na uyun<br>- Log tutun<br>- D\u00fczenli bak\u0131m yap\u0131n<\/p><p>### 3. G\u00fcvenlik \u00d6nlemleri<br>- API anahtarlar\u0131n\u0131 g\u00fcvende tutun<br>- HTTPS kullan\u0131n<br>- Kullan\u0131c\u0131 verilerini koruyun<\/p><p>## \u00d6rnek Kullan\u0131m Senaryolar\u0131<\/p><p>### 1. Topluluk Y\u00f6netimi<br>- Hashtag takibi<br>- Otomatik boost ve favori<br>- \u0130\u00e7erik moderasyonu<\/p><p>### 2. \u0130\u00e7erik Payla\u015f\u0131m\u0131<br>- Zamanlanm\u0131\u015f payla\u015f\u0131mlar<br>- RSS feed entegrasyonu<br>- Otomatik i\u00e7erik \u00fcretimi<\/p><p>### 3. Veri Analizi<br>- Etkile\u015fim istatistikleri<br>- Hashtag analizi<br>- Kullan\u0131c\u0131 aktivite takibi<\/p><p>\u00d6rnek Bir Python Projesi,<\/p><p>Bu GUI uygulamas\u0131 ile yapabilecekleriniz:<br><br>API Bilgileri B\u00f6l\u00fcm\u00fc:<br><br>Client ID, Client Secret ve Access Token bilgilerinizi girebilirsiniz<br>Instance URL'nizi belirleyebilirsiniz (varsay\u0131lan: mastodon.social)<br>\"Ba\u011flan\" butonu ile Mastodon hesab\u0131n\u0131za ba\u011flanabilirsiniz<br><br><br>Bot \u0130\u015flemleri B\u00f6l\u00fcm\u00fc:<br><br>Toot Payla\u015fma: Metin yaz\u0131p direkt payla\u015fabilirsiniz<br>Hashtag Takibi: \u0130stedi\u011finiz bir hashtag'i takip edebilirsiniz<br>\u0130\u015flem Se\u00e7imi: Bulunan tootlar\u0131 ya boost edebilir ya da favorilere ekleyebilirsiniz<br><br><br>Log Alan\u0131:<br><br>T\u00fcm i\u015flemlerin kayd\u0131n\u0131 buradan takip edebilirsiniz<br>Hatalar ve ba\u015far\u0131l\u0131 i\u015flemler burada g\u00f6r\u00fcnt\u00fclenir<br><br><br><br>Kullanmak i\u00e7in:<br><br>\u00d6nce gerekli k\u00fct\u00fcphaneleri y\u00fckleyin:<br><br>bashCopypip install Mastodon.py tkinter<br><br>API bilgilerinizi Mastodon'dan al\u0131n:<br><br>Mastodon hesab\u0131n\u0131z\u0131n ayarlar\u0131na gidin<br>\"Geli\u015ftirme\" b\u00f6l\u00fcm\u00fcne gidin<br>Yeni uygulama olu\u015fturun<br>Client ID, Client Secret ve Access Token bilgilerini al\u0131n<br><br><br>Program\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n ve API bilgilerinizi girin<br>\"Ba\u011flan\" butonuna t\u0131klay\u0131n<br>Art\u0131k toot payla\u015fabilir veya hashtag takibi yapabilirsiniz<br><br>Bot \u00f6rne\u011fin \u015funlar i\u00e7in kullan\u0131labilir:<br><br>Belirli bir konudaki payla\u015f\u0131mlar\u0131 otomatik boost etme<br>Toplulu\u011funuzla ilgili payla\u015f\u0131mlar\u0131 otomatik favorileme<br>D\u00fczenli i\u00e7erik payla\u015f\u0131m\u0131 yapmaimport tkinter as tk<br>from tkinter import ttk, scrolledtext, messagebox<br>from mastodon import Mastodon<br>import threading<br>import time<br><br>class MastodonGUIBot:<br>&nbsp; &nbsp; def __init__(self, root):<br>&nbsp; &nbsp; &nbsp; &nbsp; self.root = root<br>&nbsp; &nbsp; &nbsp; &nbsp; self.root.title(\"Mastodon Bot Kontrol Paneli\")<br>&nbsp; &nbsp; &nbsp; &nbsp; self.root.geometry(\"800x600\")<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; # Bot durumu<br>&nbsp; &nbsp; &nbsp; &nbsp; self.is_monitoring = False<br>&nbsp; &nbsp; &nbsp; &nbsp; self.monitor_thread = None<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; # API Bilgileri Frame<br>&nbsp; &nbsp; &nbsp; &nbsp; self.create_api_frame()<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; # \u0130\u015flemler Frame<br>&nbsp; &nbsp; &nbsp; &nbsp; self.create_actions_frame()<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; # Log Alan\u0131<br>&nbsp; &nbsp; &nbsp; &nbsp; self.create_log_area()<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; def create_api_frame(self):<br>&nbsp; &nbsp; &nbsp; &nbsp; api_frame = ttk.LabelFrame(self.root, text=\"API Bilgileri\", padding=\"10\")<br>&nbsp; &nbsp; &nbsp; &nbsp; api_frame.pack(fill=\"x\", padx=10, pady=5)<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; # API Bilgileri giri\u015fi<br>&nbsp; &nbsp; &nbsp; &nbsp; ttk.Label(api_frame, text=\"Client ID:\").grid(row=0, column=0, sticky=\"w\")<br>&nbsp; &nbsp; &nbsp; &nbsp; self.client_id_entry = ttk.Entry(api_frame, width=50)<br>&nbsp; &nbsp; &nbsp; &nbsp; self.client_id_entry.grid(row=0, column=1, padx=5, pady=2)<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; ttk.Label(api_frame, text=\"Client Secret:\").grid(row=1, column=0, sticky=\"w\")<br>&nbsp; &nbsp; &nbsp; &nbsp; self.client_secret_entry = ttk.Entry(api_frame, width=50)<br>&nbsp; &nbsp; &nbsp; &nbsp; self.client_secret_entry.grid(row=1, column=1, padx=5, pady=2)<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; ttk.Label(api_frame, text=\"Access Token:\").grid(row=2, column=0, sticky=\"w\")<br>&nbsp; &nbsp; &nbsp; &nbsp; self.access_token_entry = ttk.Entry(api_frame, width=50)<br>&nbsp; &nbsp; &nbsp; &nbsp; self.access_token_entry.grid(row=2, column=1, padx=5, pady=2)<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; ttk.Label(api_frame, text=\"Instance URL:\").grid(row=3, column=0, sticky=\"w\")<br>&nbsp; &nbsp; &nbsp; &nbsp; self.instance_url_entry = ttk.Entry(api_frame, width=50)<br>&nbsp; &nbsp; &nbsp; &nbsp; self.instance_url_entry.insert(0, \"https:\/\/mastodon.social\")<br>&nbsp; &nbsp; &nbsp; &nbsp; self.instance_url_entry.grid(row=3, column=1, padx=5, pady=2)<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; ttk.Button(api_frame, text=\"Ba\u011flan\", command=self.connect_mastodon).grid(row=4, column=1, pady=10)<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; def create_actions_frame(self):<br>&nbsp; &nbsp; &nbsp; &nbsp; actions_frame = ttk.LabelFrame(self.root, text=\"Bot \u0130\u015flemleri\", padding=\"10\")<br>&nbsp; &nbsp; &nbsp; &nbsp; actions_frame.pack(fill=\"x\", padx=10, pady=5)<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; # Toot Payla\u015fma<br>&nbsp; &nbsp; &nbsp; &nbsp; ttk.Label(actions_frame, text=\"Toot Metni:\").grid(row=0, column=0, sticky=\"w\")<br>&nbsp; &nbsp; &nbsp; &nbsp; self.toot_entry = ttk.Entry(actions_frame, width=50)<br>&nbsp; &nbsp; &nbsp; &nbsp; self.toot_entry.grid(row=0, column=1, padx=5, pady=2)<br>&nbsp; &nbsp; &nbsp; &nbsp; ttk.Button(actions_frame, text=\"Payla\u015f\", command=self.post_toot).grid(row=0, column=2, padx=5)<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; # Hashtag Takibi<br>&nbsp; &nbsp; &nbsp; &nbsp; ttk.Label(actions_frame, text=\"Takip Edilecek Hashtag:\").grid(row=1, column=0, sticky=\"w\")<br>&nbsp; &nbsp; &nbsp; &nbsp; self.hashtag_entry = ttk.Entry(actions_frame, width=50)<br>&nbsp; &nbsp; &nbsp; &nbsp; self.hashtag_entry.grid(row=1, column=1, padx=5, pady=2)<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; self.monitor_button = ttk.Button(actions_frame, text=\"Takibi Ba\u015flat\", command=self.toggle_monitoring)<br>&nbsp; &nbsp; &nbsp; &nbsp; self.monitor_button.grid(row=1, column=2, padx=5)<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; # \u0130\u015flem Se\u00e7imi<br>&nbsp; &nbsp; &nbsp; &nbsp; ttk.Label(actions_frame, text=\"\u0130\u015flem:\").grid(row=2, column=0, sticky=\"w\")<br>&nbsp; &nbsp; &nbsp; &nbsp; self.action_var = tk.StringVar(value=\"boost\")<br>&nbsp; &nbsp; &nbsp; &nbsp; ttk.Radiobutton(actions_frame, text=\"Boost\", variable=self.action_var, value=\"boost\").grid(row=2, column=1, sticky=\"w\")<br>&nbsp; &nbsp; &nbsp; &nbsp; ttk.Radiobutton(actions_frame, text=\"Favori\", variable=self.action_var, value=\"favorite\").grid(row=2, column=1, sticky=\"e\")<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; def create_log_area(self):<br>&nbsp; &nbsp; &nbsp; &nbsp; log_frame = ttk.LabelFrame(self.root, text=\"Log\", padding=\"10\")<br>&nbsp; &nbsp; &nbsp; &nbsp; log_frame.pack(fill=\"both\", expand=True, padx=10, pady=5)<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; self.log_area = scrolledtext.ScrolledText(log_frame, wrap=tk.WORD, height=10)<br>&nbsp; &nbsp; &nbsp; &nbsp; self.log_area.pack(fill=\"both\", expand=True)<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; def log(self, message):<br>&nbsp; &nbsp; &nbsp; &nbsp; self.log_area.insert(tk.END, f\"{message}\\n\")<br>&nbsp; &nbsp; &nbsp; &nbsp; self.log_area.see(tk.END)<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; def connect_mastodon(self):<br>&nbsp; &nbsp; &nbsp; &nbsp; try:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.mastodon = Mastodon(<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client_id=self.client_id_entry.get(),<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client_secret=self.client_secret_entry.get(),<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; access_token=self.access_token_entry.get(),<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; api_base_url=self.instance_url_entry.get()<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.log(\"Mastodon'a ba\u015far\u0131yla ba\u011flan\u0131ld\u0131!\")<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; messagebox.showinfo(\"Ba\u015far\u0131l\u0131\", \"Mastodon'a ba\u011flant\u0131 kuruldu!\")<br>&nbsp; &nbsp; &nbsp; &nbsp; except Exception as e:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.log(f\"Ba\u011flant\u0131 hatas\u0131: {str(e)}\")<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; messagebox.showerror(\"Hata\", \"Ba\u011flant\u0131 kurulamad\u0131!\")<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; def post_toot(self):<br>&nbsp; &nbsp; &nbsp; &nbsp; if hasattr(self, 'mastodon'):<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.mastodon.status_post(self.toot_entry.get())<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.log(f\"Toot payla\u015f\u0131ld\u0131: {self.toot_entry.get()}\")<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.toot_entry.delete(0, tk.END)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; except Exception as e:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.log(f\"Toot payla\u015fma hatas\u0131: {str(e)}\")<br>&nbsp; &nbsp; &nbsp; &nbsp; else:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; messagebox.showwarning(\"Uyar\u0131\", \"\u00d6nce Mastodon'a ba\u011flan\u0131n!\")<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; def monitor_hashtag(self):<br>&nbsp; &nbsp; &nbsp; &nbsp; while self.is_monitoring:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; toots = self.mastodon.timeline_hashtag(self.hashtag_entry.get())<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for toot in toots:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if self.action_var.get() == \"boost\":<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.mastodon.status_reblog(toot)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.log(f\"Toot boost edildi: {toot}\")<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.mastodon.status_favourite(toot)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.log(f\"Toot favorilere eklendi: {toot}\")<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; except Exception as e:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.log(f\"\u0130\u015flem hatas\u0131: {str(e)}\")<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time.sleep(300) &nbsp;# 5 dakika bekle<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; except Exception as e:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.log(f\"Hashtag takip hatas\u0131: {str(e)}\")<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time.sleep(60)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; def toggle_monitoring(self):<br>&nbsp; &nbsp; &nbsp; &nbsp; if not hasattr(self, 'mastodon'):<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; messagebox.showwarning(\"Uyar\u0131\", \"\u00d6nce Mastodon'a ba\u011flan\u0131n!\")<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; if not self.is_monitoring:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.is_monitoring = True<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.monitor_button.config(text=\"Takibi Durdur\")<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.hashtag_entry.config(state=\"disabled\")<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.monitor_thread = threading.Thread(target=self.monitor_hashtag)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.monitor_thread.start()<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.log(f\"#{self.hashtag_entry.get()} hashtag'i takip ediliyor...\")<br>&nbsp; &nbsp; &nbsp; &nbsp; else:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.is_monitoring = False<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.monitor_button.config(text=\"Takibi Ba\u015flat\")<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.hashtag_entry.config(state=\"normal\")<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.log(\"Hashtag takibi durduruldu.\")<br><br>if __name__ == \"__main__\":<br>&nbsp; &nbsp; root = tk.Tk()<br>&nbsp; &nbsp; app = MastodonGUIBot(root)<br>&nbsp; &nbsp; root.mainloop()<\/p><p><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*hn6CTRphlGwrLNQU-RdJdA.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*hn6CTRphlGwrLNQU-RdJdA.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*hn6CTRphlGwrLNQU-RdJdA.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*hn6CTRphlGwrLNQU-RdJdA.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*hn6CTRphlGwrLNQU-RdJdA.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*hn6CTRphlGwrLNQU-RdJdA.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*hn6CTRphlGwrLNQU-RdJdA.png 1400w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*hn6CTRphlGwrLNQU-RdJdA.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*hn6CTRphlGwrLNQU-RdJdA.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*hn6CTRphlGwrLNQU-RdJdA.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*hn6CTRphlGwrLNQU-RdJdA.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*hn6CTRphlGwrLNQU-RdJdA.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*hn6CTRphlGwrLNQU-RdJdA.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*hn6CTRphlGwrLNQU-RdJdA.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"><img src=\"https:\/\/miro.medium.com\/v2\/resize:fit:700\/1*hn6CTRphlGwrLNQU-RdJdA.png\" alt=\"\"><\/picture><\/p><p>\u00f6rnek #<a href=\"https:\/\/medium.com\/u\/6d9738a375c1?source=post_page---user_mention--be5e8cbc8d6b--------------------------------\">Antalya<\/a> tag i ile ilgili yaz\u0131lar\u0131 sayfada payla\u015fmaya ba\u015fad\u0131\u011f\u0131n\u0131 g\u00f6rebiliyoruz<\/p><p><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*_AXwVQkovJ4QMVPc5EeOlg.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*_AXwVQkovJ4QMVPc5EeOlg.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*_AXwVQkovJ4QMVPc5EeOlg.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*_AXwVQkovJ4QMVPc5EeOlg.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*_AXwVQkovJ4QMVPc5EeOlg.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*_AXwVQkovJ4QMVPc5EeOlg.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1184\/format:webp\/1*_AXwVQkovJ4QMVPc5EeOlg.png 1184w\" type=\"image\/webp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 592px\"><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*_AXwVQkovJ4QMVPc5EeOlg.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*_AXwVQkovJ4QMVPc5EeOlg.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*_AXwVQkovJ4QMVPc5EeOlg.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*_AXwVQkovJ4QMVPc5EeOlg.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*_AXwVQkovJ4QMVPc5EeOlg.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*_AXwVQkovJ4QMVPc5EeOlg.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1184\/1*_AXwVQkovJ4QMVPc5EeOlg.png 1184w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 592px\"><img src=\"https:\/\/miro.medium.com\/v2\/resize:fit:592\/1*_AXwVQkovJ4QMVPc5EeOlg.png\" alt=\"\"><\/picture><\/p><p>Mastodon, merkezi olmayan yap\u0131s\u0131 ve \u00f6zg\u00fcr ruhuyla sosyal medyan\u0131n gelece\u011fini temsil ediyor. Bot geli\u015ftirme ise bu platformda topluluk olu\u015fturma ve y\u00f6netme konusunda b\u00fcy\u00fck kolayl\u0131klar sa\u011fl\u0131yor. Do\u011fru yakla\u015f\u0131m ve etik kurallarla geli\u015ftirilen botlar, Mastodon ekosisteminin de\u011ferli bir par\u00e7as\u0131 olabilir.<\/p><p>## Kaynaklar<\/p><p>- Mastodon Resmi Dok\u00fcmantasyon<br>- Mastodon.py GitHub Sayfas\u0131<br>- Python Bot Geli\u015ftirme Kaynaklar\u0131<br>- Mastodon API Dok\u00fcmantasyonu<\/p><p>\u2014 -<\/p><p>Bu rehber size Mastodon ve bot geli\u015ftirme konusunda temel bir bak\u0131\u015f a\u00e7\u0131s\u0131 sunmay\u0131 ama\u00e7lamaktad\u0131r. Daha detayl\u0131 bilgi i\u00e7in resmi dok\u00fcmantasyonu incelemenizi ve topluluk forumlar\u0131n\u0131 takip etmenizi \u00f6neririz.<\/p>","excerpt":"Sosyal medya d\u00fcnyas\u0131nda merkezi olmayan, \u00f6zg\u00fcr ve a\u00e7\u0131k kaynakl\u0131 bir platform ar\u0131yorsan\u0131z, Mastodon tam size g\u00f6re. Bu yaz\u0131da Mastodon\u2019u tan\u0131yacak ve Python kullanarak nas\u0131l bot geli\u015ftirebilece\u011fimizi \u00f6\u011frenece\u011fiz.","created_at":"2024-12-30 11:43:02","updated_at":"2026-09-23 11:38:05","category_id":9,"view_count":608,"reading_time":12,"status":"published","editor_choice":0,"is_editor_choice":0,"published_at":"2024-12-30 11:43:02","featured_image":"resimyok.jpg","slug":"mastodon-a-giris-ve-bot-gelistirme-rehberi","category_name":"Yaz\u0131l\u0131m","category_slug":"yazilim","category_color":"#ef4444"}