import tkinter as tk from tkinter import ttk, messagebox import pandas as pd from ntscraper import Nitter class HoverButton(tk.Button): def __init__(self, master, **kw): tk.Button.__init__(self, master=master, **kw) self.bind("", self.on_enter) self.bind("", self.on_leave) def on_enter(self, e): self['background'] = '#4CAF50' def on_leave(self, e): self['background'] = '#00C853' class TweetScraperGUI: def __init__(self, master): self.master = master self.master.title("Sargent Twitter Scrapper") # Set background image self.background_image = tk.PhotoImage(file=r"C:\Users\a\Desktop\background_image.png") self.background_label = tk.Label(self.master, image=self.background_image) self.background_label.place(relwidth=1, relheight=1) self.scraper = Nitter() self.create_widgets() def create_widgets(self): self.hashtag_entry = tk.Entry(self.master) self.hashtag_entry.grid(row=0, column=0, padx=5, pady=5) # Dropdown list for modes self.mode_combo = ttk.Combobox(self.master, values=["term", "hashtag", "user"]) self.mode_combo.grid(row=0, column=1, padx=5, pady=5) self.mode_combo.current(1) # Set default mode to 'hashtag' self.size_entry = tk.Entry(self.master) self.size_entry.insert(tk.END, "25") # Set default size to 25 self.size_entry.grid(row=0, column=2, padx=5, pady=5) self.fetch_button = HoverButton(self.master, text="Fetch Tweets", command=self.fetch_tweets) self.fetch_button.grid(row=1, column=0, columnspan=3, padx=5, pady=5, sticky="we") self.result_text = tk.Text(self.master, height=20, width=80) self.result_text.grid(row=2, column=0, columnspan=3, padx=5, pady=5) self.download_button = tk.Button(self.master, text="Download CSV", command=self.download_csv) self.download_button.grid(row=3, column=0, columnspan=3, padx=5, pady=5, sticky="we") # Set app icon self.master.iconbitmap("app_icon.ico") def fetch_tweets(self): hashtag = self.hashtag_entry.get() mode = self.mode_combo.get() size = int(self.size_entry.get()) if hashtag and mode and size: tweets_df = self.get_tweets(hashtag, mode, size) if tweets_df is not None: self.display_tweets(tweets_df) else: messagebox.showerror("Error", "Failed to fetch tweets.") else: messagebox.showerror("Error", "Please enter all fields.") def get_tweets(self, hashtag, mode, size): tweets = self.scraper.get_tweets(hashtag, mode=mode, number=size) if tweets: final_tweets = [] for tweet in tweets['tweets']: final_tweets.append([tweet['link'], tweet['text'], tweet['date'], tweet['stats']['likes'], tweet['stats']['comments']]) return pd.DataFrame(final_tweets, columns=['link', 'text', 'date', 'Likes', 'Comments']) return None def display_tweets(self, tweets_df): self.result_text.delete(1.0, tk.END) self.result_text.insert(tk.END, tweets_df.to_string(index=False)) def download_csv(self): hashtag = self.hashtag_entry.get() mode = self.mode_combo.get() size = int(self.size_entry.get()) if hashtag and mode and size: tweets_df = self.get_tweets(hashtag, mode, size) if tweets_df is not None: file_path = f"{hashtag}_tweets.csv" tweets_df.to_csv(file_path, index=False) messagebox.showinfo("Download Successful", f"CSV file saved as {file_path}") else: messagebox.showerror("Error", "Failed to fetch tweets.") else: messagebox.showerror("Error", "Please enter all fields.") def main(): root = tk.Tk() app = TweetScraperGUI(root) root.mainloop() if __name__ == "__main__": main()