webscout 4.2__py3-none-any.whl → 4.4__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.

@@ -5,11 +5,14 @@ from datetime import datetime, timezone
5
5
  from decimal import Decimal
6
6
  from functools import cached_property
7
7
  from itertools import cycle, islice
8
+ from random import choice
8
9
  from threading import Event
9
10
  from types import TracebackType
10
11
  from typing import Dict, List, Optional, Tuple, Type, Union, cast
11
12
 
12
- import pyreqwest_impersonate as pri # type: ignore
13
+ import pyreqwest_impersonate as pri
14
+
15
+ from .utils import _calculate_distance, _extract_vqd, _normalize, _normalize_url, _text_extract_json, json_loads # type: ignore
13
16
 
14
17
  try:
15
18
  from lxml.etree import _Element
@@ -20,15 +23,8 @@ try:
20
23
  except ImportError:
21
24
  LXML_AVAILABLE = False
22
25
 
23
- from .exceptions import WebscoutE, RatelimitE, TimeoutE
24
- from .utils import (
25
- _calculate_distance,
26
- _extract_vqd,
27
- _normalize,
28
- _normalize_url,
29
- _text_extract_json,
30
- json_loads,
31
- )
26
+ from .exceptions import *
27
+
32
28
 
33
29
  logger = logging.getLogger("webscout.WEBS")
34
30
 
@@ -37,6 +33,15 @@ class WEBS:
37
33
  """webscout class to get search results from duckduckgo.com."""
38
34
 
39
35
  _executor: ThreadPoolExecutor = ThreadPoolExecutor()
36
+ _impersonates = (
37
+ "chrome_99", "chrome_100", "chrome_101", "chrome_104", "chrome_105", "chrome_106", "chrome_108",
38
+ "chrome_107", "chrome_109", "chrome_114", "chrome_116", "chrome_117", "chrome_118", "chrome_119",
39
+ "chrome_120", #"chrome_123", "chrome_124", "chrome_126",
40
+ "safari_ios_16.5", "safari_ios_17.2", "safari_ios_17.4.1", "safari_15.3", "safari_15.5",
41
+ "safari_15.6.1", "safari_16", "safari_16.5", "safari_17.2.1", "safari_17.4.1", "safari_17.5",
42
+ #"okhttp_3.9", "okhttp_3.11", "okhttp_3.13", "okhttp_3.14", "okhttp_4.9", "okhttp_4.10", "okhttp_5",
43
+ "edge_99", "edge_101", "edge_122",
44
+ ) # fmt: skip
40
45
 
41
46
  def __init__(
42
47
  self,
@@ -66,7 +71,7 @@ class WEBS:
66
71
  timeout=timeout,
67
72
  cookie_store=True,
68
73
  referer=True,
69
- impersonate="chrome_124",
74
+ impersonate=choice(self._impersonates),
70
75
  follow_redirects=False,
71
76
  verify=False,
72
77
  )
@@ -120,13 +125,14 @@ class WEBS:
120
125
  resp_content = self._get_url("POST", "https://duckduckgo.com", data={"q": keywords})
121
126
  return _extract_vqd(resp_content, keywords)
122
127
 
