webscout 8.3.7__py3-none-any.whl → 2025.10.13__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 +250 -250
- webscout/AIbase.py +379 -379
- webscout/AIutel.py +60 -60
- webscout/Bard.py +1012 -1012
- webscout/Bing_search.py +417 -417
- webscout/DWEBS.py +529 -529
- webscout/Extra/Act.md +309 -309
- webscout/Extra/GitToolkit/__init__.py +10 -10
- webscout/Extra/GitToolkit/gitapi/README.md +110 -110
- webscout/Extra/GitToolkit/gitapi/__init__.py +11 -11
- webscout/Extra/GitToolkit/gitapi/repository.py +195 -195
- webscout/Extra/GitToolkit/gitapi/user.py +96 -96
- webscout/Extra/GitToolkit/gitapi/utils.py +61 -61
- webscout/Extra/YTToolkit/README.md +375 -375
- webscout/Extra/YTToolkit/YTdownloader.py +956 -956
- webscout/Extra/YTToolkit/__init__.py +2 -2
- webscout/Extra/YTToolkit/transcriber.py +475 -475
- webscout/Extra/YTToolkit/ytapi/README.md +44 -44
- webscout/Extra/YTToolkit/ytapi/__init__.py +6 -6
- webscout/Extra/YTToolkit/ytapi/channel.py +307 -307
- webscout/Extra/YTToolkit/ytapi/errors.py +13 -13
- webscout/Extra/YTToolkit/ytapi/extras.py +118 -118
- webscout/Extra/YTToolkit/ytapi/https.py +88 -88
- webscout/Extra/YTToolkit/ytapi/patterns.py +61 -61
- webscout/Extra/YTToolkit/ytapi/playlist.py +58 -58
- webscout/Extra/YTToolkit/ytapi/pool.py +7 -7
- webscout/Extra/YTToolkit/ytapi/query.py +39 -39
- webscout/Extra/YTToolkit/ytapi/stream.py +62 -62
- webscout/Extra/YTToolkit/ytapi/utils.py +62 -62
- webscout/Extra/YTToolkit/ytapi/video.py +232 -232
- webscout/Extra/autocoder/__init__.py +9 -9
- webscout/Extra/autocoder/autocoder.py +1105 -1105
- webscout/Extra/autocoder/autocoder_utiles.py +332 -332
- webscout/Extra/gguf.md +429 -429
- webscout/Extra/gguf.py +1213 -1213
- webscout/Extra/tempmail/README.md +487 -487
- webscout/Extra/tempmail/__init__.py +27 -27
- webscout/Extra/tempmail/async_utils.py +140 -140
- webscout/Extra/tempmail/base.py +160 -160
- webscout/Extra/tempmail/cli.py +186 -186
- webscout/Extra/tempmail/emailnator.py +84 -84
- webscout/Extra/tempmail/mail_tm.py +360 -360
- webscout/Extra/tempmail/temp_mail_io.py +291 -291
- webscout/Extra/weather.md +281 -281
- webscout/Extra/weather.py +193 -193
- webscout/Litlogger/README.md +10 -10
- webscout/Litlogger/__init__.py +15 -15
- webscout/Litlogger/formats.py +13 -13
- webscout/Litlogger/handlers.py +121 -121
- webscout/Litlogger/levels.py +13 -13
- webscout/Litlogger/logger.py +134 -134
- webscout/Provider/AISEARCH/Perplexity.py +332 -332
- webscout/Provider/AISEARCH/README.md +279 -279
- webscout/Provider/AISEARCH/__init__.py +16 -1
- webscout/Provider/AISEARCH/felo_search.py +206 -206
- webscout/Provider/AISEARCH/genspark_search.py +323 -323
- webscout/Provider/AISEARCH/hika_search.py +185 -185
- webscout/Provider/AISEARCH/iask_search.py +410 -410
- webscout/Provider/AISEARCH/monica_search.py +219 -219
- webscout/Provider/AISEARCH/scira_search.py +316 -316
- webscout/Provider/AISEARCH/stellar_search.py +177 -177
- webscout/Provider/AISEARCH/webpilotai_search.py +255 -255
- webscout/Provider/Aitopia.py +314 -314
- webscout/Provider/Andi.py +1 -1
- webscout/Provider/Apriel.py +306 -0
- webscout/Provider/ChatGPTClone.py +237 -236
- webscout/Provider/ChatSandbox.py +343 -343
- webscout/Provider/Cloudflare.py +324 -324
- webscout/Provider/Cohere.py +208 -208
- webscout/Provider/Deepinfra.py +370 -366
- webscout/Provider/ExaAI.py +260 -260
- webscout/Provider/ExaChat.py +308 -308
- webscout/Provider/Flowith.py +221 -221
- webscout/Provider/GMI.py +293 -0
- webscout/Provider/Gemini.py +164 -164
- webscout/Provider/GeminiProxy.py +167 -167
- webscout/Provider/GithubChat.py +371 -372
- webscout/Provider/Groq.py +800 -800
- webscout/Provider/HeckAI.py +383 -383
- webscout/Provider/Jadve.py +282 -282
- webscout/Provider/K2Think.py +307 -307
- webscout/Provider/Koboldai.py +205 -205
- webscout/Provider/LambdaChat.py +423 -423
- webscout/Provider/Nemotron.py +244 -244
- webscout/Provider/Netwrck.py +248 -248
- webscout/Provider/OLLAMA.py +395 -395
- webscout/Provider/OPENAI/Cloudflare.py +393 -393
- webscout/Provider/OPENAI/FalconH1.py +451 -451
- webscout/Provider/OPENAI/FreeGemini.py +296 -296
- webscout/Provider/OPENAI/K2Think.py +431 -431
- webscout/Provider/OPENAI/NEMOTRON.py +240 -240
- webscout/Provider/OPENAI/PI.py +427 -427
- webscout/Provider/OPENAI/README.md +959 -959
- webscout/Provider/OPENAI/TogetherAI.py +345 -345
- webscout/Provider/OPENAI/TwoAI.py +465 -465
- webscout/Provider/OPENAI/__init__.py +33 -18
- webscout/Provider/OPENAI/base.py +248 -248
- webscout/Provider/OPENAI/chatglm.py +528 -0
- webscout/Provider/OPENAI/chatgpt.py +592 -592
- webscout/Provider/OPENAI/chatgptclone.py +521 -521
- webscout/Provider/OPENAI/chatsandbox.py +202 -202
- webscout/Provider/OPENAI/deepinfra.py +318 -314
- webscout/Provider/OPENAI/e2b.py +1665 -1665
- webscout/Provider/OPENAI/exaai.py +420 -420
- webscout/Provider/OPENAI/exachat.py +452 -452
- webscout/Provider/OPENAI/friendli.py +232 -232
- webscout/Provider/OPENAI/{refact.py → gmi.py} +324 -274
- webscout/Provider/OPENAI/groq.py +364 -364
- webscout/Provider/OPENAI/heckai.py +314 -314
- webscout/Provider/OPENAI/llmchatco.py +337 -337
- webscout/Provider/OPENAI/netwrck.py +355 -355
- webscout/Provider/OPENAI/oivscode.py +290 -290
- webscout/Provider/OPENAI/opkfc.py +518 -518
- webscout/Provider/OPENAI/pydantic_imports.py +1 -1
- webscout/Provider/OPENAI/scirachat.py +535 -535
- webscout/Provider/OPENAI/sonus.py +308 -308
- webscout/Provider/OPENAI/standardinput.py +442 -442
- webscout/Provider/OPENAI/textpollinations.py +340 -340
- webscout/Provider/OPENAI/toolbaz.py +419 -416
- webscout/Provider/OPENAI/typefully.py +362 -362
- webscout/Provider/OPENAI/utils.py +295 -295
- webscout/Provider/OPENAI/venice.py +436 -436
- webscout/Provider/OPENAI/wisecat.py +387 -387
- webscout/Provider/OPENAI/writecream.py +166 -166
- webscout/Provider/OPENAI/x0gpt.py +378 -378
- webscout/Provider/OPENAI/yep.py +389 -389
- webscout/Provider/OpenGPT.py +230 -230
- webscout/Provider/Openai.py +243 -243
- webscout/Provider/PI.py +405 -405
- webscout/Provider/Perplexitylabs.py +430 -430
- webscout/Provider/QwenLM.py +272 -272
- webscout/Provider/STT/__init__.py +16 -1
- webscout/Provider/Sambanova.py +257 -257
- webscout/Provider/StandardInput.py +309 -309
- webscout/Provider/TTI/README.md +82 -82
- webscout/Provider/TTI/__init__.py +33 -18
- webscout/Provider/TTI/aiarta.py +413 -413
- webscout/Provider/TTI/base.py +136 -136
- webscout/Provider/TTI/bing.py +243 -243
- webscout/Provider/TTI/gpt1image.py +149 -149
- webscout/Provider/TTI/imagen.py +196 -196
- webscout/Provider/TTI/infip.py +211 -211
- webscout/Provider/TTI/magicstudio.py +232 -232
- webscout/Provider/TTI/monochat.py +219 -219
- webscout/Provider/TTI/piclumen.py +214 -214
- webscout/Provider/TTI/pixelmuse.py +232 -232
- webscout/Provider/TTI/pollinations.py +232 -232
- webscout/Provider/TTI/together.py +288 -288
- webscout/Provider/TTI/utils.py +12 -12
- webscout/Provider/TTI/venice.py +367 -367
- webscout/Provider/TTS/README.md +192 -192
- webscout/Provider/TTS/__init__.py +33 -18
- webscout/Provider/TTS/parler.py +110 -110
- webscout/Provider/TTS/streamElements.py +333 -333
- webscout/Provider/TTS/utils.py +280 -280
- webscout/Provider/TeachAnything.py +237 -237
- webscout/Provider/TextPollinationsAI.py +310 -310
- webscout/Provider/TogetherAI.py +356 -356
- webscout/Provider/TwoAI.py +312 -312
- webscout/Provider/TypliAI.py +311 -311
- webscout/Provider/UNFINISHED/ChatHub.py +208 -208
- webscout/Provider/UNFINISHED/ChutesAI.py +313 -313
- webscout/Provider/UNFINISHED/GizAI.py +294 -294
- webscout/Provider/UNFINISHED/Marcus.py +198 -198
- webscout/Provider/UNFINISHED/Qodo.py +477 -477
- webscout/Provider/UNFINISHED/VercelAIGateway.py +338 -338
- webscout/Provider/UNFINISHED/XenAI.py +324 -324
- webscout/Provider/UNFINISHED/Youchat.py +330 -330
- webscout/Provider/UNFINISHED/liner.py +334 -0
- webscout/Provider/UNFINISHED/liner_api_request.py +262 -262
- webscout/Provider/UNFINISHED/puterjs.py +634 -634
- webscout/Provider/UNFINISHED/samurai.py +223 -223
- webscout/Provider/UNFINISHED/test_lmarena.py +119 -119
- webscout/Provider/Venice.py +250 -250
- webscout/Provider/VercelAI.py +256 -256
- webscout/Provider/WiseCat.py +231 -231
- webscout/Provider/WrDoChat.py +366 -366
- webscout/Provider/__init__.py +33 -18
- webscout/Provider/ai4chat.py +174 -174
- webscout/Provider/akashgpt.py +331 -331
- webscout/Provider/cerebras.py +446 -446
- webscout/Provider/chatglm.py +394 -301
- webscout/Provider/cleeai.py +211 -211
- webscout/Provider/elmo.py +282 -282
- webscout/Provider/geminiapi.py +208 -208
- webscout/Provider/granite.py +261 -261
- webscout/Provider/hermes.py +263 -263
- webscout/Provider/julius.py +223 -223
- webscout/Provider/learnfastai.py +309 -309
- webscout/Provider/llama3mitril.py +214 -214
- webscout/Provider/llmchat.py +243 -243
- webscout/Provider/llmchatco.py +290 -290
- webscout/Provider/meta.py +801 -801
- webscout/Provider/oivscode.py +309 -309
- webscout/Provider/scira_chat.py +383 -383
- webscout/Provider/searchchat.py +292 -292
- webscout/Provider/sonus.py +258 -258
- webscout/Provider/toolbaz.py +370 -367
- webscout/Provider/turboseek.py +273 -273
- webscout/Provider/typefully.py +207 -207
- webscout/Provider/yep.py +372 -372
- webscout/__init__.py +27 -31
- webscout/__main__.py +5 -5
- webscout/auth/api_key_manager.py +189 -189
- webscout/auth/config.py +175 -175
- webscout/auth/models.py +185 -185
- webscout/auth/routes.py +663 -664
- webscout/auth/simple_logger.py +236 -236
- webscout/cli.py +523 -523
- webscout/conversation.py +438 -438
- webscout/exceptions.py +361 -361
- webscout/litagent/Readme.md +298 -298
- webscout/litagent/__init__.py +28 -28
- webscout/litagent/agent.py +581 -581
- webscout/litagent/constants.py +59 -59
- webscout/litprinter/__init__.py +58 -58
- webscout/models.py +181 -181
- webscout/optimizers.py +419 -419
- webscout/prompt_manager.py +288 -288
- webscout/sanitize.py +1078 -1078
- webscout/scout/README.md +401 -401
- webscout/scout/__init__.py +8 -8
- webscout/scout/core/__init__.py +6 -6
- webscout/scout/core/crawler.py +297 -297
- webscout/scout/core/scout.py +706 -706
- webscout/scout/core/search_result.py +95 -95
- webscout/scout/core/text_analyzer.py +62 -62
- webscout/scout/core/text_utils.py +277 -277
- webscout/scout/core/web_analyzer.py +51 -51
- webscout/scout/element.py +599 -599
- webscout/scout/parsers/__init__.py +69 -69
- webscout/scout/parsers/html5lib_parser.py +172 -172
- webscout/scout/parsers/html_parser.py +236 -236
- webscout/scout/parsers/lxml_parser.py +178 -178
- webscout/scout/utils.py +37 -37
- webscout/search/__init__.py +51 -0
- webscout/search/base.py +195 -0
- webscout/search/duckduckgo_main.py +54 -0
- webscout/search/engines/__init__.py +48 -0
- webscout/search/engines/bing.py +84 -0
- webscout/search/engines/bing_news.py +52 -0
- webscout/search/engines/brave.py +43 -0
- webscout/search/engines/duckduckgo/__init__.py +25 -0
- webscout/search/engines/duckduckgo/answers.py +78 -0
- webscout/search/engines/duckduckgo/base.py +187 -0
- webscout/search/engines/duckduckgo/images.py +97 -0
- webscout/search/engines/duckduckgo/maps.py +168 -0
- webscout/search/engines/duckduckgo/news.py +68 -0
- webscout/search/engines/duckduckgo/suggestions.py +21 -0
- webscout/search/engines/duckduckgo/text.py +211 -0
- webscout/search/engines/duckduckgo/translate.py +47 -0
- webscout/search/engines/duckduckgo/videos.py +63 -0
- webscout/search/engines/duckduckgo/weather.py +74 -0
- webscout/search/engines/mojeek.py +37 -0
- webscout/search/engines/wikipedia.py +56 -0
- webscout/search/engines/yahoo.py +65 -0
- webscout/search/engines/yahoo_news.py +64 -0
- webscout/search/engines/yandex.py +43 -0
- webscout/search/engines/yep/__init__.py +13 -0
- webscout/search/engines/yep/base.py +32 -0
- webscout/search/engines/yep/images.py +99 -0
- webscout/search/engines/yep/suggestions.py +35 -0
- webscout/search/engines/yep/text.py +114 -0
- webscout/search/http_client.py +156 -0
- webscout/search/results.py +137 -0
- webscout/search/yep_main.py +44 -0
- webscout/swiftcli/Readme.md +323 -323
- webscout/swiftcli/__init__.py +95 -95
- webscout/swiftcli/core/__init__.py +7 -7
- webscout/swiftcli/core/cli.py +308 -308
- webscout/swiftcli/core/context.py +104 -104
- webscout/swiftcli/core/group.py +241 -241
- webscout/swiftcli/decorators/__init__.py +28 -28
- webscout/swiftcli/decorators/command.py +221 -221
- webscout/swiftcli/decorators/options.py +220 -220
- webscout/swiftcli/decorators/output.py +302 -302
- webscout/swiftcli/exceptions.py +21 -21
- webscout/swiftcli/plugins/__init__.py +9 -9
- webscout/swiftcli/plugins/base.py +135 -135
- webscout/swiftcli/plugins/manager.py +269 -269
- webscout/swiftcli/utils/__init__.py +59 -59
- webscout/swiftcli/utils/formatting.py +252 -252
- webscout/swiftcli/utils/parsing.py +267 -267
- webscout/update_checker.py +117 -117
- webscout/version.py +1 -1
- webscout/version.py.bak +2 -0
- webscout/zeroart/README.md +89 -89
- webscout/zeroart/__init__.py +134 -134
- webscout/zeroart/base.py +66 -66
- webscout/zeroart/effects.py +100 -100
- webscout/zeroart/fonts.py +1238 -1238
- {webscout-8.3.7.dist-info → webscout-2025.10.13.dist-info}/METADATA +936 -937
- webscout-2025.10.13.dist-info/RECORD +329 -0
- webscout/Provider/AISEARCH/DeepFind.py +0 -254
- webscout/Provider/OPENAI/Qwen3.py +0 -303
- webscout/Provider/OPENAI/qodo.py +0 -630
- webscout/Provider/OPENAI/xenai.py +0 -514
- webscout/tempid.py +0 -134
- webscout/webscout_search.py +0 -1183
- webscout/webscout_search_async.py +0 -649
- webscout/yep_search.py +0 -346
- webscout-8.3.7.dist-info/RECORD +0 -301
- {webscout-8.3.7.dist-info → webscout-2025.10.13.dist-info}/WHEEL +0 -0
- {webscout-8.3.7.dist-info → webscout-2025.10.13.dist-info}/entry_points.txt +0 -0
- {webscout-8.3.7.dist-info → webscout-2025.10.13.dist-info}/licenses/LICENSE.md +0 -0
- {webscout-8.3.7.dist-info → webscout-2025.10.13.dist-info}/top_level.txt +0 -0
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
"""
|
|
2
|
-
TempMail Package - Temporary Email Generation Functionality
|
|
3
|
-
Part of Webscout Extra tools
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from .base import (
|
|
7
|
-
TempMailProvider,
|
|
8
|
-
AsyncTempMailProvider,
|
|
9
|
-
get_random_email,
|
|
10
|
-
get_disposable_email,
|
|
11
|
-
get_provider
|
|
12
|
-
)
|
|
13
|
-
from .mail_tm import MailTM, MailTMAsync
|
|
14
|
-
from .temp_mail_io import TempMailIO, TempMailIOAsync
|
|
15
|
-
from .emailnator import EmailnatorProvider
|
|
16
|
-
|
|
17
|
-
__all__ = [
|
|
18
|
-
'TempMailProvider',
|
|
19
|
-
'AsyncTempMailProvider',
|
|
20
|
-
'MailTM',
|
|
21
|
-
'MailTMAsync',
|
|
22
|
-
'TempMailIO',
|
|
23
|
-
'TempMailIOAsync',
|
|
24
|
-
'EmailnatorProvider',
|
|
25
|
-
'get_random_email',
|
|
26
|
-
'get_disposable_email',
|
|
27
|
-
'get_provider'
|
|
1
|
+
"""
|
|
2
|
+
TempMail Package - Temporary Email Generation Functionality
|
|
3
|
+
Part of Webscout Extra tools
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from .base import (
|
|
7
|
+
TempMailProvider,
|
|
8
|
+
AsyncTempMailProvider,
|
|
9
|
+
get_random_email,
|
|
10
|
+
get_disposable_email,
|
|
11
|
+
get_provider
|
|
12
|
+
)
|
|
13
|
+
from .mail_tm import MailTM, MailTMAsync
|
|
14
|
+
from .temp_mail_io import TempMailIO, TempMailIOAsync
|
|
15
|
+
from .emailnator import EmailnatorProvider
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
'TempMailProvider',
|
|
19
|
+
'AsyncTempMailProvider',
|
|
20
|
+
'MailTM',
|
|
21
|
+
'MailTMAsync',
|
|
22
|
+
'TempMailIO',
|
|
23
|
+
'TempMailIOAsync',
|
|
24
|
+
'EmailnatorProvider',
|
|
25
|
+
'get_random_email',
|
|
26
|
+
'get_disposable_email',
|
|
27
|
+
'get_provider'
|
|
28
28
|
]
|
|
@@ -1,141 +1,141 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Async utilities for temporary email generation
|
|
3
|
-
"""
|
|
4
|
-
import asyncio
|
|
5
|
-
import logging
|
|
6
|
-
from typing import Dict, List, Optional, Tuple
|
|
7
|
-
|
|
8
|
-
from .base import TempMailAPI, MessageResponseModel
|
|
9
|
-
|
|
10
|
-
logger = logging.getLogger(__name__)
|
|
11
|
-
|
|
12
|
-
class AsyncTempMailHelper:
|
|
13
|
-
"""
|
|
14
|
-
Async helper class for TempMail.io API
|
|
15
|
-
Provides simplified methods for async usage of TempMail.io
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
def __init__(self):
|
|
19
|
-
self.api = None
|
|
20
|
-
self.email = None
|
|
21
|
-
self.token = None
|
|
22
|
-
|
|
23
|
-
async def create(self, alias: Optional[str] = None, domain: Optional[str] = None) -> Tuple[str, str]:
|
|
24
|
-
"""
|
|
25
|
-
Create a new temporary email
|
|
26
|
-
|
|
27
|
-
Args:
|
|
28
|
-
alias: Optional alias for the email
|
|
29
|
-
domain: Optional domain for the email
|
|
30
|
-
|
|
31
|
-
Returns:
|
|
32
|
-
Tuple containing the email address and token
|
|
33
|
-
"""
|
|
34
|
-
self.api = TempMailAPI()
|
|
35
|
-
await self.api.initialize()
|
|
36
|
-
|
|
37
|
-
try:
|
|
38
|
-
result = await self.api.create_email(alias, domain)
|
|
39
|
-
self.email = result.email
|
|
40
|
-
self.token = result.token
|
|
41
|
-
return self.email, self.token
|
|
42
|
-
except Exception as e:
|
|
43
|
-
logger.error(f"Error creating email: {e}")
|
|
44
|
-
await self.close()
|
|
45
|
-
raise
|
|
46
|
-
|
|
47
|
-
async def get_messages(self) -> List[Dict]:
|
|
48
|
-
"""
|
|
49
|
-
Get messages for the current email
|
|
50
|
-
|
|
51
|
-
Returns:
|
|
52
|
-
List of message dictionaries
|
|
53
|
-
"""
|
|
54
|
-
if not self.api or not self.email:
|
|
55
|
-
raise ValueError("No email created yet")
|
|
56
|
-
|
|
57
|
-
try:
|
|
58
|
-
messages = await self.api.get_messages(self.email)
|
|
59
|
-
if not messages:
|
|
60
|
-
return []
|
|
61
|
-
|
|
62
|
-
return [
|
|
63
|
-
{
|
|
64
|
-
"id": msg.id,
|
|
65
|
-
"from": msg.email_from,
|
|
66
|
-
"to": msg.email_to,
|
|
67
|
-
"subject": msg.subject,
|
|
68
|
-
"created_at": msg.created_at,
|
|
69
|
-
"body": msg.body_text or msg.body_html,
|
|
70
|
-
"has_attachments": bool(msg.attachments and len(msg.attachments) > 0)
|
|
71
|
-
}
|
|
72
|
-
for msg in messages
|
|
73
|
-
]
|
|
74
|
-
except Exception as e:
|
|
75
|
-
logger.error(f"Error getting messages: {e}")
|
|
76
|
-
return []
|
|
77
|
-
|
|
78
|
-
async def delete(self) -> bool:
|
|
79
|
-
"""
|
|
80
|
-
Delete the current temporary email
|
|
81
|
-
|
|
82
|
-
Returns:
|
|
83
|
-
True if deletion was successful, False otherwise
|
|
84
|
-
"""
|
|
85
|
-
if not self.api or not self.email or not self.token:
|
|
86
|
-
logger.warning("No email to delete")
|
|
87
|
-
return False
|
|
88
|
-
|
|
89
|
-
try:
|
|
90
|
-
result = await self.api.delete_email(self.email, self.token)
|
|
91
|
-
return result
|
|
92
|
-
except Exception as e:
|
|
93
|
-
logger.error(f"Error deleting email: {e}")
|
|
94
|
-
return False
|
|
95
|
-
finally:
|
|
96
|
-
await self.close()
|
|
97
|
-
|
|
98
|
-
async def close(self) -> None:
|
|
99
|
-
"""Close the API connection"""
|
|
100
|
-
if self.api:
|
|
101
|
-
await self.api.close()
|
|
102
|
-
self.api = None
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
async def get_temp_email(alias: Optional[str] = None, domain: Optional[str] = None) -> Tuple[str, AsyncTempMailHelper]:
|
|
106
|
-
"""
|
|
107
|
-
Get a temporary email address asynchronously
|
|
108
|
-
|
|
109
|
-
Args:
|
|
110
|
-
alias: Optional alias for the email
|
|
111
|
-
domain: Optional domain for the email
|
|
112
|
-
|
|
113
|
-
Returns:
|
|
114
|
-
Tuple containing the email address and the TempMail helper instance
|
|
115
|
-
"""
|
|
116
|
-
helper = AsyncTempMailHelper()
|
|
117
|
-
email, _ = await helper.create(alias, domain)
|
|
118
|
-
return email, helper
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
async def wait_for_message(helper: AsyncTempMailHelper, timeout: int = 60, check_interval: int = 5) -> Optional[Dict]:
|
|
122
|
-
"""
|
|
123
|
-
Wait for a message to arrive in the inbox
|
|
124
|
-
|
|
125
|
-
Args:
|
|
126
|
-
helper: The TempMail helper instance
|
|
127
|
-
timeout: Maximum time to wait in seconds
|
|
128
|
-
check_interval: Time between checks in seconds
|
|
129
|
-
|
|
130
|
-
Returns:
|
|
131
|
-
The first message if one arrives, None otherwise
|
|
132
|
-
"""
|
|
133
|
-
start_time = asyncio.get_event_loop().time()
|
|
134
|
-
|
|
135
|
-
while asyncio.get_event_loop().time() - start_time < timeout:
|
|
136
|
-
messages = await helper.get_messages()
|
|
137
|
-
if messages:
|
|
138
|
-
return messages[0]
|
|
139
|
-
await asyncio.sleep(check_interval)
|
|
140
|
-
|
|
1
|
+
"""
|
|
2
|
+
Async utilities for temporary email generation
|
|
3
|
+
"""
|
|
4
|
+
import asyncio
|
|
5
|
+
import logging
|
|
6
|
+
from typing import Dict, List, Optional, Tuple
|
|
7
|
+
|
|
8
|
+
from .base import TempMailAPI, MessageResponseModel
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
class AsyncTempMailHelper:
|
|
13
|
+
"""
|
|
14
|
+
Async helper class for TempMail.io API
|
|
15
|
+
Provides simplified methods for async usage of TempMail.io
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def __init__(self):
|
|
19
|
+
self.api = None
|
|
20
|
+
self.email = None
|
|
21
|
+
self.token = None
|
|
22
|
+
|
|
23
|
+
async def create(self, alias: Optional[str] = None, domain: Optional[str] = None) -> Tuple[str, str]:
|
|
24
|
+
"""
|
|
25
|
+
Create a new temporary email
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
alias: Optional alias for the email
|
|
29
|
+
domain: Optional domain for the email
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
Tuple containing the email address and token
|
|
33
|
+
"""
|
|
34
|
+
self.api = TempMailAPI()
|
|
35
|
+
await self.api.initialize()
|
|
36
|
+
|
|
37
|
+
try:
|
|
38
|
+
result = await self.api.create_email(alias, domain)
|
|
39
|
+
self.email = result.email
|
|
40
|
+
self.token = result.token
|
|
41
|
+
return self.email, self.token
|
|
42
|
+
except Exception as e:
|
|
43
|
+
logger.error(f"Error creating email: {e}")
|
|
44
|
+
await self.close()
|
|
45
|
+
raise
|
|
46
|
+
|
|
47
|
+
async def get_messages(self) -> List[Dict]:
|
|
48
|
+
"""
|
|
49
|
+
Get messages for the current email
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
List of message dictionaries
|
|
53
|
+
"""
|
|
54
|
+
if not self.api or not self.email:
|
|
55
|
+
raise ValueError("No email created yet")
|
|
56
|
+
|
|
57
|
+
try:
|
|
58
|
+
messages = await self.api.get_messages(self.email)
|
|
59
|
+
if not messages:
|
|
60
|
+
return []
|
|
61
|
+
|
|
62
|
+
return [
|
|
63
|
+
{
|
|
64
|
+
"id": msg.id,
|
|
65
|
+
"from": msg.email_from,
|
|
66
|
+
"to": msg.email_to,
|
|
67
|
+
"subject": msg.subject,
|
|
68
|
+
"created_at": msg.created_at,
|
|
69
|
+
"body": msg.body_text or msg.body_html,
|
|
70
|
+
"has_attachments": bool(msg.attachments and len(msg.attachments) > 0)
|
|
71
|
+
}
|
|
72
|
+
for msg in messages
|
|
73
|
+
]
|
|
74
|
+
except Exception as e:
|
|
75
|
+
logger.error(f"Error getting messages: {e}")
|
|
76
|
+
return []
|
|
77
|
+
|
|
78
|
+
async def delete(self) -> bool:
|
|
79
|
+
"""
|
|
80
|
+
Delete the current temporary email
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
True if deletion was successful, False otherwise
|
|
84
|
+
"""
|
|
85
|
+
if not self.api or not self.email or not self.token:
|
|
86
|
+
logger.warning("No email to delete")
|
|
87
|
+
return False
|
|
88
|
+
|
|
89
|
+
try:
|
|
90
|
+
result = await self.api.delete_email(self.email, self.token)
|
|
91
|
+
return result
|
|
92
|
+
except Exception as e:
|
|
93
|
+
logger.error(f"Error deleting email: {e}")
|
|
94
|
+
return False
|
|
95
|
+
finally:
|
|
96
|
+
await self.close()
|
|
97
|
+
|
|
98
|
+
async def close(self) -> None:
|
|
99
|
+
"""Close the API connection"""
|
|
100
|
+
if self.api:
|
|
101
|
+
await self.api.close()
|
|
102
|
+
self.api = None
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
async def get_temp_email(alias: Optional[str] = None, domain: Optional[str] = None) -> Tuple[str, AsyncTempMailHelper]:
|
|
106
|
+
"""
|
|
107
|
+
Get a temporary email address asynchronously
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
alias: Optional alias for the email
|
|
111
|
+
domain: Optional domain for the email
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
Tuple containing the email address and the TempMail helper instance
|
|
115
|
+
"""
|
|
116
|
+
helper = AsyncTempMailHelper()
|
|
117
|
+
email, _ = await helper.create(alias, domain)
|
|
118
|
+
return email, helper
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
async def wait_for_message(helper: AsyncTempMailHelper, timeout: int = 60, check_interval: int = 5) -> Optional[Dict]:
|
|
122
|
+
"""
|
|
123
|
+
Wait for a message to arrive in the inbox
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
helper: The TempMail helper instance
|
|
127
|
+
timeout: Maximum time to wait in seconds
|
|
128
|
+
check_interval: Time between checks in seconds
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
The first message if one arrives, None otherwise
|
|
132
|
+
"""
|
|
133
|
+
start_time = asyncio.get_event_loop().time()
|
|
134
|
+
|
|
135
|
+
while asyncio.get_event_loop().time() - start_time < timeout:
|
|
136
|
+
messages = await helper.get_messages()
|
|
137
|
+
if messages:
|
|
138
|
+
return messages[0]
|
|
139
|
+
await asyncio.sleep(check_interval)
|
|
140
|
+
|
|
141
141
|
return None
|
webscout/Extra/tempmail/base.py
CHANGED
|
@@ -1,161 +1,161 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Temporary Email Generation Base Module
|
|
3
|
-
Abstract base classes for tempmail providers
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from abc import ABC, abstractmethod
|
|
7
|
-
import string
|
|
8
|
-
import random
|
|
9
|
-
from typing import Dict, List, Any, Optional, Union, Tuple, AsyncGenerator, Generator
|
|
10
|
-
|
|
11
|
-
# Constants for email generation
|
|
12
|
-
EMAIL_LENGTH = 16
|
|
13
|
-
PASSWORD_LENGTH = 10
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class TempMailProvider(ABC):
|
|
17
|
-
"""
|
|
18
|
-
Abstract base class for synchronous temporary email providers
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
@abstractmethod
|
|
22
|
-
def create_account(self) -> bool:
|
|
23
|
-
"""Create a new temporary email account"""
|
|
24
|
-
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
25
|
-
|
|
26
|
-
@abstractmethod
|
|
27
|
-
def get_messages(self) -> List[Dict]:
|
|
28
|
-
"""Get all messages in the inbox"""
|
|
29
|
-
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
30
|
-
|
|
31
|
-
@abstractmethod
|
|
32
|
-
def check_new_messages(self) -> List[Dict]:
|
|
33
|
-
"""Check for new messages and return only the new ones"""
|
|
34
|
-
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
35
|
-
|
|
36
|
-
@abstractmethod
|
|
37
|
-
def delete_account(self) -> bool:
|
|
38
|
-
"""Delete the current temporary email account"""
|
|
39
|
-
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
40
|
-
|
|
41
|
-
@abstractmethod
|
|
42
|
-
def get_account_info(self) -> Dict:
|
|
43
|
-
"""Get current account information"""
|
|
44
|
-
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
class AsyncTempMailProvider(ABC):
|
|
48
|
-
"""
|
|
49
|
-
Abstract base class for asynchronous temporary email providers
|
|
50
|
-
"""
|
|
51
|
-
|
|
52
|
-
@abstractmethod
|
|
53
|
-
async def initialize(self):
|
|
54
|
-
"""Initialize the provider session"""
|
|
55
|
-
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
56
|
-
|
|
57
|
-
@abstractmethod
|
|
58
|
-
async def close(self) -> None:
|
|
59
|
-
"""Close the provider session"""
|
|
60
|
-
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
61
|
-
|
|
62
|
-
@abstractmethod
|
|
63
|
-
async def create_email(self, alias: Optional[str] = None, domain: Optional[str] = None) -> Tuple[str, str]:
|
|
64
|
-
"""Create a new temporary email address"""
|
|
65
|
-
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
66
|
-
|
|
67
|
-
@abstractmethod
|
|
68
|
-
async def get_messages(self) -> List[Dict]:
|
|
69
|
-
"""Get messages for a temporary email"""
|
|
70
|
-
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
71
|
-
|
|
72
|
-
@abstractmethod
|
|
73
|
-
async def delete_email(self) -> bool:
|
|
74
|
-
"""Delete a temporary email"""
|
|
75
|
-
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
# Utility functions
|
|
79
|
-
def generate_random_string(length: int, include_digits: bool = True) -> str:
|
|
80
|
-
"""
|
|
81
|
-
Generate a random string of specified length
|
|
82
|
-
|
|
83
|
-
Args:
|
|
84
|
-
length: Length of the string to generate
|
|
85
|
-
include_digits: Whether to include digits in the string
|
|
86
|
-
|
|
87
|
-
Returns:
|
|
88
|
-
Random string of specified length
|
|
89
|
-
"""
|
|
90
|
-
chars = string.ascii_lowercase
|
|
91
|
-
if include_digits:
|
|
92
|
-
chars += string.digits
|
|
93
|
-
return ''.join(random.sample(chars, length))
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
# Factory function for getting a temporary email provider
|
|
97
|
-
def get_provider(provider_name: str = "mailtm", async_provider: bool = False) -> Union[TempMailProvider, AsyncTempMailProvider]:
|
|
98
|
-
"""
|
|
99
|
-
Get a temporary email provider instance
|
|
100
|
-
|
|
101
|
-
Args:
|
|
102
|
-
provider_name: Name of the provider to use ("mailtm", "tempmailio", or "emailnator")
|
|
103
|
-
async_provider: Whether to return an async provider
|
|
104
|
-
|
|
105
|
-
Returns:
|
|
106
|
-
A temporary email provider instance
|
|
107
|
-
"""
|
|
108
|
-
if async_provider:
|
|
109
|
-
if provider_name.lower() == "tempmailio":
|
|
110
|
-
from .temp_mail_io import TempMailIOAsync
|
|
111
|
-
return TempMailIOAsync()
|
|
112
|
-
elif provider_name.lower() == "emailnator":
|
|
113
|
-
raise NotImplementedError("Emailnator async provider not implemented.")
|
|
114
|
-
else:
|
|
115
|
-
from .mail_tm import MailTMAsync
|
|
116
|
-
return MailTMAsync()
|
|
117
|
-
else:
|
|
118
|
-
if provider_name.lower() == "tempmailio":
|
|
119
|
-
from .temp_mail_io import TempMailIO
|
|
120
|
-
return TempMailIO()
|
|
121
|
-
elif provider_name.lower() == "emailnator":
|
|
122
|
-
from .emailnator import EmailnatorProvider
|
|
123
|
-
return EmailnatorProvider()
|
|
124
|
-
else:
|
|
125
|
-
from .mail_tm import MailTM
|
|
126
|
-
return MailTM()
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
# Simplified helpers for common operations
|
|
130
|
-
def get_random_email(provider_name: str = "mailtm") -> Tuple[str, TempMailProvider]:
|
|
131
|
-
"""
|
|
132
|
-
Get a random temporary email address
|
|
133
|
-
|
|
134
|
-
Args:
|
|
135
|
-
provider_name: Name of the provider to use
|
|
136
|
-
|
|
137
|
-
Returns:
|
|
138
|
-
Tuple containing the email address and the provider instance
|
|
139
|
-
"""
|
|
140
|
-
provider = get_provider(provider_name)
|
|
141
|
-
|
|
142
|
-
# For providers that require explicit initialization
|
|
143
|
-
if hasattr(provider, '_initialized') and not provider._initialized:
|
|
144
|
-
try:
|
|
145
|
-
# If there's an initialization method that needs to be called
|
|
146
|
-
if hasattr(provider, 'initialize'):
|
|
147
|
-
provider.initialize()
|
|
148
|
-
except Exception as e:
|
|
149
|
-
raise RuntimeError(f"Failed to initialize provider: {e}")
|
|
150
|
-
|
|
151
|
-
# Create the account (auto-generates a random email)
|
|
152
|
-
success = provider.create_account()
|
|
153
|
-
if not success:
|
|
154
|
-
raise RuntimeError(f"Failed to create account with provider {provider_name}")
|
|
155
|
-
|
|
156
|
-
return provider.email, provider
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
def get_disposable_email() -> Tuple[str, TempMailProvider]:
|
|
160
|
-
"""Alias for get_random_email"""
|
|
1
|
+
"""
|
|
2
|
+
Temporary Email Generation Base Module
|
|
3
|
+
Abstract base classes for tempmail providers
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from abc import ABC, abstractmethod
|
|
7
|
+
import string
|
|
8
|
+
import random
|
|
9
|
+
from typing import Dict, List, Any, Optional, Union, Tuple, AsyncGenerator, Generator
|
|
10
|
+
|
|
11
|
+
# Constants for email generation
|
|
12
|
+
EMAIL_LENGTH = 16
|
|
13
|
+
PASSWORD_LENGTH = 10
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TempMailProvider(ABC):
|
|
17
|
+
"""
|
|
18
|
+
Abstract base class for synchronous temporary email providers
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
@abstractmethod
|
|
22
|
+
def create_account(self) -> bool:
|
|
23
|
+
"""Create a new temporary email account"""
|
|
24
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
25
|
+
|
|
26
|
+
@abstractmethod
|
|
27
|
+
def get_messages(self) -> List[Dict]:
|
|
28
|
+
"""Get all messages in the inbox"""
|
|
29
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
30
|
+
|
|
31
|
+
@abstractmethod
|
|
32
|
+
def check_new_messages(self) -> List[Dict]:
|
|
33
|
+
"""Check for new messages and return only the new ones"""
|
|
34
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
35
|
+
|
|
36
|
+
@abstractmethod
|
|
37
|
+
def delete_account(self) -> bool:
|
|
38
|
+
"""Delete the current temporary email account"""
|
|
39
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
40
|
+
|
|
41
|
+
@abstractmethod
|
|
42
|
+
def get_account_info(self) -> Dict:
|
|
43
|
+
"""Get current account information"""
|
|
44
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class AsyncTempMailProvider(ABC):
|
|
48
|
+
"""
|
|
49
|
+
Abstract base class for asynchronous temporary email providers
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
@abstractmethod
|
|
53
|
+
async def initialize(self):
|
|
54
|
+
"""Initialize the provider session"""
|
|
55
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
56
|
+
|
|
57
|
+
@abstractmethod
|
|
58
|
+
async def close(self) -> None:
|
|
59
|
+
"""Close the provider session"""
|
|
60
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
61
|
+
|
|
62
|
+
@abstractmethod
|
|
63
|
+
async def create_email(self, alias: Optional[str] = None, domain: Optional[str] = None) -> Tuple[str, str]:
|
|
64
|
+
"""Create a new temporary email address"""
|
|
65
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
66
|
+
|
|
67
|
+
@abstractmethod
|
|
68
|
+
async def get_messages(self) -> List[Dict]:
|
|
69
|
+
"""Get messages for a temporary email"""
|
|
70
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
71
|
+
|
|
72
|
+
@abstractmethod
|
|
73
|
+
async def delete_email(self) -> bool:
|
|
74
|
+
"""Delete a temporary email"""
|
|
75
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
# Utility functions
|
|
79
|
+
def generate_random_string(length: int, include_digits: bool = True) -> str:
|
|
80
|
+
"""
|
|
81
|
+
Generate a random string of specified length
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
length: Length of the string to generate
|
|
85
|
+
include_digits: Whether to include digits in the string
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
Random string of specified length
|
|
89
|
+
"""
|
|
90
|
+
chars = string.ascii_lowercase
|
|
91
|
+
if include_digits:
|
|
92
|
+
chars += string.digits
|
|
93
|
+
return ''.join(random.sample(chars, length))
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
# Factory function for getting a temporary email provider
|
|
97
|
+
def get_provider(provider_name: str = "mailtm", async_provider: bool = False) -> Union[TempMailProvider, AsyncTempMailProvider]:
|
|
98
|
+
"""
|
|
99
|
+
Get a temporary email provider instance
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
provider_name: Name of the provider to use ("mailtm", "tempmailio", or "emailnator")
|
|
103
|
+
async_provider: Whether to return an async provider
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
A temporary email provider instance
|
|
107
|
+
"""
|
|
108
|
+
if async_provider:
|
|
109
|
+
if provider_name.lower() == "tempmailio":
|
|
110
|
+
from .temp_mail_io import TempMailIOAsync
|
|
111
|
+
return TempMailIOAsync()
|
|
112
|
+
elif provider_name.lower() == "emailnator":
|
|
113
|
+
raise NotImplementedError("Emailnator async provider not implemented.")
|
|
114
|
+
else:
|
|
115
|
+
from .mail_tm import MailTMAsync
|
|
116
|
+
return MailTMAsync()
|
|
117
|
+
else:
|
|
118
|
+
if provider_name.lower() == "tempmailio":
|
|
119
|
+
from .temp_mail_io import TempMailIO
|
|
120
|
+
return TempMailIO()
|
|
121
|
+
elif provider_name.lower() == "emailnator":
|
|
122
|
+
from .emailnator import EmailnatorProvider
|
|
123
|
+
return EmailnatorProvider()
|
|
124
|
+
else:
|
|
125
|
+
from .mail_tm import MailTM
|
|
126
|
+
return MailTM()
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
# Simplified helpers for common operations
|
|
130
|
+
def get_random_email(provider_name: str = "mailtm") -> Tuple[str, TempMailProvider]:
|
|
131
|
+
"""
|
|
132
|
+
Get a random temporary email address
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
provider_name: Name of the provider to use
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
Tuple containing the email address and the provider instance
|
|
139
|
+
"""
|
|
140
|
+
provider = get_provider(provider_name)
|
|
141
|
+
|
|
142
|
+
# For providers that require explicit initialization
|
|
143
|
+
if hasattr(provider, '_initialized') and not provider._initialized:
|
|
144
|
+
try:
|
|
145
|
+
# If there's an initialization method that needs to be called
|
|
146
|
+
if hasattr(provider, 'initialize'):
|
|
147
|
+
provider.initialize()
|
|
148
|
+
except Exception as e:
|
|
149
|
+
raise RuntimeError(f"Failed to initialize provider: {e}")
|
|
150
|
+
|
|
151
|
+
# Create the account (auto-generates a random email)
|
|
152
|
+
success = provider.create_account()
|
|
153
|
+
if not success:
|
|
154
|
+
raise RuntimeError(f"Failed to create account with provider {provider_name}")
|
|
155
|
+
|
|
156
|
+
return provider.email, provider
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def get_disposable_email() -> Tuple[str, TempMailProvider]:
|
|
160
|
+
"""Alias for get_random_email"""
|
|
161
161
|
return get_random_email()
|