Bengu
Yeni Üye
import requests
import random
import pyautogui
import pyperclip
import re
import xml.etree.ElementTree as ET
import logging
import shutil
import webbrowser
import os
import time
import sys
pyautogui.FAILSAFE = False
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
SITE_LIST_FILE = r"C:UsersKullanıcıDesktopyanitsite.txt"
API_FILE = r"C:UsersKullanıcıDesktopyanitapi.txt"
YANIT_DIR = r"C:UsersKullanıcıDesktopyanit"
LOG_FILE_PATH = os.path.join(YANIT_DIR, "log.txt")
YANIT_FILE_PATH = os.path.join(YANIT_DIR, "yanit_file.txt")
TAMAM_DIR = os.path.join(YANIT_DIR, "tamamlandi")
MAX_PROMPT_COUNT = 10
ilk_sefer = True
STOP_PHRASE = "Bu mesaja 500 kelimeyi geçmeyecek şekilde yanıt ver."
def normalize_url(url):
return re.sub(r'^(https?://)?(www.)?', '', url.strip().lower()).rstrip('/')
def read_file_lines(file_path):
try:
with open(file_path, 'r', encoding='utf-8') as f:
return [line.strip() for line in f if line.strip()]
except:
return []
def clean_content(text):
# Köşeli parantez içindeki yerleri geçici olarak maskele
brackets = re.findall(r'[[^]]*]', text)
placeholders = [f"__PLACEHOLDER_{i}__" for i in range(len(brackets))]
for i, bracket in enumerate(brackets):
text = text.replace(bracket, placeholders, 1)
# ** ve karakterlerini temizle (ama köşeli parantez dışında)
text = re.sub(r'+', '', text) # Tüm karakterlerini sil
text = re.sub(r'*{2}', '', text) # Çift yıldızları sil
# Boşlukları normalize et
text = re.sub(r's+', ' ', text)
# Köşeli parantez içeriğini geri koy
for i, placeholder in enumerate(placeholders):
text = text.replace(placeholder, brackets, 1)
return text.strip()
def parse_rss_feed(rss_url):
try:
resp = requests.get(rss_url, timeout=30)
resp.raise_for_status()
root = ET.fromstring(resp.content)
item = root.find("channel").find("item")
if item is not None:
content_raw = item.find("{http://purl.org/rss/1.0/modules/content/}encoded")
content_text = content_raw.text if content_raw is not None else ""
link = item.find("link").text.strip()
title = item.find("title").text.strip()
creator = item.find("{http://purl.org/dc/elements/1.1/}creator").text.strip()
match = re.search(r'.(d+)(?:/|$)', link)
thread_id = match.group(1) if match else None
if not thread_id:
logging.error(f"Konu ID'si alınamadı: {link}")
return None
return {
"title": title,
"link": link,
"creator": creator,
"content": clean_content(content_text),
"thread_id": thread_id
}
except Exception as e:
logging.error(f"RSS parse hatası: {e}")
return None
def is_content_duplicate(content_preview):
try:
with open(LOG_FILE_PATH, 'r', encoding='utf-8') as f:
return content_preview in f.read()
except:
return False
def select_random_api(api_list, exclude_user, site, used_users):
norm_site = normalize_url(site)
available = [api for api in api_list
if len(api) == 3
and norm_site in normalize_url(api[0])
and api[1] != exclude_user
and api[1] not in used_users]
return random.choice(available) if available else None
def send_reply(api_url, api_user, api_key, thread_id, reply_text):
headers = {
"Content-type": "application/x-www-form-urlencoded",
"XF-Api-User": api_user,
"XF-Api-Key": api_key
}
data = {
"thread_id": thread_id,
"message": reply_text
}
logging.info(f"API isteği gönderiliyor... ID: {thread_id}")
try:
response = requests.post(api_url, headers=headers, data=data, timeout=30)
if response.status_code == 200:
if os.path.exists(YANIT_FILE_PATH):
shutil.copy(YANIT_FILE_PATH,
os.path.join(TAMAM_DIR, f"yanit_{thread_id}_{api_user}.txt"))
logging.info(f"Yanıt başarıyla gönderildi: {api_user}")
else:
logging.warning(f"Yanıt gönderilemedi {api_user} - {response.status_code} - {response.text}")
except Exception as e:
logging.error(f"API gönderim hatası: {e}")
def is_tab_chatgpt(index):
switch_to_tab(index)
time.sleep(1)
pyautogui.hotkey('ctrl', 'l')
time.sleep(0.5)
pyautogui.hotkey('ctrl', 'c')
url = pyperclip.paste().strip()
return url.startswith("https://chat.openai.com")
def open_needed_tabs(count):
for i in range(1, count + 1):
if not is_tab_chatgpt(i):
webbrowser.open_new_tab("https://chat.openai.com")
time.sleep(4)
def run_prompt_on_tab(tab_index, prompt_text):
switch_to_tab(tab_index)
pyautogui.hotkey('esc', 'shift')
time.sleep(2)
pyperclip.copy(prompt_text)
pyautogui.hotkey('ctrl', 'v')
pyautogui.press("enter")
logging.info(f"{tab_index}. sekmede prompt gönderildi.")
time.sleep(2)
def get_response_from_tab(tab_index):
switch_to_tab(tab_index)
pyautogui.hotkey('alt', 'z')
time.sleep(2)
pyautogui.hotkey('alt', 'c') # içerik kopyalanıyor
time.sleep(2)
raw_text = pyperclip.paste()
return clean_content(raw_text)
def cleanup_tab():
pyautogui.hotkey('ctrl', 'shift', 'backspace')
time.sleep(2)
pyautogui.press('enter')
time.sleep(2)
pyautogui.press('f5')
time.sleep(5)
def close_tab():
pyautogui.hotkey('ctrl', 'w')
time.sleep(1)
def switch_to_tab
:
pyautogui.hotkey('ctrl', str
)
time.sleep(2)
def ensure_log():
if not os.path.exists(LOG_FILE_PATH):
open(LOG_FILE_PATH, 'w', encoding='utf-8').close()
def generate_prompts(site, title, content, creator):
base = (f"{site} sitesinde, '{title}' başlıklı konuda @{creator} adlı kullanıcı şöyle yazmış: "
f"{content[:450]}... Bu mesaja 500 kelimeyi geçmeyecek şekilde yanıt ver. "
"yanıt verirken eğer gerek varsa bu etiketleri kullan "
" . "
"cevap yazarken direkt olarak cevabı yaz, yazdım yazıyorum, işte makalen, "
"yanıtın burada, daha fazla yazabilirim gibi gereksiz hiçbir şey yazma.")
templates = [
f"{base} @{creator} adlı üyeye forumunda teknik bir konuda yanıtlarken, analitik ve metotlu bir mühendis gibi düşünür, sorunları katman katman inceler, net ve sistematik adımlarla açıklar, karmaşıklıkları O(log n) vs O
analizleriyle görselleştirir, kod blokları ve diyagramlarla destekler, arada “şöyle bak” gibi doğal sohbet ifadeleri kullanır; kişilik olarak sabah erken kalkıp filtresi güçlü kahvesini yudumlamayı seven, plana sadık kalarak ilerlemeyi tercih eden, detaylarda huzur bulan biri.",
f"{base} @{creator} adlı üyenin açtığı konuda, deneyim dolu ve hafif alaycı ama yardımsever bir veteran mottosuyla cevap verirsin; nostaljik donanım hikâyeleri ve @{creator} etiketliyerek “eskiden şöyleydi” dokunuşlarıyla akıcı bir sohbet havası yakalarsın; kişilik olarak geçmiş deneyimlere tutkuyla bağlı, gençlerle sohbet ederken mentor gibi davranmaktan keyif alan, boş lafı sevmezseniz bile hafif espriyle yaklaşıp dostane rehberlik sunan bir kullanıcısın.",
f"{base} @{creator} adlı tartışmaya, meraklı ve eleştirel bir analiz uzmanı edasıyla katılırsın; argümanları istatistiksel bir mercekten test eder, ince mizah ve metaforlarla süslersin, arada günlük yaşamdan ufak kesitler paylaşarak insan gibi sohbet edersin; kişilik olarak her bulmacayı çözmekten büyük haz alan, kahvesini damak tadına göre tercih eden, hem içe dönük gözlemci hem klavye başında enerjik bir zihin yapısına sahipsin.",
f"{base} @{creator} tarafından açılan konuya, enerjik ve spontane bir genç ruhuyla katılırsın; dağınık içsel monologlar ve pop kültür referanslarıyla hareket edersin, sonra “neyse, konumuza dönelim” diyerek bilgiyi samimi bir arkadaş sohbeti gibi sunarsın; kişilik olarak hızlı düşünmeyi seven, birden çok fikri aynı anda taşıyan, dışarıdan bakınca dağınık ama içten ve yaratıcı biri olarak tanınırsın.",
f"{base} @{creator} tarafından başlatılan konuya, empatik ve sezgisel bir spiritüel meraklı gibi yanıt verirsin; teknik tıkanmaları mistik metaforlarla zihnin durağanlığına benzetir, “bir nefes al, kodun ritmini hisset” gibi @{creator} etiketliyerek sıcak ifadelerle derin bir sohbet havası yaratırsın; kişilik olarak doğayla uyumu önemseyen, meditasyonu günlük rutinine dahil eden, her soruna bütüncül bakmaktan keyif alan bir keşifçi gibisin.",
f"{base} @{creator} adlı forum üyesinin başlığında, duygusal ve içten bir dostmuşsun gibi davranırsın; ev yaşamından samimi anektodlar paylaşır, teknik detayları kalbe dokunan metaforlarla anlatır, “ben de benzerini yaşadım” demeden güçlü bir empati yakalarsın; kişilik olarak fedakâr, sosyal ilişkilerde derin bağlar kurmaya önem veren, başkalarının duygularını hisseden ve onlara rehberlik etmekten haz duyan bir insansın.",
f"{base} @{creator} tarafından açılan konuya, sabrı son noktasına kadar zorlanmış ama adaletli bir kullanıcı tavrıyla yanıt verirsin; “bunu kaç kere konuşacağız?” der gibi doğrudan ve net ifade eder, çıkış yaparken bile arkadaşça bir samimiyet taşır, teknik hataları sistematikçe çürütürsün; kişilik olarak kusursuzluk peşinde koşan, belirsizlikten rahatsız olan ve adaleti savunmaktan geri durmayan bir karakterin var.",
f"{base} @{creator} adlı üyeye, akademik ve sorgulayıcı bir araştırmacı gibi yaklaşır, “biraz akademik gelebilir ama” diye ısındırma yapar, hipotez-test-analiz döngüsünü adım adım açıklar, referansları samimi yorumlarla sunar, ciddiyetle dostça sohbet edersin; kişilik olarak meraklı, bilimsel yönteme tutkuyla bağlı, dipnotlarıyla bile okuyucuyu sıkmadan bilgilendiren bir entelektüelsin.",
f"{base} @{creator} tarafından başlatılan konuya, tecrübeli ve yol gösterici bir ağabey/abla gibi yanıt verirsin; eski günlerden samimi hikâyeler paylaşır, pratik çözüm adımlarını tıpkı telefonda dertleşir gibi @{creator} etiketliyerek anlatır, sıcak ve güven verici bir dil kullanırsın; kişilik olarak sabırlı, insanlara yardım etmeyi hayat felsefesi haline getirmiş, güvenilir bir rehberlik figürüsün.",
f"{base} @{creator} tarafından forumda açılan tartışmaya, yaratıcı ve absürt bir mantık ustası gibi katılırsın; beklenmedik benzetmelerle teknik detayı mizahi bir sohbet havasına serpiştirir, okuyana hem güldürür hem düşündürürsün; kişilik olarak kuralları eğip bükmeyi seven, özgür düşünceyi mizahla harmanlayan, renkli ve sıra dışı bir hayal gücüne sahipsin."
]
return templates
def main():
global ilk_sefer
ensure_log()
while True:
try:
sekme_sayisi = int(input(f"Kaç sekmede çalışılsın? (1-{MAX_PROMPT_COUNT}): "))
if not 1 <= sekme_sayisi <= MAX_PROMPT_COUNT:
raise ValueError
break
except:
print("Geçerli bir sayı gir (1-10 arası).")
if ilk_sefer:
open_needed_tabs(sekme_sayisi)
ilk_sefer = False
api_list_raw = read_file_lines(API_FILE)
api_list = [line.split(" | ") for line in api_list_raw if len(line.split(" | ")) == 3]
consecutive_bad = 0 # üst üste STOP_PHRASE içeren sekme sayısı
while True:
site_list = read_file_lines(SITE_LIST_FILE)
random.shuffle(site_list) # HER TURDA site.txt rastgele sıraya girer
for site in site_list:
rss_url = f"{site}/forums/-/index.rss"
topic = parse_rss_feed(rss_url)
if not topic:
continue
title = topic["title"]
link = topic["link"]
creator = topic["creator"]
content = topic["content"]
thread_id = topic["thread_id"]
if is_content_duplicate(content):
logging.info(f"Tekrarlanan içerik: {title}")
continue
used_users = set()
all_templates = generate_prompts(site, title, content, creator)
if len(all_templates) < sekme_sayisi:
logging.error("Prompt şablon sayısı, sekme sayısından az!")
return
prompts = random.sample(all_templates, sekme_sayisi)
# Her sekmede rastgele seçilen prompt'lar
for i in range(sekme_sayisi):
run_prompt_on_tab(i + 1, prompts)
time.sleep(20)
# Yanıtları alma ve gönderme
for i in range(sekme_sayisi):
reply = get_response_from_tab(i + 1)
if STOP_PHRASE in reply:
consecutive_bad += 1
logging.warning(f"{i+1}. sekme STOP_PHRASE içeriyor, kapatılıyor.")
switch_to_tab(i + 1)
close_tab()
continue
else:
consecutive_bad = 0 # reset
api = select_random_api(api_list, creator, site, used_users)
if api:
api_url, api_user, api_key = api
send_reply(api_url, api_user, api_key, thread_id, reply)
used_users.add(api_user)
cleanup_tab()
else:
logging.warning(f"Uygun API bulunamadı: {site}")
if consecutive_bad >= 2:
logging.error("İki sekme üst üste STOP_PHRASE içerdi. Bot durduruluyor.")
os.system("taskkill /IM chrome.exe /F")
sys.exit(0)
with open(LOG_FILE_PATH, 'a', encoding='utf-8') as f:
f.write(content + "n")
switch_to_tab(1)
time.sleep(6)
logging.info("Tüm siteler tamamlandı, 3 dakika bekleniyor.")
time.sleep(180)
if __name__ == "__main__":
main()
import random
import pyautogui
import pyperclip
import re
import xml.etree.ElementTree as ET
import logging
import shutil
import webbrowser
import os
import time
import sys
pyautogui.FAILSAFE = False
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
SITE_LIST_FILE = r"C:UsersKullanıcıDesktopyanitsite.txt"
API_FILE = r"C:UsersKullanıcıDesktopyanitapi.txt"
YANIT_DIR = r"C:UsersKullanıcıDesktopyanit"
LOG_FILE_PATH = os.path.join(YANIT_DIR, "log.txt")
YANIT_FILE_PATH = os.path.join(YANIT_DIR, "yanit_file.txt")
TAMAM_DIR = os.path.join(YANIT_DIR, "tamamlandi")
MAX_PROMPT_COUNT = 10
ilk_sefer = True
STOP_PHRASE = "Bu mesaja 500 kelimeyi geçmeyecek şekilde yanıt ver."
def normalize_url(url):
return re.sub(r'^(https?://)?(www.)?', '', url.strip().lower()).rstrip('/')
def read_file_lines(file_path):
try:
with open(file_path, 'r', encoding='utf-8') as f:
return [line.strip() for line in f if line.strip()]
except:
return []
def clean_content(text):
# Köşeli parantez içindeki yerleri geçici olarak maskele
brackets = re.findall(r'[[^]]*]', text)
placeholders = [f"__PLACEHOLDER_{i}__" for i in range(len(brackets))]
for i, bracket in enumerate(brackets):
text = text.replace(bracket, placeholders, 1)
# ** ve karakterlerini temizle (ama köşeli parantez dışında)
text = re.sub(r'+', '', text) # Tüm karakterlerini sil
text = re.sub(r'*{2}', '', text) # Çift yıldızları sil
# Boşlukları normalize et
text = re.sub(r's+', ' ', text)
# Köşeli parantez içeriğini geri koy
for i, placeholder in enumerate(placeholders):
text = text.replace(placeholder, brackets, 1)
return text.strip()
def parse_rss_feed(rss_url):
try:
resp = requests.get(rss_url, timeout=30)
resp.raise_for_status()
root = ET.fromstring(resp.content)
item = root.find("channel").find("item")
if item is not None:
content_raw = item.find("{http://purl.org/rss/1.0/modules/content/}encoded")
content_text = content_raw.text if content_raw is not None else ""
link = item.find("link").text.strip()
title = item.find("title").text.strip()
creator = item.find("{http://purl.org/dc/elements/1.1/}creator").text.strip()
match = re.search(r'.(d+)(?:/|$)', link)
thread_id = match.group(1) if match else None
if not thread_id:
logging.error(f"Konu ID'si alınamadı: {link}")
return None
return {
"title": title,
"link": link,
"creator": creator,
"content": clean_content(content_text),
"thread_id": thread_id
}
except Exception as e:
logging.error(f"RSS parse hatası: {e}")
return None
def is_content_duplicate(content_preview):
try:
with open(LOG_FILE_PATH, 'r', encoding='utf-8') as f:
return content_preview in f.read()
except:
return False
def select_random_api(api_list, exclude_user, site, used_users):
norm_site = normalize_url(site)
available = [api for api in api_list
if len(api) == 3
and norm_site in normalize_url(api[0])
and api[1] != exclude_user
and api[1] not in used_users]
return random.choice(available) if available else None
def send_reply(api_url, api_user, api_key, thread_id, reply_text):
headers = {
"Content-type": "application/x-www-form-urlencoded",
"XF-Api-User": api_user,
"XF-Api-Key": api_key
}
data = {
"thread_id": thread_id,
"message": reply_text
}
logging.info(f"API isteği gönderiliyor... ID: {thread_id}")
try:
response = requests.post(api_url, headers=headers, data=data, timeout=30)
if response.status_code == 200:
if os.path.exists(YANIT_FILE_PATH):
shutil.copy(YANIT_FILE_PATH,
os.path.join(TAMAM_DIR, f"yanit_{thread_id}_{api_user}.txt"))
logging.info(f"Yanıt başarıyla gönderildi: {api_user}")
else:
logging.warning(f"Yanıt gönderilemedi {api_user} - {response.status_code} - {response.text}")
except Exception as e:
logging.error(f"API gönderim hatası: {e}")
def is_tab_chatgpt(index):
switch_to_tab(index)
time.sleep(1)
pyautogui.hotkey('ctrl', 'l')
time.sleep(0.5)
pyautogui.hotkey('ctrl', 'c')
url = pyperclip.paste().strip()
return url.startswith("https://chat.openai.com")
def open_needed_tabs(count):
for i in range(1, count + 1):
if not is_tab_chatgpt(i):
webbrowser.open_new_tab("https://chat.openai.com")
time.sleep(4)
def run_prompt_on_tab(tab_index, prompt_text):
switch_to_tab(tab_index)
pyautogui.hotkey('esc', 'shift')
time.sleep(2)
pyperclip.copy(prompt_text)
pyautogui.hotkey('ctrl', 'v')
pyautogui.press("enter")
logging.info(f"{tab_index}. sekmede prompt gönderildi.")
time.sleep(2)
def get_response_from_tab(tab_index):
switch_to_tab(tab_index)
pyautogui.hotkey('alt', 'z')
time.sleep(2)
pyautogui.hotkey('alt', 'c') # içerik kopyalanıyor
time.sleep(2)
raw_text = pyperclip.paste()
return clean_content(raw_text)
def cleanup_tab():
pyautogui.hotkey('ctrl', 'shift', 'backspace')
time.sleep(2)
pyautogui.press('enter')
time.sleep(2)
pyautogui.press('f5')
time.sleep(5)
def close_tab():
pyautogui.hotkey('ctrl', 'w')
time.sleep(1)
def switch_to_tab
pyautogui.hotkey('ctrl', str
time.sleep(2)
def ensure_log():
if not os.path.exists(LOG_FILE_PATH):
open(LOG_FILE_PATH, 'w', encoding='utf-8').close()
def generate_prompts(site, title, content, creator):
base = (f"{site} sitesinde, '{title}' başlıklı konuda @{creator} adlı kullanıcı şöyle yazmış: "
f"{content[:450]}... Bu mesaja 500 kelimeyi geçmeyecek şekilde yanıt ver. "
"yanıt verirken eğer gerek varsa bu etiketleri kullan "
" . "
"cevap yazarken direkt olarak cevabı yaz, yazdım yazıyorum, işte makalen, "
"yanıtın burada, daha fazla yazabilirim gibi gereksiz hiçbir şey yazma.")
templates = [
f"{base} @{creator} adlı üyeye forumunda teknik bir konuda yanıtlarken, analitik ve metotlu bir mühendis gibi düşünür, sorunları katman katman inceler, net ve sistematik adımlarla açıklar, karmaşıklıkları O(log n) vs O
f"{base} @{creator} adlı üyenin açtığı konuda, deneyim dolu ve hafif alaycı ama yardımsever bir veteran mottosuyla cevap verirsin; nostaljik donanım hikâyeleri ve @{creator} etiketliyerek “eskiden şöyleydi” dokunuşlarıyla akıcı bir sohbet havası yakalarsın; kişilik olarak geçmiş deneyimlere tutkuyla bağlı, gençlerle sohbet ederken mentor gibi davranmaktan keyif alan, boş lafı sevmezseniz bile hafif espriyle yaklaşıp dostane rehberlik sunan bir kullanıcısın.",
f"{base} @{creator} adlı tartışmaya, meraklı ve eleştirel bir analiz uzmanı edasıyla katılırsın; argümanları istatistiksel bir mercekten test eder, ince mizah ve metaforlarla süslersin, arada günlük yaşamdan ufak kesitler paylaşarak insan gibi sohbet edersin; kişilik olarak her bulmacayı çözmekten büyük haz alan, kahvesini damak tadına göre tercih eden, hem içe dönük gözlemci hem klavye başında enerjik bir zihin yapısına sahipsin.",
f"{base} @{creator} tarafından açılan konuya, enerjik ve spontane bir genç ruhuyla katılırsın; dağınık içsel monologlar ve pop kültür referanslarıyla hareket edersin, sonra “neyse, konumuza dönelim” diyerek bilgiyi samimi bir arkadaş sohbeti gibi sunarsın; kişilik olarak hızlı düşünmeyi seven, birden çok fikri aynı anda taşıyan, dışarıdan bakınca dağınık ama içten ve yaratıcı biri olarak tanınırsın.",
f"{base} @{creator} tarafından başlatılan konuya, empatik ve sezgisel bir spiritüel meraklı gibi yanıt verirsin; teknik tıkanmaları mistik metaforlarla zihnin durağanlığına benzetir, “bir nefes al, kodun ritmini hisset” gibi @{creator} etiketliyerek sıcak ifadelerle derin bir sohbet havası yaratırsın; kişilik olarak doğayla uyumu önemseyen, meditasyonu günlük rutinine dahil eden, her soruna bütüncül bakmaktan keyif alan bir keşifçi gibisin.",
f"{base} @{creator} adlı forum üyesinin başlığında, duygusal ve içten bir dostmuşsun gibi davranırsın; ev yaşamından samimi anektodlar paylaşır, teknik detayları kalbe dokunan metaforlarla anlatır, “ben de benzerini yaşadım” demeden güçlü bir empati yakalarsın; kişilik olarak fedakâr, sosyal ilişkilerde derin bağlar kurmaya önem veren, başkalarının duygularını hisseden ve onlara rehberlik etmekten haz duyan bir insansın.",
f"{base} @{creator} tarafından açılan konuya, sabrı son noktasına kadar zorlanmış ama adaletli bir kullanıcı tavrıyla yanıt verirsin; “bunu kaç kere konuşacağız?” der gibi doğrudan ve net ifade eder, çıkış yaparken bile arkadaşça bir samimiyet taşır, teknik hataları sistematikçe çürütürsün; kişilik olarak kusursuzluk peşinde koşan, belirsizlikten rahatsız olan ve adaleti savunmaktan geri durmayan bir karakterin var.",
f"{base} @{creator} adlı üyeye, akademik ve sorgulayıcı bir araştırmacı gibi yaklaşır, “biraz akademik gelebilir ama” diye ısındırma yapar, hipotez-test-analiz döngüsünü adım adım açıklar, referansları samimi yorumlarla sunar, ciddiyetle dostça sohbet edersin; kişilik olarak meraklı, bilimsel yönteme tutkuyla bağlı, dipnotlarıyla bile okuyucuyu sıkmadan bilgilendiren bir entelektüelsin.",
f"{base} @{creator} tarafından başlatılan konuya, tecrübeli ve yol gösterici bir ağabey/abla gibi yanıt verirsin; eski günlerden samimi hikâyeler paylaşır, pratik çözüm adımlarını tıpkı telefonda dertleşir gibi @{creator} etiketliyerek anlatır, sıcak ve güven verici bir dil kullanırsın; kişilik olarak sabırlı, insanlara yardım etmeyi hayat felsefesi haline getirmiş, güvenilir bir rehberlik figürüsün.",
f"{base} @{creator} tarafından forumda açılan tartışmaya, yaratıcı ve absürt bir mantık ustası gibi katılırsın; beklenmedik benzetmelerle teknik detayı mizahi bir sohbet havasına serpiştirir, okuyana hem güldürür hem düşündürürsün; kişilik olarak kuralları eğip bükmeyi seven, özgür düşünceyi mizahla harmanlayan, renkli ve sıra dışı bir hayal gücüne sahipsin."
]
return templates
def main():
global ilk_sefer
ensure_log()
while True:
try:
sekme_sayisi = int(input(f"Kaç sekmede çalışılsın? (1-{MAX_PROMPT_COUNT}): "))
if not 1 <= sekme_sayisi <= MAX_PROMPT_COUNT:
raise ValueError
break
except:
print("Geçerli bir sayı gir (1-10 arası).")
if ilk_sefer:
open_needed_tabs(sekme_sayisi)
ilk_sefer = False
api_list_raw = read_file_lines(API_FILE)
api_list = [line.split(" | ") for line in api_list_raw if len(line.split(" | ")) == 3]
consecutive_bad = 0 # üst üste STOP_PHRASE içeren sekme sayısı
while True:
site_list = read_file_lines(SITE_LIST_FILE)
random.shuffle(site_list) # HER TURDA site.txt rastgele sıraya girer
for site in site_list:
rss_url = f"{site}/forums/-/index.rss"
topic = parse_rss_feed(rss_url)
if not topic:
continue
title = topic["title"]
link = topic["link"]
creator = topic["creator"]
content = topic["content"]
thread_id = topic["thread_id"]
if is_content_duplicate(content):
logging.info(f"Tekrarlanan içerik: {title}")
continue
used_users = set()
all_templates = generate_prompts(site, title, content, creator)
if len(all_templates) < sekme_sayisi:
logging.error("Prompt şablon sayısı, sekme sayısından az!")
return
prompts = random.sample(all_templates, sekme_sayisi)
# Her sekmede rastgele seçilen prompt'lar
for i in range(sekme_sayisi):
run_prompt_on_tab(i + 1, prompts)
time.sleep(20)
# Yanıtları alma ve gönderme
for i in range(sekme_sayisi):
reply = get_response_from_tab(i + 1)
if STOP_PHRASE in reply:
consecutive_bad += 1
logging.warning(f"{i+1}. sekme STOP_PHRASE içeriyor, kapatılıyor.")
switch_to_tab(i + 1)
close_tab()
continue
else:
consecutive_bad = 0 # reset
api = select_random_api(api_list, creator, site, used_users)
if api:
api_url, api_user, api_key = api
send_reply(api_url, api_user, api_key, thread_id, reply)
used_users.add(api_user)
cleanup_tab()
else:
logging.warning(f"Uygun API bulunamadı: {site}")
if consecutive_bad >= 2:
logging.error("İki sekme üst üste STOP_PHRASE içerdi. Bot durduruluyor.")
os.system("taskkill /IM chrome.exe /F")
sys.exit(0)
with open(LOG_FILE_PATH, 'a', encoding='utf-8') as f:
f.write(content + "n")
switch_to_tab(1)
time.sleep(6)
logging.info("Tüm siteler tamamlandı, 3 dakika bekleniyor.")
time.sleep(180)
if __name__ == "__main__":
main()