Spaces:
No application file
No application file
| 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("<Enter>", self.on_enter) | |
| self.bind("<Leave>", 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() | |