Advertisement
Guest User

Untitled

a guest
Jan 16th, 2025
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.27 KB | None | 0 0
  1. import requests
  2. import re
  3. import time
  4. import os
  5. from urllib.parse import quote
  6. from typing import List, Optional, Dict, Any
  7.  
  8. # Configuration
  9. OUTPUT_FILE = 'found_keys.txt'
  10. GITHUB_TOKEN = ''
  11. HEADERS = {
  12. 'Authorization': f'token {GITHUB_TOKEN}',
  13. 'Accept': 'application/vnd.github.v3+json'
  14. }
  15. MAX_RETRIES = 3
  16. DELAY_BETWEEN_REQUESTS = 5 # увеличили задержку
  17.  
  18.  
  19. class GitHubScanner:
  20. def __init__(self, token: str, output_file: str):
  21. self.token = token
  22. self.output_file = output_file
  23. self.headers = {
  24. 'Authorization': f'token {token}',
  25. 'Accept': 'application/vnd.github.v3+json'
  26. }
  27.  
  28. def get_rate_limit(self) -> Dict:
  29. """
  30. Проверка оставшихся лимитов API
  31. """
  32. response = requests.get('https://api.github.com/rate_limit', headers=self.headers)
  33. return response.json()['resources']['search']
  34.  
  35. def search_github(self, query: str) -> Optional[Dict[str, Any]]:
  36. """
  37. Поиск по GitHub с использованием API
  38. """
  39. url = f'https://api.github.com/search/code?q={quote(query)}'
  40. print(f"Searching with query: {query}")
  41.  
  42. # Проверяем лимиты перед запросом
  43. rate_limit = self.get_rate_limit()
  44. if rate_limit['remaining'] == 0:
  45. reset_time = rate_limit['reset']
  46. wait_time = max(reset_time - time.time(), 0) + 1
  47. print(f"Rate limit exceeded. Waiting {wait_time:.0f} seconds...")
  48. time.sleep(wait_time)
  49.  
  50. for attempt in range(MAX_RETRIES):
  51. try:
  52. response = requests.get(url, headers=self.headers)
  53. if response.status_code == 200:
  54. results = response.json()
  55. print(f"Results found: {len(results.get('items', []))}")
  56. return results
  57. elif response.status_code == 403:
  58. print("Rate limit exceeded. Waiting for reset...")
  59. time.sleep(60) # Ждем минуту перед повторной попыткой
  60. else:
  61. print(f"Error {response.status_code}: {response.text}")
  62. time.sleep(DELAY_BETWEEN_REQUESTS)
  63. except Exception as e:
  64. print(f"Request failed: {str(e)}")
  65. time.sleep(DELAY_BETWEEN_REQUESTS)
  66.  
  67. return None
  68.  
  69. def get_raw_content(self, url: str) -> Optional[str]:
  70. """
  71. Получение содержимого файла из GitHub
  72. """
  73. try:
  74. raw_url = url.replace('github.com', 'raw.githubusercontent.com').replace('/blob/', '/')
  75. print(f"Fetching content from: {raw_url}")
  76.  
  77. response = requests.get(raw_url, headers=self.headers)
  78. if response.status_code == 200:
  79. return response.text
  80. else:
  81. print(f"Error fetching content: {response.status_code}")
  82. return None
  83. except Exception as e:
  84. print(f"Error while fetching content: {str(e)}")
  85. return None
  86.  
  87. def extract_keys(self, content: str) -> List[str]:
  88. """
  89. Извлечение API ключей из контента
  90. """
  91. if not content:
  92. return []
  93.  
  94. pattern = r'AIzaSy[A-Za-z][A-Za-z0-9-_]{32}'
  95. keys = re.findall(pattern, content)
  96.  
  97. if keys:
  98. print(f"Found {len(keys)} potential API keys")
  99. return list(set(keys))
  100.  
  101. def save_keys(self, keys: List[str]) -> None:
  102. """
  103. Сохранение найденных ключей в файл
  104. """
  105. if not keys:
  106. return
  107.  
  108. try:
  109. with open(self.output_file, 'a', encoding='utf-8') as f:
  110. for key in keys:
  111. f.write(f"{key}\n")
  112. print(f"Saved {len(keys)} keys to {self.output_file}")
  113. except Exception as e:
  114. print(f"Error saving keys: {str(e)}")
  115.  
  116. def scan(self) -> None:
  117. """
  118. Основной метод сканирования
  119. """
  120. # Используем более общие поисковые запросы
  121. queries = [
  122. 'AIzaSy', # Базовый поиск
  123. 'filename:config AIzaSy', # Поиск в конфигурационных файлах
  124. 'filename:.env AIzaSy', # Поиск в .env файлах
  125. 'filename:settings AIzaSy' # Поиск в файлах настроек
  126. ]
  127.  
  128. for query in queries:
  129. results = self.search_github(query)
  130. if not results:
  131. continue
  132.  
  133. for item in results.get('items', []):
  134. content = self.get_raw_content(item['html_url'])
  135. if content:
  136. keys = self.extract_keys(content)
  137. if keys:
  138. print(f"Found keys in {item['html_url']}")
  139. self.save_keys(keys)
  140.  
  141. time.sleep(DELAY_BETWEEN_REQUESTS)
  142.  
  143.  
  144. def main():
  145. scanner = GitHubScanner(GITHUB_TOKEN, OUTPUT_FILE)
  146. scanner.scan()
  147.  
  148.  
  149. if __name__ == '__main__':
  150. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement