webscout 8.2.2__py3-none-any.whl → 8.2.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of webscout might be problematic. Click here for more details.
- webscout/AIauto.py +112 -22
- webscout/AIbase.py +144 -7
- webscout/AIutel.py +249 -131
- webscout/Bard.py +579 -206
- webscout/DWEBS.py +78 -35
- webscout/__init__.py +0 -1
- webscout/cli.py +256 -0
- webscout/conversation.py +307 -436
- webscout/exceptions.py +23 -0
- webscout/prompt_manager.py +56 -42
- webscout/version.py +1 -1
- webscout/webscout_search.py +65 -47
- webscout/webscout_search_async.py +81 -126
- webscout/yep_search.py +93 -43
- {webscout-8.2.2.dist-info → webscout-8.2.7.dist-info}/METADATA +172 -52
- webscout-8.2.7.dist-info/RECORD +26 -0
- {webscout-8.2.2.dist-info → webscout-8.2.7.dist-info}/WHEEL +1 -1
- webscout-8.2.7.dist-info/entry_points.txt +3 -0
- webscout-8.2.7.dist-info/top_level.txt +1 -0
- inferno/__init__.py +0 -6
- inferno/__main__.py +0 -9
- inferno/cli.py +0 -6
- webscout/Extra/GitToolkit/__init__.py +0 -10
- webscout/Extra/GitToolkit/gitapi/__init__.py +0 -12
- webscout/Extra/GitToolkit/gitapi/repository.py +0 -195
- webscout/Extra/GitToolkit/gitapi/user.py +0 -96
- webscout/Extra/GitToolkit/gitapi/utils.py +0 -62
- webscout/Extra/YTToolkit/YTdownloader.py +0 -957
- webscout/Extra/YTToolkit/__init__.py +0 -3
- webscout/Extra/YTToolkit/transcriber.py +0 -476
- webscout/Extra/YTToolkit/ytapi/__init__.py +0 -6
- webscout/Extra/YTToolkit/ytapi/channel.py +0 -307
- webscout/Extra/YTToolkit/ytapi/errors.py +0 -13
- webscout/Extra/YTToolkit/ytapi/extras.py +0 -45
- webscout/Extra/YTToolkit/ytapi/https.py +0 -88
- webscout/Extra/YTToolkit/ytapi/patterns.py +0 -61
- webscout/Extra/YTToolkit/ytapi/playlist.py +0 -59
- webscout/Extra/YTToolkit/ytapi/pool.py +0 -8
- webscout/Extra/YTToolkit/ytapi/query.py +0 -40
- webscout/Extra/YTToolkit/ytapi/stream.py +0 -63
- webscout/Extra/YTToolkit/ytapi/utils.py +0 -62
- webscout/Extra/YTToolkit/ytapi/video.py +0 -232
- webscout/Extra/__init__.py +0 -7
- webscout/Extra/autocoder/__init__.py +0 -9
- webscout/Extra/autocoder/autocoder.py +0 -849
- webscout/Extra/autocoder/autocoder_utiles.py +0 -332
- webscout/Extra/gguf.py +0 -682
- webscout/Extra/tempmail/__init__.py +0 -28
- webscout/Extra/tempmail/async_utils.py +0 -141
- webscout/Extra/tempmail/base.py +0 -161
- webscout/Extra/tempmail/cli.py +0 -187
- webscout/Extra/tempmail/emailnator.py +0 -84
- webscout/Extra/tempmail/mail_tm.py +0 -361
- webscout/Extra/tempmail/temp_mail_io.py +0 -292
- webscout/Extra/weather.py +0 -194
- webscout/Extra/weather_ascii.py +0 -76
- webscout/LLM.py +0 -442
- webscout/Litlogger/__init__.py +0 -67
- webscout/Litlogger/core/__init__.py +0 -6
- webscout/Litlogger/core/level.py +0 -23
- webscout/Litlogger/core/logger.py +0 -165
- webscout/Litlogger/handlers/__init__.py +0 -12
- webscout/Litlogger/handlers/console.py +0 -33
- webscout/Litlogger/handlers/file.py +0 -143
- webscout/Litlogger/handlers/network.py +0 -173
- webscout/Litlogger/styles/__init__.py +0 -7
- webscout/Litlogger/styles/colors.py +0 -249
- webscout/Litlogger/styles/formats.py +0 -458
- webscout/Litlogger/styles/text.py +0 -87
- webscout/Litlogger/utils/__init__.py +0 -6
- webscout/Litlogger/utils/detectors.py +0 -153
- webscout/Litlogger/utils/formatters.py +0 -200
- webscout/Local/__init__.py +0 -12
- webscout/Local/__main__.py +0 -9
- webscout/Local/api.py +0 -576
- webscout/Local/cli.py +0 -516
- webscout/Local/config.py +0 -75
- webscout/Local/llm.py +0 -287
- webscout/Local/model_manager.py +0 -253
- webscout/Local/server.py +0 -721
- webscout/Local/utils.py +0 -93
- webscout/Provider/AI21.py +0 -177
- webscout/Provider/AISEARCH/DeepFind.py +0 -250
- webscout/Provider/AISEARCH/ISou.py +0 -256
- webscout/Provider/AISEARCH/Perplexity.py +0 -359
- webscout/Provider/AISEARCH/__init__.py +0 -10
- webscout/Provider/AISEARCH/felo_search.py +0 -228
- webscout/Provider/AISEARCH/genspark_search.py +0 -208
- webscout/Provider/AISEARCH/hika_search.py +0 -194
- webscout/Provider/AISEARCH/iask_search.py +0 -436
- webscout/Provider/AISEARCH/monica_search.py +0 -246
- webscout/Provider/AISEARCH/scira_search.py +0 -324
- webscout/Provider/AISEARCH/webpilotai_search.py +0 -281
- webscout/Provider/Aitopia.py +0 -292
- webscout/Provider/AllenAI.py +0 -413
- webscout/Provider/Andi.py +0 -228
- webscout/Provider/Blackboxai.py +0 -229
- webscout/Provider/C4ai.py +0 -432
- webscout/Provider/ChatGPTClone.py +0 -226
- webscout/Provider/ChatGPTES.py +0 -237
- webscout/Provider/ChatGPTGratis.py +0 -194
- webscout/Provider/Chatify.py +0 -175
- webscout/Provider/Cloudflare.py +0 -273
- webscout/Provider/Cohere.py +0 -208
- webscout/Provider/DeepSeek.py +0 -196
- webscout/Provider/Deepinfra.py +0 -297
- webscout/Provider/ElectronHub.py +0 -709
- webscout/Provider/ExaAI.py +0 -261
- webscout/Provider/ExaChat.py +0 -342
- webscout/Provider/Free2GPT.py +0 -241
- webscout/Provider/GPTWeb.py +0 -193
- webscout/Provider/Gemini.py +0 -169
- webscout/Provider/GithubChat.py +0 -367
- webscout/Provider/Glider.py +0 -211
- webscout/Provider/Groq.py +0 -670
- webscout/Provider/HF_space/__init__.py +0 -0
- webscout/Provider/HF_space/qwen_qwen2.py +0 -206
- webscout/Provider/HeckAI.py +0 -233
- webscout/Provider/HuggingFaceChat.py +0 -462
- webscout/Provider/Hunyuan.py +0 -272
- webscout/Provider/Jadve.py +0 -266
- webscout/Provider/Koboldai.py +0 -381
- webscout/Provider/LambdaChat.py +0 -392
- webscout/Provider/Llama.py +0 -200
- webscout/Provider/Llama3.py +0 -204
- webscout/Provider/Marcus.py +0 -148
- webscout/Provider/Netwrck.py +0 -228
- webscout/Provider/OLLAMA.py +0 -396
- webscout/Provider/OPENAI/__init__.py +0 -25
- webscout/Provider/OPENAI/base.py +0 -46
- webscout/Provider/OPENAI/c4ai.py +0 -367
- webscout/Provider/OPENAI/chatgpt.py +0 -549
- webscout/Provider/OPENAI/chatgptclone.py +0 -460
- webscout/Provider/OPENAI/deepinfra.py +0 -272
- webscout/Provider/OPENAI/e2b.py +0 -1350
- webscout/Provider/OPENAI/exaai.py +0 -404
- webscout/Provider/OPENAI/exachat.py +0 -433
- webscout/Provider/OPENAI/freeaichat.py +0 -352
- webscout/Provider/OPENAI/glider.py +0 -316
- webscout/Provider/OPENAI/heckai.py +0 -337
- webscout/Provider/OPENAI/llmchatco.py +0 -327
- webscout/Provider/OPENAI/netwrck.py +0 -348
- webscout/Provider/OPENAI/opkfc.py +0 -488
- webscout/Provider/OPENAI/scirachat.py +0 -463
- webscout/Provider/OPENAI/sonus.py +0 -294
- webscout/Provider/OPENAI/standardinput.py +0 -425
- webscout/Provider/OPENAI/textpollinations.py +0 -285
- webscout/Provider/OPENAI/toolbaz.py +0 -405
- webscout/Provider/OPENAI/typegpt.py +0 -346
- webscout/Provider/OPENAI/uncovrAI.py +0 -455
- webscout/Provider/OPENAI/utils.py +0 -211
- webscout/Provider/OPENAI/venice.py +0 -413
- webscout/Provider/OPENAI/wisecat.py +0 -381
- webscout/Provider/OPENAI/writecream.py +0 -156
- webscout/Provider/OPENAI/x0gpt.py +0 -371
- webscout/Provider/OPENAI/yep.py +0 -327
- webscout/Provider/OpenGPT.py +0 -199
- webscout/Provider/Openai.py +0 -496
- webscout/Provider/PI.py +0 -344
- webscout/Provider/Perplexitylabs.py +0 -415
- webscout/Provider/Phind.py +0 -535
- webscout/Provider/PizzaGPT.py +0 -198
- webscout/Provider/QwenLM.py +0 -254
- webscout/Provider/Reka.py +0 -214
- webscout/Provider/StandardInput.py +0 -278
- webscout/Provider/TTI/AiForce/__init__.py +0 -22
- webscout/Provider/TTI/AiForce/async_aiforce.py +0 -224
- webscout/Provider/TTI/AiForce/sync_aiforce.py +0 -245
- webscout/Provider/TTI/FreeAIPlayground/__init__.py +0 -9
- webscout/Provider/TTI/FreeAIPlayground/async_freeaiplayground.py +0 -181
- webscout/Provider/TTI/FreeAIPlayground/sync_freeaiplayground.py +0 -180
- webscout/Provider/TTI/ImgSys/__init__.py +0 -23
- webscout/Provider/TTI/ImgSys/async_imgsys.py +0 -202
- webscout/Provider/TTI/ImgSys/sync_imgsys.py +0 -195
- webscout/Provider/TTI/MagicStudio/__init__.py +0 -2
- webscout/Provider/TTI/MagicStudio/async_magicstudio.py +0 -111
- webscout/Provider/TTI/MagicStudio/sync_magicstudio.py +0 -109
- webscout/Provider/TTI/Nexra/__init__.py +0 -22
- webscout/Provider/TTI/Nexra/async_nexra.py +0 -286
- webscout/Provider/TTI/Nexra/sync_nexra.py +0 -258
- webscout/Provider/TTI/PollinationsAI/__init__.py +0 -23
- webscout/Provider/TTI/PollinationsAI/async_pollinations.py +0 -311
- webscout/Provider/TTI/PollinationsAI/sync_pollinations.py +0 -265
- webscout/Provider/TTI/__init__.py +0 -12
- webscout/Provider/TTI/aiarta/__init__.py +0 -2
- webscout/Provider/TTI/aiarta/async_aiarta.py +0 -482
- webscout/Provider/TTI/aiarta/sync_aiarta.py +0 -440
- webscout/Provider/TTI/artbit/__init__.py +0 -22
- webscout/Provider/TTI/artbit/async_artbit.py +0 -155
- webscout/Provider/TTI/artbit/sync_artbit.py +0 -148
- webscout/Provider/TTI/fastflux/__init__.py +0 -22
- webscout/Provider/TTI/fastflux/async_fastflux.py +0 -261
- webscout/Provider/TTI/fastflux/sync_fastflux.py +0 -252
- webscout/Provider/TTI/huggingface/__init__.py +0 -22
- webscout/Provider/TTI/huggingface/async_huggingface.py +0 -199
- webscout/Provider/TTI/huggingface/sync_huggingface.py +0 -195
- webscout/Provider/TTI/piclumen/__init__.py +0 -23
- webscout/Provider/TTI/piclumen/async_piclumen.py +0 -268
- webscout/Provider/TTI/piclumen/sync_piclumen.py +0 -233
- webscout/Provider/TTI/pixelmuse/__init__.py +0 -4
- webscout/Provider/TTI/pixelmuse/async_pixelmuse.py +0 -249
- webscout/Provider/TTI/pixelmuse/sync_pixelmuse.py +0 -182
- webscout/Provider/TTI/talkai/__init__.py +0 -4
- webscout/Provider/TTI/talkai/async_talkai.py +0 -229
- webscout/Provider/TTI/talkai/sync_talkai.py +0 -207
- webscout/Provider/TTS/__init__.py +0 -7
- webscout/Provider/TTS/deepgram.py +0 -156
- webscout/Provider/TTS/elevenlabs.py +0 -111
- webscout/Provider/TTS/gesserit.py +0 -127
- webscout/Provider/TTS/murfai.py +0 -113
- webscout/Provider/TTS/parler.py +0 -111
- webscout/Provider/TTS/speechma.py +0 -180
- webscout/Provider/TTS/streamElements.py +0 -333
- webscout/Provider/TTS/utils.py +0 -280
- webscout/Provider/TeachAnything.py +0 -187
- webscout/Provider/TextPollinationsAI.py +0 -231
- webscout/Provider/TwoAI.py +0 -199
- webscout/Provider/Venice.py +0 -219
- webscout/Provider/VercelAI.py +0 -234
- webscout/Provider/WebSim.py +0 -228
- webscout/Provider/WiseCat.py +0 -196
- webscout/Provider/Writecream.py +0 -211
- webscout/Provider/WritingMate.py +0 -197
- webscout/Provider/Youchat.py +0 -330
- webscout/Provider/__init__.py +0 -198
- webscout/Provider/ai4chat.py +0 -202
- webscout/Provider/aimathgpt.py +0 -189
- webscout/Provider/akashgpt.py +0 -342
- webscout/Provider/askmyai.py +0 -158
- webscout/Provider/asksteve.py +0 -203
- webscout/Provider/bagoodex.py +0 -145
- webscout/Provider/cerebras.py +0 -242
- webscout/Provider/chatglm.py +0 -205
- webscout/Provider/cleeai.py +0 -213
- webscout/Provider/copilot.py +0 -428
- webscout/Provider/elmo.py +0 -234
- webscout/Provider/freeaichat.py +0 -271
- webscout/Provider/gaurish.py +0 -244
- webscout/Provider/geminiapi.py +0 -208
- webscout/Provider/geminiprorealtime.py +0 -160
- webscout/Provider/granite.py +0 -187
- webscout/Provider/hermes.py +0 -219
- webscout/Provider/julius.py +0 -223
- webscout/Provider/koala.py +0 -268
- webscout/Provider/labyrinth.py +0 -340
- webscout/Provider/learnfastai.py +0 -266
- webscout/Provider/lepton.py +0 -194
- webscout/Provider/llama3mitril.py +0 -180
- webscout/Provider/llamatutor.py +0 -192
- webscout/Provider/llmchat.py +0 -213
- webscout/Provider/llmchatco.py +0 -311
- webscout/Provider/meta.py +0 -794
- webscout/Provider/multichat.py +0 -325
- webscout/Provider/promptrefine.py +0 -193
- webscout/Provider/scira_chat.py +0 -277
- webscout/Provider/scnet.py +0 -187
- webscout/Provider/searchchat.py +0 -293
- webscout/Provider/sonus.py +0 -208
- webscout/Provider/talkai.py +0 -194
- webscout/Provider/toolbaz.py +0 -320
- webscout/Provider/turboseek.py +0 -219
- webscout/Provider/tutorai.py +0 -252
- webscout/Provider/typefully.py +0 -280
- webscout/Provider/typegpt.py +0 -232
- webscout/Provider/uncovr.py +0 -312
- webscout/Provider/x0gpt.py +0 -256
- webscout/Provider/yep.py +0 -376
- webscout/litagent/__init__.py +0 -29
- webscout/litagent/agent.py +0 -455
- webscout/litagent/constants.py +0 -60
- webscout/litprinter/__init__.py +0 -59
- webscout/scout/__init__.py +0 -8
- webscout/scout/core/__init__.py +0 -7
- webscout/scout/core/crawler.py +0 -140
- webscout/scout/core/scout.py +0 -568
- webscout/scout/core/search_result.py +0 -96
- webscout/scout/core/text_analyzer.py +0 -63
- webscout/scout/core/text_utils.py +0 -277
- webscout/scout/core/web_analyzer.py +0 -52
- webscout/scout/core.py +0 -881
- webscout/scout/element.py +0 -460
- webscout/scout/parsers/__init__.py +0 -69
- webscout/scout/parsers/html5lib_parser.py +0 -172
- webscout/scout/parsers/html_parser.py +0 -236
- webscout/scout/parsers/lxml_parser.py +0 -178
- webscout/scout/utils.py +0 -37
- webscout/swiftcli/__init__.py +0 -809
- webscout/zeroart/__init__.py +0 -55
- webscout/zeroart/base.py +0 -60
- webscout/zeroart/effects.py +0 -99
- webscout/zeroart/fonts.py +0 -816
- webscout-8.2.2.dist-info/RECORD +0 -309
- webscout-8.2.2.dist-info/entry_points.txt +0 -5
- webscout-8.2.2.dist-info/top_level.txt +0 -3
- webstoken/__init__.py +0 -30
- webstoken/classifier.py +0 -189
- webstoken/keywords.py +0 -216
- webstoken/language.py +0 -128
- webstoken/ner.py +0 -164
- webstoken/normalizer.py +0 -35
- webstoken/processor.py +0 -77
- webstoken/sentiment.py +0 -206
- webstoken/stemmer.py +0 -73
- webstoken/tagger.py +0 -60
- webstoken/tokenizer.py +0 -158
- {webscout-8.2.2.dist-info → webscout-8.2.7.dist-info/licenses}/LICENSE.md +0 -0
webscout/litagent/agent.py
DELETED
|
@@ -1,455 +0,0 @@
|
|
|
1
|
-
"""Main LitAgent implementation."""
|
|
2
|
-
|
|
3
|
-
import random
|
|
4
|
-
import threading
|
|
5
|
-
from typing import List, Dict, Any, Optional
|
|
6
|
-
|
|
7
|
-
from webscout.litagent.constants import BROWSERS, OS_VERSIONS, DEVICES, FINGERPRINTS
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class LitAgent:
|
|
11
|
-
"""A lit user agent generator that keeps it fresh! 🌟"""
|
|
12
|
-
|
|
13
|
-
def __init__(self, thread_safe: bool = False):
|
|
14
|
-
"""Initialize LitAgent with style! 💫
|
|
15
|
-
|
|
16
|
-
Args:
|
|
17
|
-
thread_safe (bool): Enable thread-safety for multi-threaded applications
|
|
18
|
-
"""
|
|
19
|
-
self.agents = self._generate_agents(100) # Keep 100 agents in memory
|
|
20
|
-
self.thread_safe = thread_safe
|
|
21
|
-
self.lock = threading.RLock() if thread_safe else None
|
|
22
|
-
self._refresh_timer = None
|
|
23
|
-
self._stats = {
|
|
24
|
-
"total_generated": 100,
|
|
25
|
-
"requests_served": 0,
|
|
26
|
-
"browser_usage": {browser: 0 for browser in BROWSERS.keys()},
|
|
27
|
-
"device_usage": {device: 0 for device in DEVICES.keys()}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
def _generate_agents(self, count: int) -> List[str]:
|
|
31
|
-
"""Generate some lit user agents! 🛠️"""
|
|
32
|
-
agents = []
|
|
33
|
-
for _ in range(count):
|
|
34
|
-
browser = random.choice(list(BROWSERS.keys()))
|
|
35
|
-
version = random.randint(*BROWSERS[browser])
|
|
36
|
-
|
|
37
|
-
if browser in ['chrome', 'firefox', 'edge', 'opera', 'brave', 'vivaldi']:
|
|
38
|
-
os_type = random.choice(['windows', 'mac', 'linux'])
|
|
39
|
-
os_ver = random.choice(OS_VERSIONS[os_type])
|
|
40
|
-
|
|
41
|
-
if os_type == 'windows':
|
|
42
|
-
platform = f"Windows NT {os_ver}"
|
|
43
|
-
elif os_type == 'mac':
|
|
44
|
-
platform = f"Macintosh; Intel Mac OS X {os_ver}"
|
|
45
|
-
else:
|
|
46
|
-
platform = f"X11; Linux {os_ver}"
|
|
47
|
-
|
|
48
|
-
agent = f"Mozilla/5.0 ({platform}) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
49
|
-
if browser == 'chrome':
|
|
50
|
-
agent += f"Chrome/{version}.0.0.0 Safari/537.36"
|
|
51
|
-
elif browser == 'firefox':
|
|
52
|
-
agent += f"Firefox/{version}.0"
|
|
53
|
-
elif browser == 'edge':
|
|
54
|
-
agent += f"Edge/{version}.0.0.0"
|
|
55
|
-
elif browser == 'opera':
|
|
56
|
-
agent += f"OPR/{version}.0.0.0"
|
|
57
|
-
elif browser == 'brave':
|
|
58
|
-
agent += f"Chrome/{version}.0.0.0 Safari/537.36 Brave/{version}.0.0.0"
|
|
59
|
-
elif browser == 'vivaldi':
|
|
60
|
-
agent += f"Chrome/{version}.0.0.0 Safari/537.36 Vivaldi/{version}.0.{random.randint(1000, 9999)}"
|
|
61
|
-
|
|
62
|
-
elif browser == 'safari':
|
|
63
|
-
device = random.choice(['mac', 'ios'])
|
|
64
|
-
if device == 'mac':
|
|
65
|
-
ver = random.choice(OS_VERSIONS['mac'])
|
|
66
|
-
agent = f"Mozilla/5.0 (Macintosh; Intel Mac OS X {ver}) "
|
|
67
|
-
else:
|
|
68
|
-
ver = random.choice(OS_VERSIONS['ios'])
|
|
69
|
-
device = random.choice(['iPhone', 'iPad'])
|
|
70
|
-
agent = f"Mozilla/5.0 ({device}; CPU OS {ver} like Mac OS X) "
|
|
71
|
-
agent += f"AppleWebKit/{version}.1.15 (KHTML, like Gecko) Version/{version//100}.0 Safari/{version}.1.15"
|
|
72
|
-
|
|
73
|
-
agents.append(agent)
|
|
74
|
-
|
|
75
|
-
return list(set(agents)) # Remove any duplicates
|
|
76
|
-
|
|
77
|
-
def _update_stats(self, browser_type=None, device_type=None):
|
|
78
|
-
"""Update usage statistics."""
|
|
79
|
-
if self.thread_safe and self.lock:
|
|
80
|
-
with self.lock:
|
|
81
|
-
self._stats["requests_served"] += 1
|
|
82
|
-
if browser_type:
|
|
83
|
-
self._stats["browser_usage"][browser_type] = self._stats["browser_usage"].get(browser_type, 0) + 1
|
|
84
|
-
if device_type:
|
|
85
|
-
self._stats["device_usage"][device_type] = self._stats["device_usage"].get(device_type, 0) + 1
|
|
86
|
-
else:
|
|
87
|
-
self._stats["requests_served"] += 1
|
|
88
|
-
if browser_type:
|
|
89
|
-
self._stats["browser_usage"][browser_type] = self._stats["browser_usage"].get(browser_type, 0) + 1
|
|
90
|
-
if device_type:
|
|
91
|
-
self._stats["device_usage"][device_type] = self._stats["device_usage"].get(device_type, 0) + 1
|
|
92
|
-
|
|
93
|
-
def random(self) -> str:
|
|
94
|
-
"""Get a random user agent! 🎲"""
|
|
95
|
-
if self.thread_safe and self.lock:
|
|
96
|
-
with self.lock:
|
|
97
|
-
agent = random.choice(self.agents)
|
|
98
|
-
self._update_stats()
|
|
99
|
-
return agent
|
|
100
|
-
else:
|
|
101
|
-
agent = random.choice(self.agents)
|
|
102
|
-
self._update_stats()
|
|
103
|
-
return agent
|
|
104
|
-
|
|
105
|
-
def browser(self, name: str) -> str:
|
|
106
|
-
"""Get a browser-specific agent! 🌐"""
|
|
107
|
-
name = name.lower()
|
|
108
|
-
if name not in BROWSERS:
|
|
109
|
-
return self.random()
|
|
110
|
-
|
|
111
|
-
if self.thread_safe and self.lock:
|
|
112
|
-
with self.lock:
|
|
113
|
-
agents = [a for a in self.agents if name in a.lower()]
|
|
114
|
-
agent = random.choice(agents) if agents else self.random()
|
|
115
|
-
self._update_stats(browser_type=name)
|
|
116
|
-
return agent
|
|
117
|
-
else:
|
|
118
|
-
agents = [a for a in self.agents if name in a.lower()]
|
|
119
|
-
agent = random.choice(agents) if agents else self.random()
|
|
120
|
-
self._update_stats(browser_type=name)
|
|
121
|
-
return agent
|
|
122
|
-
|
|
123
|
-
def mobile(self) -> str:
|
|
124
|
-
"""Get a mobile device agent! 📱"""
|
|
125
|
-
if self.thread_safe and self.lock:
|
|
126
|
-
with self.lock:
|
|
127
|
-
agents = [a for a in self.agents if any(d in a for d in DEVICES['mobile'])]
|
|
128
|
-
agent = random.choice(agents) if agents else self.random()
|
|
129
|
-
self._update_stats(device_type="mobile")
|
|
130
|
-
return agent
|
|
131
|
-
else:
|
|
132
|
-
agents = [a for a in self.agents if any(d in a for d in DEVICES['mobile'])]
|
|
133
|
-
agent = random.choice(agents) if agents else self.random()
|
|
134
|
-
self._update_stats(device_type="mobile")
|
|
135
|
-
return agent
|
|
136
|
-
|
|
137
|
-
def desktop(self) -> str:
|
|
138
|
-
"""Get a desktop agent! 💻"""
|
|
139
|
-
if self.thread_safe and self.lock:
|
|
140
|
-
with self.lock:
|
|
141
|
-
agents = [a for a in self.agents if 'Windows' in a or 'Macintosh' in a or 'Linux' in a]
|
|
142
|
-
agent = random.choice(agents) if agents else self.random()
|
|
143
|
-
self._update_stats(device_type="desktop")
|
|
144
|
-
return agent
|
|
145
|
-
else:
|
|
146
|
-
agents = [a for a in self.agents if 'Windows' in a or 'Macintosh' in a or 'Linux' in a]
|
|
147
|
-
agent = random.choice(agents) if agents else self.random()
|
|
148
|
-
self._update_stats(device_type="desktop")
|
|
149
|
-
return agent
|
|
150
|
-
|
|
151
|
-
def tablet(self) -> str:
|
|
152
|
-
"""Get a tablet agent! 📱"""
|
|
153
|
-
if self.thread_safe and self.lock:
|
|
154
|
-
with self.lock:
|
|
155
|
-
# Focus on iPad and Android tablets
|
|
156
|
-
agents = [a for a in self.agents if 'iPad' in a or 'Android' in a and not 'Mobile' in a]
|
|
157
|
-
agent = random.choice(agents) if agents else self.random()
|
|
158
|
-
self._update_stats(device_type="tablet")
|
|
159
|
-
return agent
|
|
160
|
-
else:
|
|
161
|
-
agents = [a for a in self.agents if 'iPad' in a or 'Android' in a and not 'Mobile' in a]
|
|
162
|
-
agent = random.choice(agents) if agents else self.random()
|
|
163
|
-
self._update_stats(device_type="tablet")
|
|
164
|
-
return agent
|
|
165
|
-
|
|
166
|
-
def smart_tv(self) -> str:
|
|
167
|
-
"""Get a Smart TV agent! 📺"""
|
|
168
|
-
# Create a TV-specific agent since they may not be in our standard pool
|
|
169
|
-
tv_type = random.choice(DEVICES['tv'])
|
|
170
|
-
if 'Samsung' in tv_type:
|
|
171
|
-
agent = f"Mozilla/5.0 (SMART-TV; SAMSUNG; {tv_type}; Tizen 5.5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.38 Safari/537.36"
|
|
172
|
-
elif 'LG' in tv_type:
|
|
173
|
-
agent = f"Mozilla/5.0 (Web0S; {tv_type}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"
|
|
174
|
-
elif 'Android' in tv_type:
|
|
175
|
-
agent = f"Mozilla/5.0 (Linux; Android 9; {tv_type}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"
|
|
176
|
-
elif 'Apple' in tv_type:
|
|
177
|
-
agent = f"Mozilla/5.0 (AppleTV; CPU like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"
|
|
178
|
-
else:
|
|
179
|
-
agent = f"Mozilla/5.0 (Linux; {tv_type}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"
|
|
180
|
-
|
|
181
|
-
self._update_stats(device_type="tv")
|
|
182
|
-
return agent
|
|
183
|
-
|
|
184
|
-
def gaming(self) -> str:
|
|
185
|
-
"""Get a gaming console agent! 🎮"""
|
|
186
|
-
console_type = random.choice(DEVICES['console'])
|
|
187
|
-
if 'PlayStation' in console_type:
|
|
188
|
-
agent = f"Mozilla/5.0 ({console_type}/5.0) AppleWebKit/601.2 (KHTML, like Gecko)"
|
|
189
|
-
elif 'Xbox' in console_type:
|
|
190
|
-
agent = f"Mozilla/5.0 ({console_type}; Xbox; Xbox One) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19041"
|
|
191
|
-
elif 'Nintendo' in console_type:
|
|
192
|
-
agent = f"Mozilla/5.0 (Nintendo Switch; {console_type}) AppleWebKit/601.6 (KHTML, like Gecko) NintendoBrowser/5.1.0.13343"
|
|
193
|
-
else:
|
|
194
|
-
agent = self.random()
|
|
195
|
-
|
|
196
|
-
self._update_stats(device_type="console")
|
|
197
|
-
return agent
|
|
198
|
-
|
|
199
|
-
def chrome(self) -> str:
|
|
200
|
-
"""Get a Chrome agent! 🌐"""
|
|
201
|
-
return self.browser('chrome')
|
|
202
|
-
|
|
203
|
-
def firefox(self) -> str:
|
|
204
|
-
"""Get a Firefox agent! 🦊"""
|
|
205
|
-
return self.browser('firefox')
|
|
206
|
-
|
|
207
|
-
def safari(self) -> str:
|
|
208
|
-
"""Get a Safari agent! 🧭"""
|
|
209
|
-
return self.browser('safari')
|
|
210
|
-
|
|
211
|
-
def edge(self) -> str:
|
|
212
|
-
"""Get an Edge agent! 📐"""
|
|
213
|
-
return self.browser('edge')
|
|
214
|
-
|
|
215
|
-
def opera(self) -> str:
|
|
216
|
-
"""Get an Opera agent! 🎭"""
|
|
217
|
-
return self.browser('opera')
|
|
218
|
-
|
|
219
|
-
def brave(self) -> str:
|
|
220
|
-
"""Get a Brave agent! 🦁"""
|
|
221
|
-
return self.browser('brave')
|
|
222
|
-
|
|
223
|
-
def vivaldi(self) -> str:
|
|
224
|
-
"""Get a Vivaldi agent! 🎨"""
|
|
225
|
-
return self.browser('vivaldi')
|
|
226
|
-
|
|
227
|
-
# OS-specific agents
|
|
228
|
-
def windows(self) -> str:
|
|
229
|
-
"""Get a Windows agent! 🪟"""
|
|
230
|
-
agents = [a for a in self.agents if 'Windows' in a]
|
|
231
|
-
agent = random.choice(agents) if agents else self.random()
|
|
232
|
-
self._update_stats()
|
|
233
|
-
return agent
|
|
234
|
-
|
|
235
|
-
def macos(self) -> str:
|
|
236
|
-
"""Get a macOS agent! 🍎"""
|
|
237
|
-
agents = [a for a in self.agents if 'Macintosh' in a]
|
|
238
|
-
agent = random.choice(agents) if agents else self.random()
|
|
239
|
-
self._update_stats()
|
|
240
|
-
return agent
|
|
241
|
-
|
|
242
|
-
def linux(self) -> str:
|
|
243
|
-
"""Get a Linux agent! 🐧"""
|
|
244
|
-
agents = [a for a in self.agents if 'Linux' in a and 'Android' not in a]
|
|
245
|
-
agent = random.choice(agents) if agents else self.random()
|
|
246
|
-
self._update_stats()
|
|
247
|
-
return agent
|
|
248
|
-
|
|
249
|
-
def android(self) -> str:
|
|
250
|
-
"""Get an Android agent! 🤖"""
|
|
251
|
-
agents = [a for a in self.agents if 'Android' in a]
|
|
252
|
-
agent = random.choice(agents) if agents else self.random()
|
|
253
|
-
self._update_stats()
|
|
254
|
-
return agent
|
|
255
|
-
|
|
256
|
-
def ios(self) -> str:
|
|
257
|
-
"""Get an iOS agent! 📱"""
|
|
258
|
-
agents = [a for a in self.agents if 'iPhone' in a or 'iPad' in a]
|
|
259
|
-
agent = random.choice(agents) if agents else self.random()
|
|
260
|
-
self._update_stats()
|
|
261
|
-
return agent
|
|
262
|
-
|
|
263
|
-
def custom(self, browser: str, version: Optional[str] = None,
|
|
264
|
-
os: Optional[str] = None, os_version: Optional[str] = None,
|
|
265
|
-
device_type: Optional[str] = None) -> str:
|
|
266
|
-
"""Generate a custom user agent with specified parameters! 🛠️
|
|
267
|
-
|
|
268
|
-
Args:
|
|
269
|
-
browser: Browser name (chrome, firefox, safari, edge, opera)
|
|
270
|
-
version: Browser version (optional)
|
|
271
|
-
os: Operating system (windows, mac, linux, android, ios)
|
|
272
|
-
os_version: OS version (optional)
|
|
273
|
-
device_type: Device type (desktop, mobile, tablet)
|
|
274
|
-
|
|
275
|
-
Returns:
|
|
276
|
-
Customized user agent string
|
|
277
|
-
"""
|
|
278
|
-
browser = browser.lower() if browser else 'chrome'
|
|
279
|
-
if browser not in BROWSERS:
|
|
280
|
-
browser = 'chrome'
|
|
281
|
-
|
|
282
|
-
if version:
|
|
283
|
-
try:
|
|
284
|
-
version_num = int(version.split('.')[0])
|
|
285
|
-
except (ValueError, IndexError):
|
|
286
|
-
version_num = random.randint(*BROWSERS[browser])
|
|
287
|
-
else:
|
|
288
|
-
version_num = random.randint(*BROWSERS[browser])
|
|
289
|
-
|
|
290
|
-
os = os.lower() if os else random.choice(['windows', 'mac', 'linux'])
|
|
291
|
-
if os not in OS_VERSIONS:
|
|
292
|
-
os = 'windows'
|
|
293
|
-
|
|
294
|
-
os_ver = os_version or random.choice(OS_VERSIONS[os])
|
|
295
|
-
|
|
296
|
-
device_type = device_type.lower() if device_type else 'desktop'
|
|
297
|
-
|
|
298
|
-
# Build the user agent
|
|
299
|
-
if os == 'windows':
|
|
300
|
-
platform = f"Windows NT {os_ver}"
|
|
301
|
-
elif os == 'mac':
|
|
302
|
-
platform = f"Macintosh; Intel Mac OS X {os_ver}"
|
|
303
|
-
elif os == 'linux':
|
|
304
|
-
platform = f"X11; Linux {OS_VERSIONS['linux'][0]}"
|
|
305
|
-
elif os == 'android':
|
|
306
|
-
platform = f"Linux; Android {os_ver}; {random.choice(DEVICES['mobile'])}"
|
|
307
|
-
elif os == 'ios':
|
|
308
|
-
device = 'iPhone' if device_type == 'mobile' else 'iPad'
|
|
309
|
-
platform = f"{device}; CPU OS {os_ver} like Mac OS X"
|
|
310
|
-
else:
|
|
311
|
-
platform = f"Windows NT 10.0" # Default fallback
|
|
312
|
-
|
|
313
|
-
agent = f"Mozilla/5.0 ({platform}) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
314
|
-
|
|
315
|
-
if browser == 'chrome':
|
|
316
|
-
agent += f"Chrome/{version_num}.0.0.0 Safari/537.36"
|
|
317
|
-
elif browser == 'firefox':
|
|
318
|
-
agent += f"Firefox/{version_num}.0"
|
|
319
|
-
elif browser == 'safari':
|
|
320
|
-
safari_ver = random.randint(*BROWSERS['safari'])
|
|
321
|
-
agent += f"Version/{version_num}.0 Safari/{safari_ver}.0"
|
|
322
|
-
elif browser == 'edge':
|
|
323
|
-
agent += f"Chrome/{version_num}.0.0.0 Safari/537.36 Edg/{version_num}.0.0.0"
|
|
324
|
-
elif browser == 'opera':
|
|
325
|
-
agent += f"Chrome/{version_num}.0.0.0 Safari/537.36 OPR/{version_num}.0.0.0"
|
|
326
|
-
elif browser == 'brave':
|
|
327
|
-
agent += f"Chrome/{version_num}.0.0.0 Safari/537.36 Brave/{version_num}.1.0"
|
|
328
|
-
|
|
329
|
-
self._update_stats(browser_type=browser, device_type=device_type)
|
|
330
|
-
return agent
|
|
331
|
-
|
|
332
|
-
def generate_fingerprint(self, browser: Optional[str] = None) -> Dict[str, str]:
|
|
333
|
-
"""Generate a consistent browser fingerprint! 👆
|
|
334
|
-
|
|
335
|
-
This creates a coherent set of headers for anti-fingerprinting.
|
|
336
|
-
|
|
337
|
-
Args:
|
|
338
|
-
browser: Specific browser to generate fingerprint for
|
|
339
|
-
|
|
340
|
-
Returns:
|
|
341
|
-
Dictionary with fingerprinting headers
|
|
342
|
-
"""
|
|
343
|
-
# Get a random user agent using the random() method
|
|
344
|
-
user_agent = self.random()
|
|
345
|
-
|
|
346
|
-
# If browser is specified, try to get a matching one
|
|
347
|
-
if browser:
|
|
348
|
-
browser = browser.lower()
|
|
349
|
-
if browser in BROWSERS:
|
|
350
|
-
user_agent = self.browser(browser)
|
|
351
|
-
|
|
352
|
-
accept_language = random.choice(FINGERPRINTS["accept_language"])
|
|
353
|
-
accept = random.choice(FINGERPRINTS["accept"])
|
|
354
|
-
platform = random.choice(FINGERPRINTS["platforms"])
|
|
355
|
-
|
|
356
|
-
# Generate sec-ch-ua based on the user agent
|
|
357
|
-
sec_ch_ua = ""
|
|
358
|
-
for browser_name in FINGERPRINTS["sec_ch_ua"]:
|
|
359
|
-
if browser_name in user_agent.lower():
|
|
360
|
-
version = random.randint(*BROWSERS[browser_name])
|
|
361
|
-
sec_ch_ua = FINGERPRINTS["sec_ch_ua"][browser_name].format(version, version)
|
|
362
|
-
break
|
|
363
|
-
|
|
364
|
-
fingerprint = {
|
|
365
|
-
"user_agent": user_agent,
|
|
366
|
-
"accept_language": accept_language,
|
|
367
|
-
"accept": accept,
|
|
368
|
-
"sec_ch_ua": sec_ch_ua,
|
|
369
|
-
"platform": platform
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
self._update_stats(browser_type=browser)
|
|
373
|
-
return fingerprint
|
|
374
|
-
|
|
375
|
-
def refresh(self) -> None:
|
|
376
|
-
"""Refresh the agents with new ones! 🔄"""
|
|
377
|
-
if self.thread_safe and self.lock:
|
|
378
|
-
with self.lock:
|
|
379
|
-
self.agents = self._generate_agents(100)
|
|
380
|
-
self._stats["total_generated"] += 100
|
|
381
|
-
else:
|
|
382
|
-
self.agents = self._generate_agents(100)
|
|
383
|
-
self._stats["total_generated"] += 100
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
def auto_refresh(self, interval_minutes: int = 30) -> None:
|
|
387
|
-
"""Set up automatic refreshing of agents pool! ⏱️
|
|
388
|
-
|
|
389
|
-
Args:
|
|
390
|
-
interval_minutes: Minutes between refreshes
|
|
391
|
-
"""
|
|
392
|
-
if self._refresh_timer:
|
|
393
|
-
self._refresh_timer.cancel()
|
|
394
|
-
|
|
395
|
-
def _refresh_task():
|
|
396
|
-
self.refresh()
|
|
397
|
-
self._refresh_timer = threading.Timer(interval_minutes * 60, _refresh_task)
|
|
398
|
-
self._refresh_timer.daemon = True
|
|
399
|
-
self._refresh_timer.start()
|
|
400
|
-
|
|
401
|
-
self._refresh_timer = threading.Timer(interval_minutes * 60, _refresh_task)
|
|
402
|
-
self._refresh_timer.daemon = True
|
|
403
|
-
self._refresh_timer.start()
|
|
404
|
-
|
|
405
|
-
def get_stats(self) -> Dict[str, Any]:
|
|
406
|
-
"""Get statistics about agent usage! 📊
|
|
407
|
-
|
|
408
|
-
Returns:
|
|
409
|
-
Dictionary with usage statistics
|
|
410
|
-
"""
|
|
411
|
-
stats_copy = self._stats.copy()
|
|
412
|
-
# Calculate top browser
|
|
413
|
-
top_browser = max(stats_copy["browser_usage"].items(), key=lambda x: x[1])[0] if stats_copy["browser_usage"] else None
|
|
414
|
-
stats_copy["top_browser"] = top_browser
|
|
415
|
-
|
|
416
|
-
# Calculate fake detection avoidance rate (just for fun)
|
|
417
|
-
stats_copy["avoidance_rate"] = min(99.9, 90 + (stats_copy["total_generated"] / 1000))
|
|
418
|
-
|
|
419
|
-
return stats_copy
|
|
420
|
-
|
|
421
|
-
def export_stats(self, filename: str) -> bool:
|
|
422
|
-
"""Export usage statistics to a file! 💾
|
|
423
|
-
|
|
424
|
-
Args:
|
|
425
|
-
filename: Path to export the stats
|
|
426
|
-
|
|
427
|
-
Returns:
|
|
428
|
-
True if export was successful, False otherwise
|
|
429
|
-
"""
|
|
430
|
-
try:
|
|
431
|
-
import json
|
|
432
|
-
with open(filename, 'w') as f:
|
|
433
|
-
json.dump(self.get_stats(), f, indent=2)
|
|
434
|
-
return True
|
|
435
|
-
except Exception as e:
|
|
436
|
-
return False
|
|
437
|
-
|
|
438
|
-
if __name__ == "__main__":
|
|
439
|
-
# Test it out! 🧪
|
|
440
|
-
agent = LitAgent()
|
|
441
|
-
print("Random:", agent.random())
|
|
442
|
-
print("Chrome:", agent.chrome())
|
|
443
|
-
print("Firefox:", agent.firefox())
|
|
444
|
-
print("Safari:", agent.safari())
|
|
445
|
-
print("Mobile:", agent.mobile())
|
|
446
|
-
print("Desktop:", agent.desktop())
|
|
447
|
-
print("Tablet:", agent.tablet())
|
|
448
|
-
print("Smart TV:", agent.smart_tv())
|
|
449
|
-
print("Gaming:", agent.gaming())
|
|
450
|
-
|
|
451
|
-
# Test custom agent
|
|
452
|
-
print("Custom:", agent.custom(browser="chrome", os="windows", os_version="10.0"))
|
|
453
|
-
|
|
454
|
-
# Test fingerprinting
|
|
455
|
-
print("Fingerprint:", agent.generate_fingerprint("chrome"))
|
webscout/litagent/constants.py
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
"""Constants used by the LitAgent module."""
|
|
2
|
-
|
|
3
|
-
# Browser versions we support
|
|
4
|
-
BROWSERS = {
|
|
5
|
-
"chrome": (48, 120),
|
|
6
|
-
"firefox": (48, 121),
|
|
7
|
-
"safari": (605, 617),
|
|
8
|
-
"edge": (79, 120),
|
|
9
|
-
"opera": (48, 104),
|
|
10
|
-
"brave": (100, 120),
|
|
11
|
-
"vivaldi": (5, 6)
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
# OS versions
|
|
15
|
-
OS_VERSIONS = {
|
|
16
|
-
"windows": ["10.0", "11.0"],
|
|
17
|
-
"mac": ["10_15_7", "11_0", "12_0", "13_0", "14_0"],
|
|
18
|
-
"linux": ["x86_64", "i686"],
|
|
19
|
-
"android": ["10", "11", "12", "13", "14"],
|
|
20
|
-
"ios": ["14_0", "15_0", "16_0", "17_0"],
|
|
21
|
-
"chrome_os": ["13.0", "14.0", "15.0"]
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
# Device types
|
|
25
|
-
DEVICES = {
|
|
26
|
-
"mobile": [
|
|
27
|
-
"iPhone", "iPad", "Samsung Galaxy", "Google Pixel",
|
|
28
|
-
"OnePlus", "Xiaomi", "Huawei", "OPPO", "Vivo"
|
|
29
|
-
],
|
|
30
|
-
"desktop": ["Windows PC", "MacBook", "iMac", "Linux Desktop"],
|
|
31
|
-
"tablet": ["iPad", "Samsung Galaxy Tab", "Microsoft Surface", "Huawei MatePad", "Lenovo Tab"],
|
|
32
|
-
"console": ["PlayStation 5", "Xbox Series X", "Nintendo Switch", "PlayStation 4", "Xbox One"],
|
|
33
|
-
"tv": ["Samsung Smart TV", "LG WebOS", "Android TV", "Apple TV", "Sony Bravia"],
|
|
34
|
-
"wearable": ["Apple Watch", "Samsung Galaxy Watch", "Fitbit", "Garmin"]
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
# Browser fingerprinting components
|
|
38
|
-
FINGERPRINTS = {
|
|
39
|
-
"accept_language": [
|
|
40
|
-
"en-US,en;q=0.9",
|
|
41
|
-
"en-GB,en;q=0.8,en-US;q=0.6",
|
|
42
|
-
"es-ES,es;q=0.9,en;q=0.8",
|
|
43
|
-
"fr-FR,fr;q=0.9,en;q=0.8",
|
|
44
|
-
"de-DE,de;q=0.9,en;q=0.8"
|
|
45
|
-
],
|
|
46
|
-
"accept": [
|
|
47
|
-
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
|
|
48
|
-
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
|
49
|
-
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"
|
|
50
|
-
],
|
|
51
|
-
"sec_ch_ua": {
|
|
52
|
-
"chrome": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"{}\", \"Google Chrome\";v=\"{}\"",
|
|
53
|
-
"edge": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"{}\", \"Microsoft Edge\";v=\"{}\"",
|
|
54
|
-
"firefox": "\"Firefox\";v=\"{}\", \"Not;A=Brand\";v=\"8\"",
|
|
55
|
-
"safari": "\"Safari\";v=\"{}\", \"Not;A=Brand\";v=\"99\""
|
|
56
|
-
},
|
|
57
|
-
"platforms": [
|
|
58
|
-
"Windows", "macOS", "Linux", "Android", "iOS"
|
|
59
|
-
]
|
|
60
|
-
}
|
webscout/litprinter/__init__.py
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
>>> from litprinter import litprint
|
|
3
|
-
>>> from litprinter import lit
|
|
4
|
-
>>> from litprinter import install, uninstall
|
|
5
|
-
>>>
|
|
6
|
-
>>> litprint("Hello, world!")
|
|
7
|
-
LIT -> [__main__.py:1] in () >>> Hello, world!
|
|
8
|
-
>>>
|
|
9
|
-
>>> def my_function():
|
|
10
|
-
... lit(1, 2, 3)
|
|
11
|
-
>>> my_function()
|
|
12
|
-
LIT -> [__main__.py:4] in my_function() >>> 1, 2, 3
|
|
13
|
-
>>> install()
|
|
14
|
-
>>> ic("This is now the builtins.ic()")
|
|
15
|
-
LIT -> [__main__.py:7] in () >>> This is now the builtins.ic()
|
|
16
|
-
>>> uninstall()
|
|
17
|
-
|
|
18
|
-
This module provides enhanced print and logging functionalities for Python,
|
|
19
|
-
allowing developers to debug their code with style and precision. It
|
|
20
|
-
includes the litprint and lit functions for debugging, log for logging, and
|
|
21
|
-
install/uninstall functions for integration into the builtins module.
|
|
22
|
-
It also handles colorizing output and provides different styles and customizable
|
|
23
|
-
options.
|
|
24
|
-
|
|
25
|
-
LITPRINTER is inspired by the icecream package and provides similar functionality
|
|
26
|
-
with additional features:
|
|
27
|
-
- Variable inspection with expression display
|
|
28
|
-
- Return value handling for inline usage
|
|
29
|
-
- Support for custom formatters for specific data types
|
|
30
|
-
- Execution context tracking
|
|
31
|
-
- Rich-like colorized output with multiple themes (JARVIS, RICH, MODERN, NEON, CYBERPUNK)
|
|
32
|
-
- Better JSON formatting with indent=2 by default
|
|
33
|
-
- Advanced pretty printing for complex data structures with smart truncation
|
|
34
|
-
- Clickable file paths in supported terminals and editors (VSCode compatible)
|
|
35
|
-
- Enhanced visual formatting with better spacing and separators
|
|
36
|
-
- Special formatters for common types (Exception, bytes, set, frozenset, etc.)
|
|
37
|
-
- Smart object introspection for custom classes
|
|
38
|
-
- Logging capabilities with timestamp and log levels
|
|
39
|
-
"""
|
|
40
|
-
|
|
41
|
-
# Try to import from the standalone litprinter package first
|
|
42
|
-
# If it's not installed
|
|
43
|
-
try:
|
|
44
|
-
import litprinter
|
|
45
|
-
# If standalone package is found, re-export all its components
|
|
46
|
-
from litprinter import litprint, lit, log, ic, install, uninstall
|
|
47
|
-
from litprinter import LITPrintDebugger, argumentToString
|
|
48
|
-
from litprinter import JARVIS, RICH, MODERN, NEON, CYBERPUNK, create_custom_style
|
|
49
|
-
from litprinter import traceback
|
|
50
|
-
# For compatibility with icecream
|
|
51
|
-
enable = litprinter.enable
|
|
52
|
-
disable = litprinter.disable
|
|
53
|
-
|
|
54
|
-
except ImportError:
|
|
55
|
-
# Raise a more informative error when litprinter is not installed
|
|
56
|
-
raise ImportError(
|
|
57
|
-
"The 'litprinter' package is required but not installed. "
|
|
58
|
-
"Please install it using: pip install litprinter"
|
|
59
|
-
) from None
|
webscout/scout/__init__.py
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Scout: A powerful, zero-dependency web scraping library
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
from .core import Scout, ScoutCrawler, ScoutTextAnalyzer, ScoutWebAnalyzer, ScoutSearchResult
|
|
6
|
-
from .element import Tag, NavigableString
|
|
7
|
-
|
|
8
|
-
__all__ = ['Scout', 'ScoutCrawler', 'Tag', 'NavigableString','ScoutTextAnalyzer', 'ScoutWebAnalyzer', 'ScoutSearchResult']
|
webscout/scout/core/__init__.py
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
from .text_analyzer import ScoutTextAnalyzer
|
|
2
|
-
from .web_analyzer import ScoutWebAnalyzer
|
|
3
|
-
from .search_result import ScoutSearchResult
|
|
4
|
-
from .crawler import ScoutCrawler
|
|
5
|
-
from .scout import Scout
|
|
6
|
-
|
|
7
|
-
__all__ = ['ScoutTextAnalyzer', 'ScoutWebAnalyzer', 'ScoutSearchResult', 'ScoutCrawler', 'Scout']
|