/ GoogleFU-gui.py
GoogleFU-gui.py
1 import sys 2 import requests 3 from bs4 import BeautifulSoup 4 import urllib.parse 5 from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QTextEdit, QComboBox, QFileDialog, QMessageBox 6 from PyQt5.QtGui import QFont 7 from PyQt5.QtCore import Qt 8 from modules.sort import Sort 9 from modules.search import Search 10 import time 11 from urllib.error import HTTPError, URLError 12 13 class GoogleFuApp(QMainWindow): 14 def __init__(self): 15 super().__init__() 16 self.setWindowTitle("GoogleFu") 17 self.setGeometry(100, 100, 800, 600) 18 19 main_widget = QWidget() 20 self.setCentralWidget(main_widget) 21 layout = QVBoxLayout() 22 main_widget.setLayout(layout) 23 24 # Banner 25 banner_label = QLabel("GoogleFu") 26 banner_label.setAlignment(Qt.AlignCenter) 27 banner_label.setFont(QFont("Arial", 24, QFont.Bold)) 28 layout.addWidget(banner_label) 29 30 # Description 31 desc_label = QLabel("This tool will find information on Google about someone or a topic.") 32 desc_label.setAlignment(Qt.AlignCenter) 33 layout.addWidget(desc_label) 34 35 # Query input 36 query_layout = QHBoxLayout() 37 query_label = QLabel("Query:") 38 self.query_input = QLineEdit() 39 search_button = QPushButton("Search") 40 search_button.clicked.connect(self.perform_search) 41 query_layout.addWidget(query_label) 42 query_layout.addWidget(self.query_input) 43 query_layout.addWidget(search_button) 44 layout.addLayout(query_layout) 45 46 # Google Dorks section 47 dorks_layout = QHBoxLayout() 48 dorks_label = QLabel("Google Dork:") 49 self.dorks_combo = QComboBox() 50 self.dorks_combo.addItems([ 51 "None", 52 "site:", 53 "filetype:", 54 "inurl:", 55 "intitle:", 56 "intext:", 57 "cache:", 58 "link:", 59 "related:" 60 ]) 61 self.dorks_input = QLineEdit() 62 self.dorks_input.setPlaceholderText("Enter dork parameter") 63 dorks_layout.addWidget(dorks_label) 64 dorks_layout.addWidget(self.dorks_combo) 65 dorks_layout.addWidget(self.dorks_input) 66 layout.addLayout(dorks_layout) 67 68 # Results display 69 self.results_display = QTextEdit() 70 self.results_display.setReadOnly(True) 71 layout.addWidget(self.results_display) 72 73 # Clear and Save buttons 74 clear_button = QPushButton("Clear Results") 75 clear_button.clicked.connect(self.clear_results) 76 layout.addWidget(clear_button) 77 78 save_button = QPushButton("Save Results") 79 save_button.clicked.connect(self.save_results) 80 layout.addWidget(save_button) 81 82 def perform_search(self): 83 query = self.query_input.text() 84 dork = self.dorks_combo.currentText() 85 dork_param = self.dorks_input.text() 86 87 if dork != "None" and dork_param: 88 query = f"{query} {dork}{dork_param}" 89 90 max_retries = 5 91 retry_delay = 1 # Start with a 1-second delay 92 93 for attempt in range(max_retries): 94 try: 95 urls = Search(query).urls() # Assuming this method returns a list of URLs. 96 sorted_urls = Sort(urls).sort() # Assuming this method sorts the URLs. 97 98 results = f"Search Query: {query}\n\n" 99 for item in sorted_urls: 100 if sorted_urls[item]: 101 results += f"{item.capitalize()}: {', '.join(sorted_urls[item])}\n\n" 102 103 self.results_display.setText(results) 104 return # Exit the function if successful 105 106 except HTTPError as e: 107 if e.code == 429: 108 # Handle Too Many Requests 109 if attempt < max_retries - 1: 110 time.sleep(retry_delay) # Wait before retrying 111 retry_delay *= 2 # Exponential backoff 112 else: 113 self.results_display.setText("Error: Too many requests. Please try again later.") 114 return 115 else: 116 self.results_display.setText(f"HTTP Error: {e.code} - {e.reason}") 117 return 118 119 except URLError as e: 120 self.results_display.setText(f"URL Error: {str(e)}") 121 return 122 123 except Exception as e: 124 self.results_display.setText(f"An unexpected error occurred: {str(e)}") 125 return 126 127 def clear_results(self): 128 """Clear the results display.""" 129 self.results_display.clear() 130 131 def save_results(self): 132 """Save the results to a text file.""" 133 134 options = QFileDialog.Options() 135 file_name, _ = QFileDialog.getSaveFileName(self, "Save Results", "", "Text Files (*.txt);;All Files (*)", options=options) 136 137 if file_name: 138 try: 139 with open(file_name, 'w') as file: 140 file.write(self.results_display.toPlainText()) 141 QMessageBox.information(self, "Success", "Results saved successfully.") 142 except Exception as e: 143 QMessageBox.warning(self, "Error", f"Failed to save results: {e}") 144 145 if __name__ == "__main__": 146 app = QApplication(sys.argv) 147 window = GoogleFuApp() 148 window.show() 149 sys.exit(app.exec_())