Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- import json
- import requests
- import tkinter as tk
- from tkinter import messagebox
- from tkinter import ttk
- from PIL import Image, ImageTk
- DISCORD_API_BASE = "https://discord.com/api/v10"
- TOKEN_FILE = "bot_token.txt"
- def read_bot_token():
- """
- Reads the stored bot token from a local file, if it exists.
- Returns the token or an empty string if not found.
- """
- if os.path.exists(TOKEN_FILE):
- with open(TOKEN_FILE, "r", encoding="utf-8") as f:
- return f.read().strip()
- return ""
- def save_bot_token(token):
- """
- Saves the bot token to a local file.
- Overwrites any existing token.
- """
- with open(TOKEN_FILE, "w", encoding="utf-8") as f:
- f.write(token.strip())
- def lookup_user():
- """Fetch and display the Discord user data based on the provided user ID and bot token."""
- user_id = entry_user_id.get().strip()
- bot_token = entry_bot_token.get().strip()
- if not user_id.isdigit():
- messagebox.showerror("Error", "Please enter a valid numeric User ID.")
- return
- if not bot_token:
- messagebox.showerror("Error", "Please enter a valid Bot Token.")
- return
- save_bot_token(bot_token)
- url = f"{DISCORD_API_BASE}/users/{user_id}"
- headers = {
- "Authorization": f"Bot {bot_token}",
- "User-Agent": "DiscordBot (https://example.com, 0.1)"
- }
- try:
- response = requests.get(url, headers=headers)
- if response.status_code == 200:
- user_data = response.json()
- display_user_data(user_data)
- else:
- if response.status_code == 401:
- messagebox.showerror("Authorization Error",
- "Invalid bot token or insufficient permissions.")
- elif response.status_code == 403:
- messagebox.showerror("Forbidden",
- "The bot does not have permission to access this user.")
- elif response.status_code == 404:
- messagebox.showerror("Not Found",
- "User not found. The bot may not share a guild with this user.")
- else:
- messagebox.showerror("Error",
- f"Unexpected status code {response.status_code}:\n{response.text}")
- except requests.exceptions.RequestException as e:
- messagebox.showerror("Connection Error", f"An error occurred while requesting data:\n{e}")
- def fetch_discord_image(url):
- """
- Fetches an image from Discord’s CDN and returns a Pillow Image object or None if fails.
- """
- if not url:
- return None
- try:
- resp = requests.get(url, stream=True)
- if resp.status_code == 200:
- return Image.open(resp.raw)
- except Exception:
- pass
- return None
- def display_user_data(data):
- """Creates a popup window displaying textual data and images (avatar, banner)."""
- popup = tk.Toplevel(root)
- popup.title(f"User Info - {data.get('username', 'Unknown User')}")
- main_frame = ttk.Frame(popup, padding=10)
- main_frame.pack(fill="both", expand=True)
- avatar_url = None
- if data.get("avatar"):
- avatar_url = f"https://cdn.discordapp.com/avatars/{data['id']}/{data['avatar']}.png"
- else:
- pass
- banner_url = None
- if data.get("banner"):
- banner_url = f"https://cdn.discordapp.com/banners/{data['id']}/{data['banner']}.png"
- text_frame = ttk.Frame(main_frame)
- text_frame.pack(side="left", fill="y", padx=10, pady=10)
- lbl_info = ttk.Label(text_frame, text="User Information", font=("Helvetica", 12, "bold"))
- lbl_info.pack(anchor="w", pady=(0, 5))
- info_lines = []
- possible_fields = [
- "id", "username", "global_name", "discriminator", "avatar",
- "bot", "public_flags", "banner", "accent_color", "banner_color",
- "avatar_decoration"
- ]
- for field in possible_fields:
- if field in data:
- info_lines.append(f"{field}: {data[field]}")
- info_text = "\n".join(info_lines)
- lbl_data = ttk.Label(text_frame, text=info_text, justify="left")
- lbl_data.pack(anchor="w")
- img_frame = ttk.Frame(main_frame)
- img_frame.pack(side="right", fill="both", expand=True, padx=10, pady=10)
- if avatar_url:
- avatar_img = fetch_discord_image(avatar_url)
- if avatar_img:
- avatar_img = avatar_img.resize((128, 128), Image.Resampling.LANCZOS)
- avatar_tk = ImageTk.PhotoImage(avatar_img)
- lbl_avatar = ttk.Label(img_frame, text="Avatar", font=("Helvetica", 11, "bold"))
- lbl_avatar.pack()
- lbl_avatar_img = ttk.Label(img_frame, image=avatar_tk)
- lbl_avatar_img.image = avatar_tk
- lbl_avatar_img.pack(pady=5)
- else:
- ttk.Label(img_frame, text="Unable to load avatar").pack(pady=5)
- else:
- ttk.Label(img_frame, text="No Avatar").pack(pady=5)
- if banner_url:
- banner_img = fetch_discord_image(banner_url)
- if banner_img:
- w, h = banner_img.size
- if w > 300:
- ratio = 300 / w
- new_w = 300
- new_h = int(h * ratio)
- banner_img = banner_img.resize((new_w, new_h), Image.Resampling.LANCZOS)
- banner_tk = ImageTk.PhotoImage(banner_img)
- lbl_banner = ttk.Label(img_frame, text="Banner", font=("Helvetica", 11, "bold"))
- lbl_banner.pack(pady=(20, 0))
- lbl_banner_img = ttk.Label(img_frame, image=banner_tk)
- lbl_banner_img.image = banner_tk
- lbl_banner_img.pack(pady=5)
- else:
- ttk.Label(img_frame, text="Unable to load banner").pack(pady=5)
- popup.geometry("600x400")
- root = tk.Tk()
- root.title("Discord User Lookup")
- input_frame = ttk.Frame(root, padding=15)
- input_frame.pack(fill="both", expand=True)
- label_user_id = ttk.Label(input_frame, text="Discord User ID:")
- label_user_id.grid(row=0, column=0, padx=5, pady=5, sticky="e")
- entry_user_id = ttk.Entry(input_frame, width=30)
- entry_user_id.grid(row=0, column=1, padx=5, pady=5)
- label_bot_token = ttk.Label(input_frame, text="Bot Token:")
- label_bot_token.grid(row=1, column=0, padx=5, pady=5, sticky="e")
- entry_bot_token = ttk.Entry(input_frame, width=30, show="*")
- entry_bot_token.grid(row=1, column=1, padx=5, pady=5)
- saved_token = read_bot_token()
- if saved_token:
- entry_bot_token.insert(0, saved_token)
- btn_lookup = ttk.Button(input_frame, text="Lookup User", command=lookup_user)
- btn_lookup.grid(row=2, column=0, columnspan=2, pady=10)
- root.mainloop()
- main.py
- 7 KB
Add Comment
Please, Sign In to add comment