123
- def chat(self, keywords: str, model: str = "gpt-3.5") -> str:
128
+ def chat(self, keywords: str, model: str = "gpt-3.5", timeout: int = 20) -> str:
124
129
  """Initiates a chat session with DuckDuckGo AI.
125
130
 
126
131
  Args:
127
132
  keywords (str): The initial message or question to send to the AI.
128
133
  model (str): The model to use: "gpt-3.5", "claude-3-haiku", "llama-3-70b", "mixtral-8x7b".
129
134
  Defaults to "gpt-3.5".
135
+ timeout (int): Timeout value for the HTTP client. Defaults to 20.
130
136
 
131
137
  Returns:
132
138
  str: The response from the AI.
@@ -149,18 +155,16 @@ class WEBS:
149
155
  "messages": self._chat_messages,
150
156
  }
151
157
  resp = self.client.post(
152
- "https://duckduckgo.com/duckchat/v1/chat", headers={"x-vqd-4": self._chat_vqd}, json=json_data
158
+ "https://duckduckgo.com/duckchat/v1/chat",
159
+ headers={"x-vqd-4": self._chat_vqd},
160
+ json=json_data,
161
+ timeout=timeout,
153
162
  )
154
163
  self._chat_vqd = resp.headers.get("x-vqd-4", "")
155
164
 
156
- messages = []
157
- for line in resp.text.replace("data: ", "").replace("[DONE]", "").split("\n\n"):
158
- x = line.strip()
159
- if x:
160
- j = json_loads(x)
161
- message = j.get("message", "")
162
- messages.append(message)
163
- result = "".join(messages)
165
+ data = ",".join(x for line in resp.text.rstrip("[DONE]\n").split("data:") if (x := line.strip()))
166
+ result = "".join(x.get("message", "") for x in json_loads("[" + data + "]"))
167
+
164
168
  self._chat_messages.append({"role": "assistant", "content": result})
165
169
  return result
166
170
 
@@ -347,7 +351,7 @@ class WEBS:
347
351
  for e in elements:
348
352
  if isinstance(e, _Element):
349
353
  hrefxpath = e.xpath("./a/@href")
350
- href = str(hrefxpath[0]) if isinstance(hrefxpath, List) else None
354
+ href = str(hrefxpath[0]) if hrefxpath and isinstance(hrefxpath, List) else None
351
355
  if (
352
356
  href
353
357
  and href not in cache
@@ -357,9 +361,9 @@ class WEBS:
357
361
  ):
358
362
  cache.add(href)
359
363
  titlexpath = e.xpath("./h2/a/text()")
360
- title = str(titlexpath[0]) if isinstance(titlexpath, List) else ""
364
+ title = str(titlexpath[0]) if titlexpath and isinstance(titlexpath, List) else ""
361
365
  bodyxpath = e.xpath("./a//text()")
362
- body = "".join(str(x) for x in bodyxpath) if isinstance(bodyxpath, List) else ""
366
+ body = "".join(str(x) for x in bodyxpath) if bodyxpath and isinstance(bodyxpath, List) else ""
363
367
  result = {
364
368
  "title": _normalize(title),
365
369
  "href": _normalize_url(href),
@@ -449,10 +453,14 @@ class WEBS:
449
453
  else:
450
454
  cache.add(href)
451
455
  titlexpath = e.xpath(".//a//text()")
452
- title = str(titlexpath[0]) if isinstance(titlexpath, List) else ""
456
+ title = str(titlexpath[0]) if titlexpath and isinstance(titlexpath, List) else ""
453
457
  elif i == 2:
454
458
  bodyxpath = e.xpath(".//td[@class='result-snippet']//text()")
455
- body = "".join(str(x) for x in bodyxpath) if isinstance(bodyxpath, List) else ""
459
+ body = (
460
+ "".join(str(x) for x in bodyxpath).strip()
461
+ if bodyxpath and isinstance(bodyxpath, List)
462
+ else ""
463
+ )
456
464
  if href:
457
465
  result = {
458
466
  "title": _normalize(title),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: webscout
3
- Version: 4.2
3
+ Version: 4.4
4
4
  Summary: Search for anything using Google, DuckDuckGo, brave, qwant, phind.com, Contains AI models, can transcribe yt videos, temporary email and phone number generation, has TTS support, webai (terminal gpt and open interpreter) and offline LLMs and more
5
5
  Author: OEvortex
6
6
  Author-email: helpingai5@gmail.com
@@ -34,6 +34,7 @@ Requires-Dist: tqdm
34
34
  Requires-Dist: webdriver-manager
35
35
  Requires-Dist: halo >=0.0.31
36
36
  Requires-Dist: g4f >=0.2.2.3
37
+ Requires-Dist: g4f[webdriver]
37
38
  Requires-Dist: rich
38
39
  Requires-Dist: python-dotenv
39
40
  Requires-Dist: beautifulsoup4
@@ -55,6 +56,11 @@ Requires-Dist: playsound
55
56
  Requires-Dist: poe-api-wrapper
56
57
  Requires-Dist: pyreqwest-impersonate
57
58
  Requires-Dist: ballyregan
59
+ Requires-Dist: nodriver
60
+ Requires-Dist: PyExecJS
61
+ Requires-Dist: ollama
62
+ Requires-Dist: pyfiglet
63
+ Requires-Dist: yaspin
58
64
  Provides-Extra: dev
59
65
  Requires-Dist: ruff >=0.1.6 ; extra == 'dev'
60
66
  Requires-Dist: pytest >=7.4.2 ; extra == 'dev'
@@ -1472,6 +1478,34 @@ response = ollama_provider.chat("What is the meaning of life?")
1472
1478
  print(response)
1473
1479
  ```
1474
1480
 
1481
+ ### 22. GROQ
1482
+ ```python
1483
+ from webscout import GROQ
1484
+ ai = GROQ(api_key="")
1485
+ response = ai.chat("What is the meaning of life?")
1486
+ print(response)
1487
+
1488
+ ```
1489
+
1490
+ ### 23. Freegemini - chat with gemini for free
1491
+ ```python
1492
+ from webscout import FreeGemini
1493
+ ai = FreeGemini()
1494
+ response = ai.chat("What is the meaning of life?")
1495
+ print(response)
1496
+ ```
1497
+
1498
+ ### 24. LLama 70b - chat with meta's llama 3 70b
1499
+ ```python
1500
+
1501
+ from webscout import LLAMA
1502
+
1503
+ llama = LLAMA()
1504
+
1505
+ r = llama.chat("What is the meaning of life?")
1506
+ print(r)
1507
+ ```
1508
+
1475
1509
  ### `LLM`
1476
1510
  ```python
1477
1511
  from webscout.LLM import LLM
@@ -1,32 +1,33 @@
1
- webscout/AIauto.py,sha256=DycblRfFsQiLJVeP1sRQ0C-eNX7iO3a_y1wt8wChM8Y,20005
1
+ webscout/AIauto.py,sha256=gC01wLPpnqONf9DwKqkmbC_gIWo5Lh5V8YPu4OmYnhE,19923
2
2
  webscout/AIbase.py,sha256=GoHbN8r0gq2saYRZv6LA-Fr9Jlcjv80STKFXUq2ZeGU,4710
3
- webscout/AIutel.py,sha256=xNqNnGO9st2aR2CdT4AePXt5yYFG4xgI2nKMo1UcQQ4,33980
3
+ webscout/AIutel.py,sha256=1NQAchS2e6c1SrIq0efsVtX3ANZ5XI1hjKVHGpJG7OU,34076
4
4
  webscout/DWEBS.py,sha256=QLuT1IKu0lnwdl7W6c-ctBAO7Jj0Zk3PYm6-13BC7rU,25740
5
+ webscout/GoogleS.py,sha256=dW_iArNTyFT5MWBEI1HQvqf-Noj3uJeJA_Eods8D4ms,11587
5
6
  webscout/LLM.py,sha256=LbGCZdJf8A5dwfoGS4tyy39tAh5BDdhMZP0ScKaaQfU,4184
6
7
  webscout/YTdownloader.py,sha256=uWpUWnw9pxeEGw9KJ_3XDyQ5gd38gH1dJpr-HJo4vzU,39144
7
- webscout/__init__.py,sha256=bNfobn_GZVhf8CZVos1dX19xbON5tjsoTGFCeEwetnk,2211
8
+ webscout/__init__.py,sha256=teSwl1Gx50AfNu7OibwZrltsErbRDcUuD7W5oAjIc7M,2257
8
9
  webscout/__main__.py,sha256=ZtTRgsRjUi2JOvYFLF1ZCh55Sdoz94I-BS-TlJC7WDU,126
9
- webscout/async_providers.py,sha256=holBv5SxanxVXc_92CBBaXHlB2IakB_fHnhyZaFjYF8,684
10
- webscout/cli.py,sha256=EDxqTmcIshvhg9P0n2ZPaApj2-MEFY3uawS92zbBV_s,14705
10
+ webscout/async_providers.py,sha256=MRj0klEhBYVQXnzZGG_15d0e-TPA0nOc2nn735H-wR4,622
11
+ webscout/cli.py,sha256=RlBKeS9CSIsiBMqlzxevWtKjbY9htkZvA7J0bM_hHE8,14999
11
12
  webscout/exceptions.py,sha256=YtIs-vXBwcjbt9TZ_wB7yI0dO7ANYIZAmEEeLmoQ2fI,487
12
13
  webscout/g4f.py,sha256=NNcnlOtIWV9R93UsBN4jBGBEJ9sJ-Np1WbgjkGVDcYc,24487
13
14
  webscout/models.py,sha256=5iQIdtedT18YuTZ3npoG7kLMwcrKwhQ7928dl_7qZW0,692
14
15
  webscout/tempid.py,sha256=5oc3UbXhPGKxrMRTfRABT-V-dNzH_hOKWtLYM6iCWd4,5896
15
16
  webscout/transcriber.py,sha256=EddvTSq7dPJ42V3pQVnGuEiYQ7WjJ9uyeR9kMSxN7uY,20622
16
- webscout/utils.py,sha256=CxeXvp0rWIulUrEaPZMaNfg_tSuQLRSV8uuHA2chyKE,2603
17
- webscout/version.py,sha256=lOw9hPXXgs_Wlw6Px5eyN37MYJbDYnOuwXrI1TPkDXc,44
17
+ webscout/utils.py,sha256=2O8_lftBKsv5OEvVaXCN-h0sipup0m3jxzhFdWQrdY8,2873
18
+ webscout/version.py,sha256=Pp5thQN3CvwDpubKz9MHn-UvDhuocamnBfB2VckwBGI,44
18
19
  webscout/voice.py,sha256=0QjXTHAQmCK07IDZXRc7JXem47cnPJH7u3X0sVP1-UQ,967
19
- webscout/webai.py,sha256=LPn9XKvc5SLxJ68slMsPUXxzkzfa4b0kzsiJyWs-yq0,88897
20
- webscout/webscout_search.py,sha256=lFAot1-Qil_YfXieeLakDVDEX8Ckcima4ueXdOYwiMc,42804
20
+ webscout/webai.py,sha256=32mRZqAGCOSCeyfAMzqac-94r2RD5_SWUxfh4QjZ95M,89037
21
+ webscout/webscout_search.py,sha256=lYrsPVB4QdSGJl4zehvSmGxK61xBAZ2dZGCmuN3ar2w,43686
21
22
  webscout/webscout_search_async.py,sha256=dooKGwLm0cwTml55Vy6NHPPY-nymEqX2h8laX94Zg5A,14537
22
23
  webscout/websx_search.py,sha256=n-qVwiHozJEF-GFRPcAfh4k1d_tscTmDe1dNL-1ngcU,12094
23
24
  webscout/Extra/__init__.py,sha256=GG1qUwS-HspT4TeeAIT4qFpM8PaO1ZdQhpelctaM7Rs,99
24
- webscout/Extra/autollama.py,sha256=DDdnb1tKEZWJaADVn9GXTZkMSwLKCcUGIjMKNlOBtK8,5419
25
- webscout/Extra/gguf.py,sha256=5zTNE5HxM_VQ5ONoocL8GG5fRXrgyLdEEjNzndG0oUw,7811
26
- webscout/Extra/weather.py,sha256=ocGwJYp5B9FwVWvIZ9wtoJTQsPFt64Vt8TitxJcdvAU,1687
27
- webscout/Extra/weather_ascii.py,sha256=sy6EEh2kN1CO1hKda8chD-mVCxH4p0NHyP7Uxr0-rgo,630
25
+ webscout/Extra/autollama.py,sha256=8lyodIWAgJABzlMMHytlolPCgvUKh8ynkZD6MMEltXs,5970
26
+ webscout/Extra/gguf.py,sha256=3QzQIClcVoHyAeb60xxv4msJudC2Maf41StdbzAq1bk,7009
27
+ webscout/Extra/weather.py,sha256=wdSrQxZRpbNfyaux0BeLdaDWyde5KwxZjSUM13820X0,2460
28
+ webscout/Extra/weather_ascii.py,sha256=Aed-_EUzvTEjBXbOpNRxkJBLa6fXsclknXP06HnQD18,808
28
29
  webscout/Local/__init__.py,sha256=RN6klpbabPGNX2YzPm_hdeUcQvieUwvJt22uAO2RKSM,238
29
- webscout/Local/_version.py,sha256=ZbCLJLHnrzQdwnxadyRSHEGRQY77fO8BRjE8sVITcnw,83
30
+ webscout/Local/_version.py,sha256=yH-h9AKl_KbJwMWeq0PDDOVI2FQ9NutjLDqcCGuAQ6I,83
30
31
  webscout/Local/formats.py,sha256=BiZZSoN3e8S6-S-ykBL9ogSUs0vK11GaZ3ghc9U8GRk,18994
31
32
  webscout/Local/model.py,sha256=T_bzNNrxEyOyLyhp6fKwiuVBBkXC2a37LzJVCxFIxOU,30710
32
33
  webscout/Local/rawdog.py,sha256=ojY_O8Vb1KvR34OwWdfLgllgaAK_7HMf64ElMATvCXs,36689
@@ -40,13 +41,14 @@ webscout/Provider/ChatGPTUK.py,sha256=qmuCb_a71GNE5LelOb5AKJUBndvj7soebiNey4VdDv
40
41
  webscout/Provider/Cohere.py,sha256=IXnRosYOaMAA65nvsKmN6ZkJGSdZFYQYBidzuNaCqX8,8711
41
42
  webscout/Provider/Deepinfra.py,sha256=kVnWARJdEtIeIsZwGw3POq8B2dO87bDcJso3uOeCeOA,18750
42
43
  webscout/Provider/Deepseek.py,sha256=pnOB44ObuOfAsoi_bUGUvha3tfwd0rTJ9rnX-14QkL4,10550
44
+ webscout/Provider/FreeGemini.py,sha256=GbTJEG09vs5IKWKy9FqHBvDNKVq-HdMexOplctpb0RI,6426
43
45
  webscout/Provider/Gemini.py,sha256=_4DHWvlWuNAmVHPwHB1RjmryjTZZCthLa6lvPEHLvkQ,8451
44
46
  webscout/Provider/Geminiflash.py,sha256=1kMPA-ypi1gmJoms606Z7j_51znpdofM2aAyo4Hl7wU,5951
45
47
  webscout/Provider/Geminipro.py,sha256=nOifT5CRmnUg28iifSbOHkNLoKucLRr5zCj607mVrhw,5948
46
48
  webscout/Provider/Groq.py,sha256=QfgP3hKUcqq5vUA4Pzuu3HAgpJkKwLWNjjsnxtkCYd8,21094
47
49
  webscout/Provider/Koboldai.py,sha256=KwWx2yPlvT9BGx37iNvSbgzWkJ9I8kSOmeg7sL1hb0M,15806
48
50
  webscout/Provider/Leo.py,sha256=wbuDR-vFjLptfRC6yDlk74tINqNvCOzpISsK92lIgGg,19987
49
- webscout/Provider/Llama2.py,sha256=gVMotyiBaDSqliwuDtFefHoOBn9V5m5Ze_YVtV0trt8,17525
51
+ webscout/Provider/Llama.py,sha256=F_srqtdo6ws03tnEaetZOfDolXrQEnLZaIxmQaY_tJQ,8052
50
52
  webscout/Provider/OLLAMA.py,sha256=G8sz_P7OZINFI1qGnpDhNPWU789Sv2cpDnShOA5Nbmw,7075
51
53
  webscout/Provider/OpenGPT.py,sha256=ZymwLgNJSPlGZHW3msMlnRR7NxmALqJw9yuToqrRrhw,35515
52
54
  webscout/Provider/Openai.py,sha256=SjfVOwY94unVnXhvN0Fkome-q2-wi4mPJk_vCGq5Fjc,20617
@@ -59,10 +61,10 @@ webscout/Provider/VTLchat.py,sha256=_sErGr-wOi16ZAfiGOo0bPsAEMkjzzwreEsIqjIZMIU,
59
61
  webscout/Provider/Xjai.py,sha256=BIlk2ouz9Kh_0Gg9hPvTqhI7XtcmWdg5vHSX_4uGrIs,9039
60
62
  webscout/Provider/Yepchat.py,sha256=2Eit-A7w1ph1GQKNQuur_yaDzI64r0yBGxCIjDefJxQ,19875
61
63
  webscout/Provider/Youchat.py,sha256=fhMpt94pIPE_XDbC4z9xyfgA7NbkNE2wlRFJabsjv90,8069
62
- webscout/Provider/__init__.py,sha256=ETLFpBrQsE5yCrrHXSnQtQfB9SF65oBDrylCi0bq5GY,1963
63
- webscout-4.2.dist-info/LICENSE.md,sha256=9P0imsudI7MEvZe2pOcg8rKBn6E5FGHQ-riYozZI-Bk,2942
64
- webscout-4.2.dist-info/METADATA,sha256=op8wqdzv0qTjR3MTqHSKYVOT-8QYOeDtffvjDz0dw_s,57080
65
- webscout-4.2.dist-info/WHEEL,sha256=cpQTJ5IWu9CdaPViMhC9YzF8gZuS5-vlfoFihTBC86A,91
66
- webscout-4.2.dist-info/entry_points.txt,sha256=Hh4YIIjvkqB9SVxZ2ri4DZUkgEu_WF_5_r_nZDIvfG8,73
67
- webscout-4.2.dist-info/top_level.txt,sha256=nYIw7OKBQDr_Z33IzZUKidRD3zQEo8jOJYkMVMeN334,9
68
- webscout-4.2.dist-info/RECORD,,
64
+ webscout/Provider/__init__.py,sha256=j6lZqjLYext2a-KTnvGEvVm-D3jezHIlnanlj2H37FI,1962
65
+ webscout-4.4.dist-info/LICENSE.md,sha256=9P0imsudI7MEvZe2pOcg8rKBn6E5FGHQ-riYozZI-Bk,2942
66
+ webscout-4.4.dist-info/METADATA,sha256=bgSEbiMKbSplv_CNKFCFWvY9Mp44VyxuuWpBJSxIKgQ,57749
67
+ webscout-4.4.dist-info/WHEEL,sha256=cpQTJ5IWu9CdaPViMhC9YzF8gZuS5-vlfoFihTBC86A,91
68
+ webscout-4.4.dist-info/entry_points.txt,sha256=Hh4YIIjvkqB9SVxZ2ri4DZUkgEu_WF_5_r_nZDIvfG8,73
69
+ webscout-4.4.dist-info/top_level.txt,sha256=nYIw7OKBQDr_Z33IzZUKidRD3zQEo8jOJYkMVMeN334,9
70
+ webscout-4.4.dist-info/RECORD,,