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() | |