kalihat's picture
Upload 2 files
785d91e verified
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()