import websocket
import json
import requests
import threading
import time
import datetime
from datetime import timezone, timedelta
import os
from dotenv import load_dotenv
load_dotenv()
KANAL_ID = os.getenv("KANAL_ID")
WEBHOOK_URL = os.getenv("WEBHOOK_URL")
TOKEN = os.getenv("TOKEN")
BOT_MESAJLARI_ILET = os.getenv("BOT_MESAJLARI_ILET", "False").lower() == "true"
ETIKET_KONTROLU = os.getenv("ETIKET_KONTROLU", "True").lower() == "true"
processed_messages = set()
message_count = 0 # Toplam iletilen mesaj say??s??
def send_json_request(ws, request):
ws.send(json.dumps(request))
def receive_json_response(ws):
response = ws.recv()
if response:
return json.loads(response)
def heartbeat(interval, ws):
while True:
time.sleep(interval)
heartbeatJSON = {"op": 1, "d": None}
send_json_request(ws, heartbeatJSON)
def on_message(ws, message):
global message_count
message_data = json.loads(message)
if message_data.get("t") == "MESSAGE_CREATE":
data = message_data.get("d", {})
channel_id = data.get("channel_id")
message_id = data.get("id")
is_bot = data.get("author", {}).get("bot", False)
if is_bot and not BOT_MESAJLARI_ILET:
return
if message_id in processed_messages or channel_id != KANAL_ID:
return
content = data.get("content", "").strip()
attachments = data.get("attachments", [])
referenced_message = data.get("referenced_message")
if ETIKET_KONTROLU:
content = content.replace("@everyone", "`@everyone`")
content = content.replace("@here", "`@here`")
if not content and not attachments:
return
processed_messages.add(message_id)
if len(processed_messages) > 100:
processed_messages.clear()
author = data.get("author", {}).get("username", "Bilinmeyen")
author_id = data.get("author", {}).get("id", "Bilinmeyen")
timestamp = data.get("timestamp", "")
utc_time = datetime.datetime.strptime(timestamp, "%Y-%m-%dT%H:%M:%S.%f%z")
turkey_tz = timezone(timedelta(hours=3))
local_time = utc_time.astimezone(turkey_tz)
formatted_time = local_time.strftime("%d.%m.%Y %H:%M")
formatted_message = "**Mesaj ??çeri??i: **\n\n"
if referenced_message:
ref_author = referenced_message.get("author", {}).get("username", "Bilinmeyen")
ref_author_id = referenced_message.get("author", {}).get("id", "Bilinmeyen")
ref_content = referenced_message.get("content", "").strip()
formatted_message += f"**Yan??tlanan Mesaj**:\n {ref_content}\n\n"
formatted_message += f"**Yan??tlanan Ki??i**: <@{ref_author_id}>\n\n"
formatted_message += f"**Yan??t**:\n{content}\n"
else:
formatted_message += f"{content}\n"
if attachments:
for attachment in attachments:
formatted_message += f"{attachment.get('url')}\n"
formatted_message += "\n**Mesaj Bilgisi**:\n"
formatted_message += f"**Yazar**: <@{author_id}>\n"
formatted_message += f"**Tarih**: {formatted_time}\n"
formatted_message += f"**Kanal**: <#{KANAL_ID}>\n"
formatted_message += f"**Gönderilme**: <t:{int(time.time())}:R>"
avatar_url = data.get("author", {}).get("avatar")
if avatar_url:
avatar_url = f"https://cdn.discordapp.com/avatars/{author_id}/{avatar_url}?size=1024"
webhook_data = {"content": formatted_message, "username": author, "avatar_url": avatar_url}
try:
requests.post(WEBHOOK_URL, json=webhook_data)
message_count += 1
print(f"Toplam iletilen mesaj: {message_count}")
except Exception as e:
print(f"Webhook hatas??: {e}")
def on_error(ws, error):
print(f"Hata: {error}")
def on_close(ws, close_status_code, close_msg):
print("Ba??lant?? kapand??, yeniden ba??lan??yor...")
time.sleep(5)
main()
def on_open(ws):
payload = {
'op': 2,
"d": {
"token": TOKEN,
"properties": {
"$os": "windows",
"$browser": "chrome",
"$device": "pc"
}
}
}
send_json_request(ws, payload)
threading.Thread(target=heartbeat, args=(40, ws), daemon=True).start()
def main():
ws = websocket.WebSocketApp(
'wss://gateway.discord.gg/?v=9&encoding=json',
on_message=on_message,
on_error=on_error,
on_close=on_close
)
ws.on_open = on_open
ws.run_forever()
if __name__ == "__main__":
print("Bot ba??lat??l??yor...")
while True:
try:
main()
except Exception as e:
print(f"Ba??lant?? hatas??: {e}, yeniden deneniyor...")
time.sleep(5)