mirror of
https://github.com/benbusby/whoogle-search.git
synced 2026-04-25 10:29:48 -04:00
157 lines
4.7 KiB
Python
157 lines
4.7 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Standalone User Agent String Generator
|
|
|
|
This tool generates User Agent strings that can be used with Whoogle.
|
|
It can be run independently to generate and display UA strings on demand.
|
|
|
|
Usage:
|
|
python misc/generate_uas.py [count]
|
|
|
|
Arguments:
|
|
count: Number of UA strings to generate (default: 10)
|
|
|
|
Examples:
|
|
python misc/generate_uas.py # Generate 10 UAs
|
|
python misc/generate_uas.py 20 # Generate 20 UAs
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
|
|
# Default fallback UA if generation fails
|
|
DEFAULT_FALLBACK_UA = "Opera/12.02 (Android 4.1; Linux; Opera Mobi/ADR-1111101157; U; en-US) Presto/2.9.201 Version/12.02"
|
|
|
|
# Try to import from the app module if available
|
|
try:
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
|
from app.utils.ua_generator import generate_ua_pool
|
|
USE_APP_MODULE = True
|
|
except ImportError:
|
|
USE_APP_MODULE = False
|
|
import random
|
|
|
|
UA_PATTERNS = [
|
|
"HTC_Touch_3G Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)",
|
|
"Opera/12.02 (Android {android_ver}; Linux; Opera Mobi/ADR-1111101157; U; {lang}) Presto/2.9.201 Version/12.02"
|
|
]
|
|
|
|
ANDROID_VERSIONS = ["4.0", "4.1", "4.2", "4.3", "4.4"]
|
|
|
|
LANGUAGES = [
|
|
"en", "en-us", "en-US", "en-GB", "en-ca", "en-CA", "en-au", "en-AU",
|
|
"en-NZ", "en-ZA", "en-IN", "en-SG",
|
|
"de", "de-DE", "de-AT", "de-CH",
|
|
"fr", "fr-fr", "fr-FR", "fr-CA", "fr-BE", "fr-CH", "fr-LU",
|
|
"es", "es-es", "es-ES", "es-MX", "es-AR", "es-CO", "es-CL", "es-PE",
|
|
"it", "it-it", "it-IT", "it-CH",
|
|
"pt", "pt-PT", "pt-BR",
|
|
"nl", "nl-NL", "nl-BE",
|
|
"da", "da-DK",
|
|
"sv", "sv-SE",
|
|
"no", "no-NO", "nb", "nn",
|
|
"fi", "fi-FI",
|
|
"is", "is-IS",
|
|
"pl", "pl-PL",
|
|
"cs", "cs-CZ",
|
|
"sk", "sk-SK",
|
|
"hu", "hu-HU",
|
|
"ro", "ro-RO",
|
|
"bg", "bg-BG",
|
|
"hr", "hr-HR",
|
|
"sr", "sr-RS",
|
|
"sl", "sl-SI",
|
|
"uk", "uk-UA",
|
|
"ru", "ru-ru", "ru-RU",
|
|
"zh", "zh-cn", "zh-CN", "zh-tw", "zh-TW", "zh-HK",
|
|
"ja", "ja-jp", "ja-JP",
|
|
"ko", "ko-kr", "ko-KR",
|
|
"th", "th-TH",
|
|
"vi", "vi-VN",
|
|
"id", "id-ID",
|
|
"ms", "ms-MY",
|
|
"fil", "tl",
|
|
"tr", "tr-TR",
|
|
"ar", "ar-SA", "ar-AE", "ar-EG",
|
|
"he", "he-IL",
|
|
"fa", "fa-IR",
|
|
"hi", "hi-IN",
|
|
"el", "el-gr", "el-GR",
|
|
"ca", "ca-es", "ca-ES",
|
|
"eu", "eu-ES"
|
|
]
|
|
|
|
def generate_safari_ua():
|
|
pattern = random.choice(UA_PATTERNS)
|
|
params = {
|
|
'lang': random.choice(LANGUAGES),
|
|
'android_ver': random.choice(ANDROID_VERSIONS)
|
|
}
|
|
return pattern.format(**params)
|
|
|
|
def load_blacklist():
|
|
blacklist_env = os.environ.get('WHOOGLE_UA_BLACKLIST', '')
|
|
if not blacklist_env:
|
|
return []
|
|
return [term.strip().lower() for term in blacklist_env.split(',') if term.strip()]
|
|
|
|
def check_blacklist(ua):
|
|
blacklist = load_blacklist()
|
|
if not blacklist:
|
|
return False
|
|
ua_lower = ua.lower()
|
|
for term in blacklist:
|
|
if term in ua_lower:
|
|
return True
|
|
return False
|
|
|
|
def generate_ua_pool(count=10):
|
|
ua_pool = set()
|
|
max_attempts = count * 100
|
|
attempts = 0
|
|
try:
|
|
while len(ua_pool) < count and attempts < max_attempts:
|
|
ua = generate_safari_ua()
|
|
if not check_blacklist(ua):
|
|
ua_pool.add(ua)
|
|
attempts += 1
|
|
except Exception:
|
|
if not ua_pool:
|
|
return [DEFAULT_FALLBACK_UA]
|
|
|
|
result = list(ua_pool)
|
|
while len(result) < count:
|
|
result.append(DEFAULT_FALLBACK_UA)
|
|
|
|
return result
|
|
|
|
|
|
def main():
|
|
count = 10
|
|
if len(sys.argv) > 1:
|
|
try:
|
|
count = int(sys.argv[1])
|
|
if count < 1:
|
|
print("Error: Count must be a positive integer", file=sys.stderr)
|
|
sys.exit(1)
|
|
except ValueError:
|
|
print(f"Error: Invalid count '{sys.argv[1]}'. Must be an integer.", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
if USE_APP_MODULE:
|
|
print(f"# Using app.utils.ua_generator module", file=sys.stderr)
|
|
else:
|
|
print(f"# Using standalone generator (app module not available)", file=sys.stderr)
|
|
|
|
print(f"# Generating {count} randomized User Agent strings...\n", file=sys.stderr)
|
|
|
|
uas = generate_ua_pool(count)
|
|
|
|
for ua in uas:
|
|
print(ua)
|
|
|
|
print(f"\n# Generated {len(uas)} unique User Agent strings", file=sys.stderr)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|