adm12
KOD Aşağıdadır. ilgili model dosyası 3.65 gb boyutundadır ve diğer whldosyalarınıda indirmeniz gerekmektedir. resimde ki model dosyalarıdır.

kod:
import os
import sys
import time
import random
import requests
import mysql.connector
from datetime import datetime
import threading
import tkinter as tk
from tkinter import ttk
from bs4 import BeautifulSoup
import warnings
GPT4All Python wrapper
from gpt4all import GPT4All
warnings.filterwarnings("ignore", message="Unverified HTTPS request")
================ AYARLAR ================
FORUM_BASE_URL = "buraya forum adresini yazınız (ör. http://localhost/mybb)"
VERIFY_SSL = False # True/False tercihinize göre
ADMIN_USERNAME = "buraya admin kullanıcı adını yazınız"
ADMIN_PASSWORD = "buraya admin şifresini yazınız"
DB_HOST = "buraya veritabanı hostunu yazınız"
DB_USER = "buraya veritabanı kullanıcı adını yazınız"
DB_PASSWORD = "buraya veritabanı şifresini yazınız"
DB_NAME = "buraya veritabanı adını yazınız"
TABLE_PREFIX = "buraya tablo ön ekini yazınız (ör. mybb_)"
INTERVAL_SECONDS = 300 # saniye
👉 Model klasörünüz ve dosya adınız
MODEL_DIR = r"buraya model klasörünüzün tam yolunu yazınız"
MODEL_NAME = "buraya model dosya adını yazınız (ör. ggml-gpt4all-j-v1.3-groovy.bin)"
SYSTEM_PROMPT = (
"Sen deneyimli bir yazılım geliştiricisin. Türkçe yazılım forumu için "
"yararlı, ilgi çekici ve detaylı konular oluşturmalısın. Konularında "
"kendini iyi bir şekilde ifade etmeli, gerekirse kod örnekleri vermeli ve "
"teknik detaylara yer vermelisin."
)
USER_PROMPT_TEMPLATE = (
"Forum konusu: {forum_name}\n"
"Yukarıdaki konuda, özgün bir başlık ve en az 5 paragraf uzunluğunda, "
"detaylı bir açıklama ile tam bir forum konusu oluştur. "
"İlk satırda 'Konu Başlığı', devamında 'Konu İçeriği' olacak şekilde "
"tam bir metin üret. Gerekirse kod örnekleri de ekle."
)
=========================================
def gpt4all_local_generate(prompt_text, n_predict=512, temp=0.7):
"""
GPT4All wrapper ile .bin model dosyasından metin üretir.
"""
try:
model = GPT4All(
model_name=MODEL_NAME,
model_path=MODEL_DIR,
allow_download=False,
verbose=False
)
model.open()
output = ""
for tok in model.generate(
prompt_text,
n_predict=n_predict,
temp=temp,
top_k=40,
top_p=0.9
):
output += tok
model.close()
return output.strip()
except Exception as e:
print(f"[HATA] Model kullanımında hata: {e}")
return None
def get_db_connection():
return mysql.connector.connect(
host=DB_HOST, user=DB_USER, password=DB_PASSWORD, database=DB_NAME
)
def get_forums_from_db():
try:
conn = get_db_connection()
cursor = conn.cursor(dictionary=True)
cursor.execute(f"SELECT fid, name FROM {TABLE_PREFIX}forums WHERE type='f'")
forums = cursor.fetchall()
cursor.close()
conn.close()
return forums
except mysql.connector.Error as err:
print(f"[HATA] DB bağlantı hatası: {err}")
return []
def generate_topic_content(forum_name):
prompt = SYSTEM_PROMPT + "\n\n" + USER_PROMPT_TEMPLATE.format(forum_name=forum_name)
return gpt4all_local_generate(prompt)
def log_topic(forum_name, subject, message):
try:
with open("topic_log.txt", "a", encoding="utf-8") as f:
f.write(f"{datetime.now()} - Forum: {forum_name}\nBaşlık: {subject}\n{message}\n\n")
except IOError as e:
print(f"[HATA] Log yazılırken hata: {e}")
def login_mybb(username, password):
s = requests.Session()
s.verify = VERIFY_SSL
s.headers.update({"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"})
# 1) Login formunu al
r = s.get(f"{FORUM_BASE_URL}/member.php?action=login")
if r.status_code != 200:
print(f"[HATA] Login sayfası alınamadı: {r.status_code}")
return None
soup = BeautifulSoup(r.text, "html.parser")
key = soup.find("input", {"name": "my_post_key"})
if not key or not key.get("value"):
print("[HATA] my_post_key bulunamadı.")
return None
# 2) Doğru URL’e post et
payload = {
"action": "do_login",
"url": "",
"my_post_key": key["value"],
"username": username,
"password": password,
"remember": "yes",
"submit": "Giriş Yap"
}
post_url = f"{FORUM_BASE_URL}/member.php?action=do_login"
r2 = s.post(post_url, data=payload, allow_redirects=True)
# 3) Başarılıysa anasayfada logout linki olacaktır
home = s.get(FORUM_BASE_URL)
txt = home.text.lower()
if "action=logout" in txt or "logout.php" in txt:
print("[OK] Oturum açıldı. (Admin login başarılı)")
return s
print("[HATA] Giriş başarısız.")
return None
def post_new_thread(session, fid, subject, message):
try:
r = session.get(f"{FORUM_BASE_URL}/newthread.php?fid={fid}")
if r.status_code != 200:
print(f"[HATA] newthread sayfası: {r.status_code}")
return False
soup = BeautifulSoup(r.text, "html.parser")
key = soup.find("input", {"name": "my_post_key"})
if not key or not key.get("value"):
print("[HATA] newthread my_post_key bulunamadı.")
return False
data = {
"my_post_key": key["value"],
"subject": subject,
"message": message,
"action": "do_newthread",
"submit": "Konu Gönder"
}
r2 = session.post(
f"{FORUM_BASE_URL}/newthread.php?fid={fid}",
data=data, allow_redirects=True
)
if "mesajınız başarıyla gönderildi" in r2.text.lower():
print("[OK] Yeni konu açıldı.")
return True
print("[HATA] Konu açılamadı.")
except requests.RequestException as e:
print(f"[HATA] HTTP isteği hatası: {e}")
return False
class BotGUI(tk.Tk):
def init(self):
super().init()
self.title("Forum Botu (MyBB / GPT4All)")
self.geometry("700x500")
self.forum_listbox = tk.Listbox(self, height=8)
self.forum_listbox.pack(fill=tk.BOTH, padx=10, pady=5)
self.memo_text = tk.Text(self, height=12)
self.memo_text.pack(fill=tk.BOTH, padx=10, pady=5, expand=True)
self.progressbar = ttk.Progressbar(self, maximum=INTERVAL_SECONDS, mode='determinate')
self.progressbar.pack(fill=tk.X, padx=10, pady=5)
self.countdown_var = tk.StringVar()
ttk.Label(self, textvariable=self.countdown_var).pack(pady=5)
self.status_var = tk.StringVar()
ttk.Label(self, textvariable=self.status_var, relief=tk.SUNKEN, anchor=tk.W)\
.pack(side=tk.BOTTOM, fill=tk.X)
ttk.Button(self, text="Giriş Yap (Admin)", command=self.do_login).pack(pady=5)
ttk.Button(self, text="Forumları Yükle", command=self.load_forums).pack(pady=5)
self.control_button = ttk.Button(self, text="Botu Başlat",
command=self.toggle_bot, state="disabled")
self.control_button.pack(pady=5)
self.bot_running = False
self.session = None
def do_login(self):
self.status_var.set("Giriş yapılıyor…")
sess = login_mybb(ADMIN_USERNAME, ADMIN_PASSWORD)
if sess:
self.session = sess
self.status_var.set("Giriş başarılı.")
self.control_button.config(state="normal")
else:
self.status_var.set("Giriş başarısız.")
def load_forums(self):
self.status_var.set("Forumlar yükleniyor…")
self.forum_listbox.delete(0, tk.END)
forums = get_forums_from_db()
if forums:
for f in forums:
self.forum_listbox.insert(tk.END, f"{f['fid']} – {f['name']}")
self.status_var.set(f"{len(forums)} forum yüklendi.")
else:
self.status_var.set("Forum bulunamadı veya DB hatası.")
def toggle_bot(self):
self.bot_running = not self.bot_running
self.control_button.config(
text="Botu Durdur" if self.bot_running else "Botu Başlat"
)
if self.bot_running:
threading.Thread(target=self.run_bot_loop, daemon=True).start()
else:
self.status_var.set("Bot durduruldu.")
def run_bot_loop(self):
if not self.session:
self.safe_status("Önce giriş yapın.")
return
while self.bot_running:
self.safe_status("Forumlar çekiliyor…")
forums = get_forums_from_db()
if not forums:
self.safe_status("Forum yok, bekleniyor…")
time.sleep(INTERVAL_SECONDS)
continue
fid, fname = random.choice(forums).values()
self.safe_status(f"'{fname}' için içerik üretiliyor…")
txt = generate_topic_content(fname)
if not txt:
self.safe_status("Üretilmedi, tekrar denenecek…")
time.sleep(INTERVAL_SECONDS)
continue
parts = txt.split("\n", 1)
subj = parts[0].strip()
msg = parts[1].strip() if len(parts) > 1 else ""
self.safe_status(f"Konu açılıyor: {subj}")
if post_new_thread(self.session, fid, subj, msg):
self.safe_status("Başarılı.")
log_topic(fname, subj, msg)
self.safe_memo(f"[{datetime.now()}] {fname} → {subj}")
else:
self.safe_status("Açılamadı.")
for rem in range(INTERVAL_SECONDS, 0, -1):
if not self.bot_running: break
self.safe_progress(INTERVAL_SECONDS - rem)
mm, ss = divmod(rem, 60)
self.safe_countdown(f"Kalan: {mm:02d}:{ss:02d}")
time.sleep(1)
def safe_status(self, txt): self.after(0, self.status_var.set, txt)
def safe_progress(self, v): self.after(0, lambda: self.progressbar.config(value=v))
def safe_countdown(self, txt): self.after(0, self.countdown_var.set, txt)
def safe_memo(self, txt):
self.after(0, lambda: (self.memo_text.insert(tk.END, txt+"\n"),
self.memo_text.see(tk.END)))
if name == "main":
Model dosyası kontrolü
if not os.path.isdir(MODEL_DIR) or not os.path.isfile(os.path.join(MODEL_DIR, MODEL_NAME)):
print(f"[HATA] Model bulunamadı: {os.path.join(MODEL_DIR, MODEL_NAME)}")
sys.exit(1)
app = BotGUI()
app.mainloop()