Cologne Ne Işe Yarar ?

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(n):

pyautogui.hotkey('ctrl', str(n))

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(n) 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()