├── .env ├── requirements.txt ├── pesan.txt ├── README.md └── bot.py /.env: -------------------------------------------------------------------------------- 1 | DISCORD_TOKEN= 2 | GOOGLE_API_KEYS= 3 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | shareithub 2 | python-dotenv 3 | colorama 4 | requests 5 | -------------------------------------------------------------------------------- /pesan.txt: -------------------------------------------------------------------------------- 1 | jangan lupa subscribe channel ( YOUTUBE & TELEGRAM ) : SHARE IT HUB 2 | dont forget subscribe channel ( YOUTUBE & TELEGRAM ) : SHARE IT HUB 3 | Telegram Channel : SHARE IT HUB 4 | Youtube Channel : SHARE IT HUB 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BOT PUSH DISCORD x GEMINI AI 2 | ## Creator : SHARE IT HUB 3 | 4 | ## TELEGRAM CHANNEL : [ SHARE IT HUB](https://t.me/SHAREITHUB_COM) 5 | 6 | ## YOUTUBE CHANNEL : [ SHARE IT HUB](https://youtube.com/@shareithub_com) 7 | 8 | ## TUTORIAL VIDEO : https://youtu.be/bodHaUgROlo 9 | 10 | ## FEATURE : 11 | 12 | 1. Multi accounts 13 | 14 | 2. Multi servers 15 | 16 | 3. Gemini AI ( ON / OFF ) 17 | 18 | 5. Auto detecd Slow mode Server Chat ( ON / OFF ) 19 | 20 | 6. Auto Delete Message with Delay ( ON / OFF ). & Auto Delete message after send 21 | 22 | 7. Auto Reply Message 23 | 24 | 8. Auto send message with file `pesan.txt` 25 | 26 | 9. Auto read new chat in server 27 | 28 | 29 | # HOW TO USE ? 30 | 31 | Install Python3 : 32 | ``` 33 | sudo apt install python3 34 | sudo apt install python3-pip 35 | sudo apt install python3-venv 36 | sudo apt install git 37 | sudo apt install screen 38 | ``` 39 | Git clone bot discord , go to folder & Install module using venv : 40 | ``` 41 | git clone https://github.com/shareithub/discord-bot.git 42 | cd discord-bot 43 | python3 -m venv shareithub 44 | source shareithub/bin/activate 45 | pip install -r requirements.txt 46 | ``` 47 | Edit file `.env` copy & paste your Gemini API & Discord token : 48 | ``` 49 | nano .env 50 | ``` 51 | 52 | ## DONE. U CAN RUN BOT `python3 bot.py` 53 | 54 | 55 | Goto here to get token discord : 56 | https://youtu.be/Wdexc__Cja0 57 | -------------------------------------------------------------------------------- /bot.py: -------------------------------------------------------------------------------- 1 | import shareithub 2 | import json 3 | import threading 4 | import time 5 | import os 6 | import random 7 | import re 8 | import requests 9 | from shareithub import shareithub 10 | from dotenv import load_dotenv 11 | from datetime import datetime 12 | from colorama import init, Fore, Style 13 | 14 | init(autoreset=True) 15 | load_dotenv() 16 | 17 | discord_tokens_env = os.getenv('DISCORD_TOKENS', '') 18 | if discord_tokens_env: 19 | discord_tokens = [token.strip() for token in discord_tokens_env.split(',') if token.strip()] 20 | else: 21 | discord_token = os.getenv('DISCORD_TOKEN') 22 | if not discord_token: 23 | raise ValueError("Tidak ada Discord token yang ditemukan! Harap atur DISCORD_TOKENS atau DISCORD_TOKEN di .env.") 24 | discord_tokens = [discord_token] 25 | 26 | google_api_keys = os.getenv('GOOGLE_API_KEYS', '').split(',') 27 | google_api_keys = [key.strip() for key in google_api_keys if key.strip()] 28 | if not google_api_keys: 29 | raise ValueError("Tidak ada Google API Key yang ditemukan! Harap atur GOOGLE_API_KEYS di .env.") 30 | 31 | processed_message_ids = set() 32 | used_api_keys = set() 33 | last_generated_text = None 34 | cooldown_time = 86400 35 | 36 | def log_message(message, level="INFO"): 37 | timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') 38 | 39 | if level.upper() == "SUCCESS": 40 | color, icon = Fore.GREEN, "✅" 41 | elif level.upper() == "ERROR": 42 | color, icon = Fore.RED, "🚨" 43 | elif level.upper() == "WARNING": 44 | color, icon = Fore.YELLOW, "⚠️" 45 | elif level.upper() == "WAIT": 46 | color, icon = Fore.CYAN, "⌛" 47 | else: 48 | color, icon = Fore.WHITE, "ℹ️" 49 | 50 | border = f"{Fore.MAGENTA}{'=' * 80}{Style.RESET_ALL}" 51 | formatted_message = f"{color}[{timestamp}] {icon} {message}{Style.RESET_ALL}" 52 | print(border) 53 | print(formatted_message) 54 | print(border) 55 | 56 | def get_random_api_key(): 57 | available_keys = [key for key in google_api_keys if key not in used_api_keys] 58 | if not available_keys: 59 | log_message("Semua API key terkena error 429. Menunggu 24 jam sebelum mencoba lagi...", "ERROR") 60 | time.sleep(cooldown_time) 61 | used_api_keys.clear() 62 | return get_random_api_key() 63 | return random.choice(available_keys) 64 | 65 | def get_random_message_from_file(): 66 | try: 67 | with open("pesan.txt", "r", encoding="utf-8") as file: 68 | messages = [line.strip() for line in file.readlines() if line.strip()] 69 | return random.choice(messages) if messages else "Tidak ada pesan tersedia di file." 70 | except FileNotFoundError: 71 | return "File pesan.txt tidak ditemukan!" 72 | 73 | def generate_language_specific_prompt(user_message, prompt_language): 74 | if prompt_language == 'id': 75 | return f"Balas pesan berikut dalam bahasa Indonesia: {user_message}" 76 | elif prompt_language == 'en': 77 | return f"Reply to the following message in English: {user_message}" 78 | else: 79 | log_message(f"Bahasa prompt '{prompt_language}' tidak valid. Pesan dilewati.", "WARNING") 80 | return None 81 | 82 | def generate_reply(prompt, prompt_language, use_google_ai=True): 83 | global last_generated_text 84 | if use_google_ai: 85 | google_api_key = get_random_api_key() 86 | lang_prompt = generate_language_specific_prompt(prompt, prompt_language) 87 | if lang_prompt is None: 88 | return None 89 | ai_prompt = f"{lang_prompt}\n\nBuatlah menjadi 1 kalimat menggunakan bahasa sehari hari manusia." 90 | url = f'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key={google_api_key}' 91 | headers = {'Content-Type': 'application/json'} 92 | data = {'contents': [{'parts': [{'text': ai_prompt}]}]} 93 | while True: 94 | try: 95 | response = requests.post(url, headers=headers, json=data) 96 | if response.status_code == 429: 97 | log_message(f"API key {google_api_key} terkena rate limit (429). Menggunakan API key lain...", "WARNING") 98 | used_api_keys.add(google_api_key) 99 | return generate_reply(prompt, prompt_language, use_google_ai) 100 | response.raise_for_status() 101 | result = response.json() 102 | generated_text = result['candidates'][0]['content']['parts'][0]['text'] 103 | if generated_text == last_generated_text: 104 | log_message("AI menghasilkan teks yang sama, meminta teks baru...", "WAIT") 105 | continue 106 | last_generated_text = generated_text 107 | return generated_text 108 | except requests.exceptions.RequestException as e: 109 | log_message(f"Request failed: {e}", "ERROR") 110 | time.sleep(2) 111 | else: 112 | return get_random_message_from_file() 113 | 114 | def get_channel_info(channel_id, token): 115 | headers = {'Authorization': token} 116 | channel_url = f"https://discord.com/api/v9/channels/{channel_id}" 117 | try: 118 | channel_response = requests.get(channel_url, headers=headers) 119 | channel_response.raise_for_status() 120 | channel_data = channel_response.json() 121 | channel_name = channel_data.get('name', 'Unknown Channel') 122 | guild_id = channel_data.get('guild_id') 123 | server_name = "Direct Message" 124 | if guild_id: 125 | guild_url = f"https://discord.com/api/v9/guilds/{guild_id}" 126 | guild_response = requests.get(guild_url, headers=headers) 127 | guild_response.raise_for_status() 128 | guild_data = guild_response.json() 129 | server_name = guild_data.get('name', 'Unknown Server') 130 | return server_name, channel_name 131 | except requests.exceptions.RequestException as e: 132 | log_message(f"Error mengambil info channel: {e}", "ERROR") 133 | return "Unknown Server", "Unknown Channel" 134 | 135 | def get_bot_info(token): 136 | headers = {'Authorization': token} 137 | try: 138 | response = requests.get("https://discord.com/api/v9/users/@me", headers=headers) 139 | response.raise_for_status() 140 | data = response.json() 141 | username = data.get("username", "Unknown") 142 | discriminator = data.get("discriminator", "") 143 | bot_id = data.get("id", "Unknown") 144 | return username, discriminator, bot_id 145 | except requests.exceptions.RequestException as e: 146 | log_message(f"Gagal mengambil info akun bot: {e}", "ERROR") 147 | return "Unknown", "", "Unknown" 148 | 149 | def auto_reply(channel_id, settings, token): 150 | headers = {'Authorization': token} 151 | if settings["use_google_ai"]: 152 | try: 153 | bot_info_response = requests.get('https://discord.com/api/v9/users/@me', headers=headers) 154 | bot_info_response.raise_for_status() 155 | bot_user_id = bot_info_response.json().get('id') 156 | except requests.exceptions.RequestException as e: 157 | log_message(f"[Channel {channel_id}] Gagal mengambil info bot: {e}", "ERROR") 158 | return 159 | 160 | while True: 161 | prompt = None 162 | reply_to_id = None 163 | log_message(f"[Channel {channel_id}] Menunggu {settings['read_delay']} detik sebelum membaca pesan...", "WAIT") 164 | time.sleep(settings["read_delay"]) 165 | try: 166 | response = requests.get(f'https://discord.com/api/v9/channels/{channel_id}/messages', headers=headers) 167 | response.raise_for_status() 168 | messages = response.json() 169 | if messages: 170 | most_recent_message = messages[0] 171 | message_id = most_recent_message.get('id') 172 | author_id = most_recent_message.get('author', {}).get('id') 173 | message_type = most_recent_message.get('type', '') 174 | if author_id != bot_user_id and message_type != 8 and message_id not in processed_message_ids: 175 | user_message = most_recent_message.get('content', '').strip() 176 | attachments = most_recent_message.get('attachments', []) 177 | if attachments or not re.search(r'\w', user_message): 178 | log_message(f"[Channel {channel_id}] Pesan tidak diproses (bukan teks murni).", "WARNING") 179 | else: 180 | log_message(f"[Channel {channel_id}] Received: {user_message}", "INFO") 181 | if settings["use_slow_mode"]: 182 | slow_mode_delay = get_slow_mode_delay(channel_id, token) 183 | log_message(f"[Channel {channel_id}] Slow mode aktif, menunggu {slow_mode_delay} detik...", "WAIT") 184 | time.sleep(slow_mode_delay) 185 | prompt = user_message 186 | reply_to_id = message_id 187 | processed_message_ids.add(message_id) 188 | else: 189 | prompt = None 190 | except requests.exceptions.RequestException as e: 191 | log_message(f"[Channel {channel_id}] Request error: {e}", "ERROR") 192 | prompt = None 193 | 194 | if prompt: 195 | result = generate_reply(prompt, settings["prompt_language"], settings["use_google_ai"]) 196 | if result is None: 197 | log_message(f"[Channel {channel_id}] Bahasa prompt tidak valid. Pesan dilewati.", "WARNING") 198 | else: 199 | response_text = result if result else "Maaf, tidak dapat membalas pesan." 200 | if response_text.strip().lower() == prompt.strip().lower(): 201 | log_message(f"[Channel {channel_id}] Balasan sama dengan pesan yang diterima. Tidak mengirim balasan.", "WARNING") 202 | else: 203 | if settings["use_reply"]: 204 | send_message(channel_id, response_text, token, reply_to=reply_to_id, 205 | delete_after=settings["delete_bot_reply"], delete_immediately=settings["delete_immediately"]) 206 | else: 207 | send_message(channel_id, response_text, token, 208 | delete_after=settings["delete_bot_reply"], delete_immediately=settings["delete_immediately"]) 209 | else: 210 | log_message(f"[Channel {channel_id}] Tidak ada pesan baru atau pesan tidak valid.", "INFO") 211 | 212 | log_message(f"[Channel {channel_id}] Menunggu {settings['delay_interval']} detik sebelum iterasi berikutnya...", "WAIT") 213 | time.sleep(settings["delay_interval"]) 214 | else: 215 | while True: 216 | delay = settings["delay_interval"] 217 | log_message(f"[Channel {channel_id}] Menunggu {delay} detik sebelum mengirim pesan dari file...", "WAIT") 218 | time.sleep(delay) 219 | message_text = generate_reply("", settings["prompt_language"], use_google_ai=False) 220 | if settings["use_reply"]: 221 | send_message(channel_id, message_text, token, delete_after=settings["delete_bot_reply"], delete_immediately=settings["delete_immediately"]) 222 | else: 223 | send_message(channel_id, message_text, token, delete_after=settings["delete_bot_reply"], delete_immediately=settings["delete_immediately"]) 224 | 225 | def send_message(channel_id, message_text, token, reply_to=None, delete_after=None, delete_immediately=False): 226 | headers = {'Authorization': token, 'Content-Type': 'application/json'} 227 | payload = {'content': message_text} 228 | if reply_to: 229 | payload["message_reference"] = {"message_id": reply_to} 230 | url = f"https://discord.com/api/v9/channels/{channel_id}/messages" 231 | try: 232 | response = requests.post(url, json=payload, headers=headers) 233 | response.raise_for_status() 234 | if response.status_code in [200, 201]: 235 | data = response.json() 236 | message_id = data.get("id") 237 | log_message(f"[Channel {channel_id}] Pesan terkirim: \"{message_text}\" (ID: {message_id})", "SUCCESS") 238 | if delete_after is not None: 239 | if delete_immediately: 240 | log_message(f"[Channel {channel_id}] Menghapus pesan segera tanpa delay...", "WAIT") 241 | threading.Thread(target=delete_message, args=(channel_id, message_id, token), daemon=True).start() 242 | elif delete_after > 0: 243 | log_message(f"[Channel {channel_id}] Pesan akan dihapus dalam {delete_after} detik...", "WAIT") 244 | threading.Thread(target=delayed_delete, args=(channel_id, message_id, delete_after, token), daemon=True).start() 245 | else: 246 | log_message(f"[Channel {channel_id}] Gagal mengirim pesan. Status: {response.status_code}", "ERROR") 247 | log_message(f"[Channel {channel_id}] Respons API: {response.text}", "ERROR") 248 | except requests.exceptions.RequestException as e: 249 | log_message(f"[Channel {channel_id}] Kesalahan saat mengirim pesan: {e}", "ERROR") 250 | 251 | def delayed_delete(channel_id, message_id, delay, token): 252 | time.sleep(delay) 253 | delete_message(channel_id, message_id, token) 254 | 255 | def delete_message(channel_id, message_id, token): 256 | headers = {'Authorization': token, 'Content-Type': 'application/json'} 257 | url = f'https://discord.com/api/v9/channels/{channel_id}/messages/{message_id}' 258 | try: 259 | response = requests.delete(url, headers=headers) 260 | if response.status_code == 204: 261 | log_message(f"[Channel {channel_id}] Pesan dengan ID {message_id} berhasil dihapus.", "SUCCESS") 262 | else: 263 | log_message(f"[Channel {channel_id}] Gagal menghapus pesan. Status: {response.status_code}", "ERROR") 264 | log_message(f"[Channel {channel_id}] Respons API: {response.text}", "ERROR") 265 | except requests.exceptions.RequestException as e: 266 | log_message(f"[Channel {channel_id}] Kesalahan saat menghapus pesan: {e}", "ERROR") 267 | 268 | def get_slow_mode_delay(channel_id, token): 269 | headers = {'Authorization': token, 'Accept': 'application/json'} 270 | url = f"https://discord.com/api/v9/channels/{channel_id}" 271 | try: 272 | response = requests.get(url, headers=headers) 273 | response.raise_for_status() 274 | data = response.json() 275 | slow_mode_delay = data.get("rate_limit_per_user", 0) 276 | log_message(f"[Channel {channel_id}] Slow mode delay: {slow_mode_delay} detik", "INFO") 277 | return slow_mode_delay 278 | except requests.exceptions.RequestException as e: 279 | log_message(f"[Channel {channel_id}] Gagal mengambil informasi slow mode: {e}", "ERROR") 280 | return 5 281 | 282 | def get_server_settings(channel_id, channel_name): 283 | print(f"\nMasukkan pengaturan untuk channel {channel_id} (Nama Channel: {channel_name}):") 284 | use_google_ai = input(" Gunakan Google Gemini AI? (y/n): ").strip().lower() == 'y' 285 | 286 | if use_google_ai: 287 | prompt_language = input(" Pilih bahasa prompt (en/id): ").strip().lower() 288 | if prompt_language not in ["en", "id"]: 289 | print(" Input tidak valid. Default ke 'id'.") 290 | prompt_language = "id" 291 | enable_read_message = True 292 | read_delay = int(input(" Masukkan delay membaca pesan (detik): ")) 293 | delay_interval = int(input(" Masukkan interval (detik) untuk setiap iterasi auto reply: ")) 294 | use_slow_mode = input(" Gunakan slow mode? (y/n): ").strip().lower() == 'y' 295 | else: 296 | prompt_language = input(" Pilih bahasa pesan dari file (en/id): ").strip().lower() 297 | if prompt_language not in ["en", "id"]: 298 | print(" Input tidak valid. Default ke 'id'.") 299 | prompt_language = "id" 300 | enable_read_message = False 301 | read_delay = 0 302 | delay_interval = int(input(" Masukkan delay (detik) untuk mengirim pesan dari file: ")) 303 | use_slow_mode = False 304 | 305 | use_reply = input(" Kirim pesan sebagai reply? (y/n): ").strip().lower() == 'y' 306 | hapus_balasan = input(" Hapus balasan bot setelah beberapa detik? (y/n): ").strip().lower() == 'y' 307 | if hapus_balasan: 308 | delete_bot_reply = int(input(" Setelah berapa detik balasan dihapus? (0 untuk tidak, atau masukkan delay): ")) 309 | delete_immediately = input(" Hapus pesan langsung tanpa delay? (y/n): ").strip().lower() == 'y' 310 | else: 311 | delete_bot_reply = None 312 | delete_immediately = False 313 | 314 | return { 315 | "prompt_language": prompt_language, 316 | "use_google_ai": use_google_ai, 317 | "enable_read_message": enable_read_message, 318 | "read_delay": read_delay, 319 | "delay_interval": delay_interval, 320 | "use_slow_mode": use_slow_mode, 321 | "use_reply": use_reply, 322 | "delete_bot_reply": delete_bot_reply, 323 | "delete_immediately": delete_immediately 324 | } 325 | 326 | if __name__ == "__main__": 327 | 328 | bot_accounts = {} 329 | for token in discord_tokens: 330 | username, discriminator, bot_id = get_bot_info(token) 331 | bot_accounts[token] = {"username": username, "discriminator": discriminator, "bot_id": bot_id} 332 | log_message(f"Akun Bot: {username}#{discriminator} (ID: {bot_id})", "SUCCESS") 333 | 334 | # Input channel IDs dari user 335 | channel_ids = [cid.strip() for cid in input("Masukkan ID channel (pisahkan dengan koma jika lebih dari satu): ").split(",") if cid.strip()] 336 | 337 | token = discord_tokens[0] 338 | channel_infos = {} 339 | for channel_id in channel_ids: 340 | server_name, channel_name = get_channel_info(channel_id, token) 341 | channel_infos[channel_id] = {"server_name": server_name, "channel_name": channel_name} 342 | log_message(f"[Channel {channel_id}] Terhubung ke server: {server_name} | Nama Channel: {channel_name}", "SUCCESS") 343 | 344 | server_settings = {} 345 | for channel_id in channel_ids: 346 | channel_name = channel_infos.get(channel_id, {}).get("channel_name", "Unknown Channel") 347 | server_settings[channel_id] = get_server_settings(channel_id, channel_name) 348 | 349 | for cid, settings in server_settings.items(): 350 | info = channel_infos.get(cid, {"server_name": "Unknown Server", "channel_name": "Unknown Channel"}) 351 | hapus_str = ("Langsung" if settings['delete_immediately'] else 352 | (f"Dalam {settings['delete_bot_reply']} detik" if settings['delete_bot_reply'] and settings['delete_bot_reply'] > 0 else "Tidak")) 353 | log_message( 354 | f"[Channel {cid} | Server: {info['server_name']} | Channel: {info['channel_name']}] " 355 | f"Pengaturan: Gemini AI = {'Aktif' if settings['use_google_ai'] else 'Tidak'}, " 356 | f"Bahasa = {settings['prompt_language'].upper()}, " 357 | f"Membaca Pesan = {'Aktif' if settings['enable_read_message'] else 'Tidak'}, " 358 | f"Delay Membaca = {settings['read_delay']} detik, " 359 | f"Interval = {settings['delay_interval']} detik, " 360 | f"Slow Mode = {'Aktif' if settings['use_slow_mode'] else 'Tidak'}, " 361 | f"Reply = {'Ya' if settings['use_reply'] else 'Tidak'}, " 362 | f"Hapus Pesan = {hapus_str}", 363 | "INFO" 364 | ) 365 | 366 | token_index = 0 367 | for channel_id in channel_ids: 368 | token = discord_tokens[token_index % len(discord_tokens)] 369 | token_index += 1 370 | bot_info = bot_accounts.get(token, {"username": "Unknown", "discriminator": "", "bot_id": "Unknown"}) 371 | thread = threading.Thread( 372 | target=auto_reply, 373 | args=(channel_id, server_settings[channel_id], token) 374 | ) 375 | thread.daemon = True 376 | thread.start() 377 | log_message(f"[Channel {channel_id}] Bot aktif: {bot_info['username']}#{bot_info['discriminator']} (Token: {token[:4]}{'...' if len(token) > 4 else token})", "SUCCESS") 378 | 379 | log_message("Bot sedang berjalan di beberapa server... Tekan CTRL+C untuk menghentikan.", "INFO") 380 | while True: 381 | time.sleep(10) 382 | --------------------------------------------------------------------------------