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