IO4IT 4.0.2__tar.gz → 4.0.3__tar.gz
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.
- {io4it-4.0.2 → io4it-4.0.3}/PKG-INFO +1 -1
- {io4it-4.0.2 → io4it-4.0.3}/io4it.egg-info/PKG-INFO +1 -1
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWWebSearch.py +86 -20
- {io4it-4.0.2 → io4it-4.0.3}/setup.py +1 -1
- {io4it-4.0.2 → io4it-4.0.3}/io4it.egg-info/SOURCES.txt +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/io4it.egg-info/dependency_links.txt +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/io4it.egg-info/entry_points.txt +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/io4it.egg-info/namespace_packages.txt +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/io4it.egg-info/requires.txt +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/io4it.egg-info/top_level.txt +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/__init__.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/ocr_function/__init__.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/ocr_function/word_converter.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/toolViews/designer/key_manager_ui.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/toolViews/designer/link_workflow_manager_ui.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/toolViews/key_manager_ui.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/toolViews/linkHTLMWorkflow_manager_ui.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/utils/__init__.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/utils/keys_manager.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/utils/mail.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/utils/pool_exec_utils.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/utils/secret_manager.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/utils/utils_md.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWChatGpt.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWDeep_Search.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWDoclingToMarkdown.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWExportMarkdown.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWExtractTablesDocxToXlsx.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWInboxMailMonitoring.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWJsonToDataTable.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWMD2HTML.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWMarkdownLoader.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWMarkdownizer.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWOfficeNormalizer.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWParserHTML.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWPdfType.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWProcessPoolExecutor.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWS3Uploader.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWS3downloader.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWS3list.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWmailLoader.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWmailSender.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/OWwordpdf2docx.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/__init__.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/__init__.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/nogui.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/ow_extract_tables_docx_to_xlsx.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/ow_file_ext_selector.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/ow_json_to_data_table.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owchatgpt.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owdeepsearch.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owdoclingasr.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owdoclingtomarkdown.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owexportmarkdown.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owinboxmailmonitoring.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owmailloader.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owmailsender.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owmarkdownizer.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owmarkdownloader.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owmd2html.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owofficenormalizer.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owparserhtml.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owpdftype.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owprocesspoolexecutor.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owspeechtotext.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owvisualizationer.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/owwebsearch.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/wordpdf2docx.ui +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/__init__.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/chatgpt.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/check_pdf.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/deepsearch.svg +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/dep_md_old.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/download.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/export_md.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/extract_table.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/file_extensor.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/html.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/json-file.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/list_aws.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/load_md.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/mail_loader.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/mail_writer.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/md.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/monitor-email.svg +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/office_normalizer.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/owmd2html.svg +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/process_pool_executor.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/speech_to_text.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/upload.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/visualizationer.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/websearch.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons/wordpdf2docx.png +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/icons_dev/__init__.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/orangecontrib/__init__.py +0 -0
- {io4it-4.0.2 → io4it-4.0.3}/setup.cfg +0 -0
|
@@ -9,6 +9,11 @@ from bs4 import BeautifulSoup
|
|
|
9
9
|
from urllib.parse import quote, urlparse, urljoin, parse_qs
|
|
10
10
|
import unicodedata
|
|
11
11
|
import re
|
|
12
|
+
import time
|
|
13
|
+
import webbrowser
|
|
14
|
+
import requests
|
|
15
|
+
from bs4 import BeautifulSoup
|
|
16
|
+
from urllib.parse import quote, urlparse, parse_qs, urljoin
|
|
12
17
|
|
|
13
18
|
if "site-packages/Orange/widgets" in os.path.dirname(os.path.abspath(__file__)).replace("\\", "/"):
|
|
14
19
|
from Orange.widgets.orangecontrib.AAIT.utils import thread_management, base_widget
|
|
@@ -81,39 +86,100 @@ class WebSearch(base_widget.BaseListWidget):
|
|
|
81
86
|
mots_cles = [m for m in mots if m not in stopwords and len(m) > 2]
|
|
82
87
|
return mots_cles or mots
|
|
83
88
|
|
|
84
|
-
def recherche_duckduckgo(self, query, max_results=10):
|
|
89
|
+
def recherche_duckduckgo(self, query, max_results=10, timeout=10, wait_timeout=120, poll_interval=2):
|
|
90
|
+
|
|
91
|
+
def is_duckduckgo_challenge(html):
|
|
92
|
+
if not html:
|
|
93
|
+
return False
|
|
94
|
+
h = html.lower()
|
|
95
|
+
markers = [
|
|
96
|
+
"anomaly-modal",
|
|
97
|
+
"bots use duckduckgo too",
|
|
98
|
+
"please complete the following challenge",
|
|
99
|
+
"select all squares containing",
|
|
100
|
+
"challenge-form",
|
|
101
|
+
"anomaly.js",
|
|
102
|
+
]
|
|
103
|
+
return any(m in h for m in markers)
|
|
104
|
+
|
|
105
|
+
def parse_results(html, max_results):
|
|
106
|
+
soup = BeautifulSoup(html, "html.parser")
|
|
107
|
+
resultats = []
|
|
108
|
+
|
|
109
|
+
for a in soup.select("a.result__a")[:max_results]:
|
|
110
|
+
titre = a.get_text(strip=True)
|
|
111
|
+
lien = a.get("href", "")
|
|
112
|
+
|
|
113
|
+
# Gestion des liens de redirection DuckDuckGo
|
|
114
|
+
parsed = urlparse(lien)
|
|
115
|
+
if parsed.netloc and "duckduckgo.com" in parsed.netloc and parsed.path.startswith("/l/"):
|
|
116
|
+
qs = parse_qs(parsed.query)
|
|
117
|
+
if "uddg" in qs and qs["uddg"]:
|
|
118
|
+
lien = qs["uddg"][0]
|
|
119
|
+
|
|
120
|
+
# Lien relatif -> absolu
|
|
121
|
+
if lien.startswith("/"):
|
|
122
|
+
lien = urljoin("https://duckduckgo.com", lien)
|
|
123
|
+
|
|
124
|
+
resultats.append((titre, lien))
|
|
125
|
+
|
|
126
|
+
return resultats
|
|
127
|
+
|
|
85
128
|
q = quote(query)
|
|
86
129
|
url = f"https://duckduckgo.com/html/?q={q}"
|
|
130
|
+
browser_url = f"https://duckduckgo.com/?q={q}"
|
|
87
131
|
headers = {"User-Agent": "Mozilla/5.0"}
|
|
88
132
|
|
|
89
|
-
|
|
90
|
-
r = requests.get(url, headers=headers, timeout=
|
|
133
|
+
def do_request():
|
|
134
|
+
r = requests.get(url, headers=headers, timeout=timeout)
|
|
91
135
|
r.raise_for_status()
|
|
136
|
+
return r.text
|
|
137
|
+
|
|
138
|
+
# 1) Tentative normale
|
|
139
|
+
try:
|
|
140
|
+
html = do_request()
|
|
92
141
|
except requests.RequestException as e:
|
|
93
|
-
print(f"[ERREUR] Problème lors de la requête DuckDuckGo : {e}")
|
|
142
|
+
print(f"[ERREUR] Problème lors de la requête DuckDuckGo (peut etre captcha?): {e}")
|
|
94
143
|
return []
|
|
95
144
|
|
|
96
|
-
|
|
97
|
-
|
|
145
|
+
# 2) Pas de challenge => comportement normal immédiat
|
|
146
|
+
if not is_duckduckgo_challenge(html):
|
|
147
|
+
return parse_results(html, max_results)
|
|
148
|
+
|
|
149
|
+
# 3) Challenge détecté => ouverture navigateur + attente automatique
|
|
150
|
+
print("[INFO] Challenge DuckDuckGo détecté.")
|
|
151
|
+
print("[INFO] Ouverture du navigateur pour résolution manuelle...")
|
|
152
|
+
try:
|
|
153
|
+
webbrowser.open(browser_url)
|
|
154
|
+
except Exception as e:
|
|
155
|
+
print(f"[ERREUR] Impossible d'ouvrir le navigateur : {e}")
|
|
156
|
+
return []
|
|
98
157
|
|
|
99
|
-
|
|
100
|
-
titre = a.get_text(strip=True)
|
|
101
|
-
lien = a.get("href", "")
|
|
158
|
+
print("[INFO] En attente automatique de disparition du challenge...")
|
|
102
159
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
if parsed.netloc and "duckduckgo.com" in parsed.netloc and parsed.path.startswith("/l/"):
|
|
106
|
-
qs = parse_qs(parsed.query)
|
|
107
|
-
if "uddg" in qs:
|
|
108
|
-
lien = qs["uddg"][0]
|
|
160
|
+
start = time.time()
|
|
161
|
+
last_error = None
|
|
109
162
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
lien = urljoin("https://duckduckgo.com", lien)
|
|
163
|
+
while time.time() - start < wait_timeout:
|
|
164
|
+
time.sleep(poll_interval)
|
|
113
165
|
|
|
114
|
-
|
|
166
|
+
try:
|
|
167
|
+
html = do_request()
|
|
168
|
+
last_error = None
|
|
169
|
+
except requests.RequestException as e:
|
|
170
|
+
last_error = e
|
|
171
|
+
continue
|
|
172
|
+
|
|
173
|
+
if not is_duckduckgo_challenge(html):
|
|
174
|
+
print("[INFO] Challenge disparu, parsing des résultats.")
|
|
175
|
+
return parse_results(html, max_results)
|
|
176
|
+
|
|
177
|
+
if last_error is not None:
|
|
178
|
+
print(f"[ERREUR] Timeout après challenge. Dernière erreur : {last_error}")
|
|
179
|
+
else:
|
|
180
|
+
print("[ERREUR] Timeout : le challenge est toujours présent.")
|
|
115
181
|
|
|
116
|
-
return
|
|
182
|
+
return []
|
|
117
183
|
|
|
118
184
|
def extraire_domaines(self, resultats_search):
|
|
119
185
|
domaines = set()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/toolViews/designer/link_workflow_manager_ui.ui
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{io4it-4.0.2 → io4it-4.0.3}/orangecontrib/IO4IT/widgets/designer/ow_extract_tables_docx_to_xlsx.ui
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|