vysion 2.0.3__py3-none-any.whl → 2.0.5__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.
- vysion/client/client.py +63 -49
- vysion/dto/dto.py +1 -2
- vysion/dto/tag.py +1 -1
- vysion/dto/util.py +1 -1
- vysion/version.py +1 -1
- {vysion-2.0.3.dist-info → vysion-2.0.5.dist-info}/METADATA +2 -2
- {vysion-2.0.3.dist-info → vysion-2.0.5.dist-info}/RECORD +9 -9
- {vysion-2.0.3.dist-info → vysion-2.0.5.dist-info}/LICENSE +0 -0
- {vysion-2.0.3.dist-info → vysion-2.0.5.dist-info}/WHEEL +0 -0
vysion/client/client.py
CHANGED
|
@@ -26,9 +26,19 @@ from urllib.parse import quote, urlencode, urljoin
|
|
|
26
26
|
# from pydantic import validate_arguments
|
|
27
27
|
import requests
|
|
28
28
|
|
|
29
|
-
import vysion.dto as dto
|
|
30
29
|
from vysion.client.error import APIError
|
|
31
|
-
from vysion.dto import
|
|
30
|
+
from vysion.dto import (
|
|
31
|
+
Error,
|
|
32
|
+
DocumentHit,
|
|
33
|
+
VysionResponse,
|
|
34
|
+
RansomwareHit,
|
|
35
|
+
Stat,
|
|
36
|
+
Network,
|
|
37
|
+
Language,
|
|
38
|
+
ImChannelHit,
|
|
39
|
+
ImMessageHit,
|
|
40
|
+
ImProfileHit,
|
|
41
|
+
)
|
|
32
42
|
from vysion.version import __version__ as vysion_version
|
|
33
43
|
|
|
34
44
|
# All API endpoints start with this prefix, you don't need to include the
|
|
@@ -106,7 +116,7 @@ class BaseClient:
|
|
|
106
116
|
query = "?" + urlencode(query_params_initialzed)
|
|
107
117
|
return urljoin(base, query)
|
|
108
118
|
|
|
109
|
-
def _make_request(self, url: str) ->
|
|
119
|
+
def _make_request(self, url: str) -> VysionResponse:
|
|
110
120
|
session = self.__get_session__()
|
|
111
121
|
r = session.get(url)
|
|
112
122
|
|
|
@@ -122,14 +132,12 @@ class BaseClient:
|
|
|
122
132
|
|
|
123
133
|
raise APIError(code, message)
|
|
124
134
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
result = dto.VysionResponse.model_validate(payload)
|
|
135
|
+
result = r.json()
|
|
128
136
|
|
|
129
137
|
return result
|
|
130
138
|
|
|
131
139
|
|
|
132
|
-
def vysion_error_manager(method) -> Union[
|
|
140
|
+
def vysion_error_manager(method) -> Union[VysionResponse, Error]:
|
|
133
141
|
def manage(*args, **kwargs):
|
|
134
142
|
try:
|
|
135
143
|
result = method(*args, **kwargs)
|
|
@@ -161,11 +169,11 @@ class Client(BaseClient):
|
|
|
161
169
|
gte: datetime = None,
|
|
162
170
|
page: int = 1,
|
|
163
171
|
page_size: int = 10,
|
|
164
|
-
network:
|
|
165
|
-
language:
|
|
172
|
+
network: Network = None,
|
|
173
|
+
language: Language = None,
|
|
166
174
|
include_tag: str = None,
|
|
167
175
|
exclude_tag: str = None,
|
|
168
|
-
) ->
|
|
176
|
+
) -> VysionResponse[DocumentHit]:
|
|
169
177
|
url = self._build_api_url__(
|
|
170
178
|
"document/search",
|
|
171
179
|
q=q,
|
|
@@ -179,14 +187,14 @@ class Client(BaseClient):
|
|
|
179
187
|
exclude_tag=exclude_tag,
|
|
180
188
|
)
|
|
181
189
|
|
|
182
|
-
result = self._make_request(url)
|
|
190
|
+
result = VysionResponse[DocumentHit].model_validate(self._make_request(url))
|
|
183
191
|
return result.data
|
|
184
192
|
|
|
185
193
|
@vysion_error_manager
|
|
186
|
-
def get_document(self, document_id: str) ->
|
|
194
|
+
def get_document(self, document_id: str) -> VysionResponse[DocumentHit]:
|
|
187
195
|
url = self._build_api_url__("document", document_id)
|
|
188
196
|
|
|
189
|
-
result = self._make_request(url)
|
|
197
|
+
result = VysionResponse[DocumentHit].model_validate(self._make_request(url))
|
|
190
198
|
return result.data
|
|
191
199
|
|
|
192
200
|
@vysion_error_manager
|
|
@@ -196,28 +204,28 @@ class Client(BaseClient):
|
|
|
196
204
|
page: int = 1,
|
|
197
205
|
lte: datetime = None,
|
|
198
206
|
gte: datetime = None,
|
|
199
|
-
) ->
|
|
207
|
+
) -> VysionResponse[DocumentHit]:
|
|
200
208
|
url = self._build_api_url__("document/url", url, page=page, lte=lte, gte=gte)
|
|
201
209
|
|
|
202
|
-
result = self._make_request(url)
|
|
210
|
+
result = VysionResponse[DocumentHit].model_validate(self._make_request(url))
|
|
203
211
|
return result.data
|
|
204
212
|
|
|
205
213
|
@vysion_error_manager
|
|
206
|
-
def get_tag(self, tag: str) ->
|
|
214
|
+
def get_tag(self, tag: str) -> VysionResponse[DocumentHit]:
|
|
207
215
|
url = self._build_api_url__("document/tag", tag)
|
|
208
216
|
|
|
209
|
-
result = self._make_request(url)
|
|
217
|
+
result = VysionResponse[DocumentHit].model_validate(self._make_request(url))
|
|
210
218
|
return result.data
|
|
211
219
|
|
|
212
220
|
@vysion_error_manager
|
|
213
221
|
def find_email(
|
|
214
222
|
self, email: str, page: int = 1, lte: datetime = None, gte: datetime = None
|
|
215
|
-
) ->
|
|
223
|
+
) -> VysionResponse[DocumentHit]:
|
|
216
224
|
url = self._build_api_url__(
|
|
217
225
|
"document/email", email, page=page, lte=lte, gte=gte
|
|
218
226
|
)
|
|
219
227
|
|
|
220
|
-
result = self._make_request(url)
|
|
228
|
+
result = VysionResponse[DocumentHit].model_validate(self._make_request(url))
|
|
221
229
|
return result.data
|
|
222
230
|
|
|
223
231
|
@vysion_error_manager
|
|
@@ -228,16 +236,16 @@ class Client(BaseClient):
|
|
|
228
236
|
page: int = 1,
|
|
229
237
|
lte: datetime = None,
|
|
230
238
|
gte: datetime = None,
|
|
231
|
-
) ->
|
|
239
|
+
) -> VysionResponse[DocumentHit]:
|
|
232
240
|
url = self._build_api_url__(
|
|
233
|
-
"document/phone",
|
|
234
|
-
|
|
241
|
+
"document/phone/" + country_code,
|
|
242
|
+
phone_number,
|
|
235
243
|
page=page,
|
|
236
244
|
lte=lte,
|
|
237
245
|
gte=gte,
|
|
238
246
|
)
|
|
239
247
|
|
|
240
|
-
result = self._make_request(url)
|
|
248
|
+
result = VysionResponse[DocumentHit].model_validate(self._make_request(url))
|
|
241
249
|
return result.data
|
|
242
250
|
|
|
243
251
|
@vysion_error_manager
|
|
@@ -248,12 +256,12 @@ class Client(BaseClient):
|
|
|
248
256
|
page: int = 1,
|
|
249
257
|
lte: datetime = None,
|
|
250
258
|
gte: datetime = None,
|
|
251
|
-
) ->
|
|
259
|
+
) -> VysionResponse[DocumentHit]:
|
|
252
260
|
url = self._build_api_url__(
|
|
253
|
-
"document/wallet"
|
|
261
|
+
"document/wallet/" + chain, address, page=page, lte=lte, gte=gte
|
|
254
262
|
)
|
|
255
263
|
|
|
256
|
-
result = self._make_request(url)
|
|
264
|
+
result = VysionResponse[DocumentHit].model_validate(self._make_request(url))
|
|
257
265
|
return result.data
|
|
258
266
|
|
|
259
267
|
@vysion_error_manager
|
|
@@ -276,10 +284,10 @@ class Client(BaseClient):
|
|
|
276
284
|
gte: datetime = None,
|
|
277
285
|
page: int = 1,
|
|
278
286
|
page_size: int = 10,
|
|
279
|
-
network:
|
|
287
|
+
network: Network = None,
|
|
280
288
|
country: str = None,
|
|
281
|
-
language:
|
|
282
|
-
) ->
|
|
289
|
+
language: Language = None,
|
|
290
|
+
) -> VysionResponse[RansomwareHit]:
|
|
283
291
|
url = self._build_api_url__(
|
|
284
292
|
"victim/search",
|
|
285
293
|
q=q,
|
|
@@ -292,14 +300,14 @@ class Client(BaseClient):
|
|
|
292
300
|
language=language,
|
|
293
301
|
)
|
|
294
302
|
|
|
295
|
-
result = self._make_request(url)
|
|
303
|
+
result = VysionResponse[RansomwareHit].model_validate(self._make_request(url))
|
|
296
304
|
return result.data
|
|
297
305
|
|
|
298
306
|
@vysion_error_manager
|
|
299
|
-
def get_ransomware_victim(self, document_id: str) ->
|
|
307
|
+
def get_ransomware_victim(self, document_id: str) -> VysionResponse[RansomwareHit]:
|
|
300
308
|
url = self._build_api_url__("victim", document_id)
|
|
301
309
|
|
|
302
|
-
result = self._make_request(url)
|
|
310
|
+
result = VysionResponse[RansomwareHit].model_validate(self._make_request(url))
|
|
303
311
|
return result.data
|
|
304
312
|
|
|
305
313
|
#
|
|
@@ -312,10 +320,12 @@ class Client(BaseClient):
|
|
|
312
320
|
countries: str = None,
|
|
313
321
|
gte: datetime = None,
|
|
314
322
|
lte: datetime = None,
|
|
315
|
-
) ->
|
|
316
|
-
url = self._build_api_url__(
|
|
323
|
+
) -> VysionResponse[Stat]:
|
|
324
|
+
url = self._build_api_url__(
|
|
325
|
+
"stats/countries", countries=countries, gte=gte, lte=lte
|
|
326
|
+
)
|
|
317
327
|
|
|
318
|
-
result = self._make_request(url)
|
|
328
|
+
result = VysionResponse[Stat].model_validate(self._make_request(url))
|
|
319
329
|
return result.data
|
|
320
330
|
|
|
321
331
|
@vysion_error_manager
|
|
@@ -324,10 +334,12 @@ class Client(BaseClient):
|
|
|
324
334
|
countries: str = None,
|
|
325
335
|
gte: datetime = None,
|
|
326
336
|
lte: datetime = None,
|
|
327
|
-
) ->
|
|
328
|
-
url = self._build_api_url__(
|
|
337
|
+
) -> VysionResponse[Stat]:
|
|
338
|
+
url = self._build_api_url__(
|
|
339
|
+
"stats/groups", countries=countries, gte=gte, lte=lte
|
|
340
|
+
)
|
|
329
341
|
|
|
330
|
-
result = self._make_request(url)
|
|
342
|
+
result = VysionResponse[Stat].model_validate(self._make_request(url))
|
|
331
343
|
return result.data
|
|
332
344
|
|
|
333
345
|
#
|
|
@@ -343,7 +355,7 @@ class Client(BaseClient):
|
|
|
343
355
|
lte: datetime = None,
|
|
344
356
|
page: int = 1,
|
|
345
357
|
username: str = None,
|
|
346
|
-
) ->
|
|
358
|
+
) -> VysionResponse[ImMessageHit]:
|
|
347
359
|
url = self._build_api_url__(
|
|
348
360
|
"im/" + platform + "/search",
|
|
349
361
|
q=q,
|
|
@@ -353,43 +365,45 @@ class Client(BaseClient):
|
|
|
353
365
|
username=username,
|
|
354
366
|
)
|
|
355
367
|
|
|
356
|
-
result = self._make_request(url)
|
|
368
|
+
result = VysionResponse[ImMessageHit].model_validate(self._make_request(url))
|
|
357
369
|
return result.data
|
|
358
370
|
|
|
359
371
|
@vysion_error_manager
|
|
360
372
|
def get_im_chat(
|
|
361
373
|
self, platform: str, channelId: str, gte: datetime = None, lte: datetime = None
|
|
362
|
-
) ->
|
|
363
|
-
url = self._build_api_url__(
|
|
374
|
+
) -> VysionResponse[ImMessageHit]:
|
|
375
|
+
url = self._build_api_url__(
|
|
376
|
+
"im/" + platform + "/chat/" + channelId, gte=gte, lte=lte
|
|
377
|
+
)
|
|
364
378
|
|
|
365
|
-
result = self._make_request(url)
|
|
379
|
+
result = VysionResponse[ImMessageHit].model_validate(self._make_request(url))
|
|
366
380
|
return result.data
|
|
367
381
|
|
|
368
382
|
@vysion_error_manager
|
|
369
383
|
def get_im_profile(
|
|
370
384
|
self, platform: str, userId: str
|
|
371
|
-
) ->
|
|
385
|
+
) -> VysionResponse[ImProfileHit]:
|
|
372
386
|
url = self._build_api_url__("im/" + platform + "/profile/", userId)
|
|
373
387
|
|
|
374
|
-
result = self._make_request(url)
|
|
388
|
+
result = VysionResponse[ImProfileHit].model_validate(self._make_request(url))
|
|
375
389
|
return result.data
|
|
376
390
|
|
|
377
391
|
@vysion_error_manager
|
|
378
392
|
def get_im_message(
|
|
379
393
|
self, platform: str, messageId: str
|
|
380
|
-
) ->
|
|
394
|
+
) -> VysionResponse[ImMessageHit]:
|
|
381
395
|
url = self._build_api_url__("im/" + platform + "/message/", messageId)
|
|
382
396
|
|
|
383
|
-
result = self._make_request(url)
|
|
397
|
+
result = VysionResponse[ImMessageHit].model_validate(self._make_request(url))
|
|
384
398
|
return result.data
|
|
385
399
|
|
|
386
400
|
@vysion_error_manager
|
|
387
401
|
def get_im_channel(
|
|
388
402
|
self, platform: str, channelId: str
|
|
389
|
-
) ->
|
|
403
|
+
) -> VysionResponse[ImChannelHit]:
|
|
390
404
|
url = self._build_api_url__("im/" + platform + "/channel/", channelId)
|
|
391
405
|
|
|
392
|
-
result = self._make_request(url)
|
|
406
|
+
result = VysionResponse[ImChannelHit].model_validate(self._make_request(url))
|
|
393
407
|
return result.data
|
|
394
408
|
|
|
395
409
|
#
|
vysion/dto/dto.py
CHANGED
|
@@ -399,8 +399,7 @@ T = TypeVar("T")
|
|
|
399
399
|
|
|
400
400
|
class Result(BaseModel, Generic[T]):
|
|
401
401
|
total: int = 0
|
|
402
|
-
hits:
|
|
403
|
-
List[ImProfileHit],List[RansomFeedHit],List[RansomwareHit]] = Field(default_factory=lambda: [])
|
|
402
|
+
hits: List[T] = Field(default_factory=lambda: [])
|
|
404
403
|
|
|
405
404
|
def __init__(self, **kwargs):
|
|
406
405
|
super().__init__(**kwargs)
|
vysion/dto/tag.py
CHANGED
vysion/dto/util.py
CHANGED
|
@@ -111,7 +111,7 @@ class MISPProcessor:
|
|
|
111
111
|
|
|
112
112
|
self.misp_event.add_object(misp_object)
|
|
113
113
|
|
|
114
|
-
def process(self, result: dto.Result, **kwargs) -> MISPEvent:
|
|
114
|
+
def process(self, result: dto.Result[DocumentHit|RansomFeedHit], **kwargs) -> MISPEvent:
|
|
115
115
|
|
|
116
116
|
processor = {
|
|
117
117
|
DocumentHit: self.parse_hit,
|
vysion/version.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: vysion
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.5
|
|
4
4
|
Summary: The official Python client library for Vysion
|
|
5
5
|
Home-page: https://vysion.ai
|
|
6
6
|
License: Apache-2.0
|
|
@@ -29,7 +29,7 @@ Welcome to the PyPi webpage for Vysion, our implementation as a Python library t
|
|
|
29
29
|
|
|
30
30
|
You can request a demo for the web app or an API-key to use in this library at [vysion.ai](https://vysion.ai).
|
|
31
31
|
|
|
32
|
-
Latest version: [2.0.
|
|
32
|
+
Latest version: [2.0.5](https://pypi.org/project/vysion/)
|
|
33
33
|
|
|
34
34
|
You can visit [the documentation](https://developers.vysion.ai/?python) for more information on the searches and requests performed with the library or directly on the API.
|
|
35
35
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
vysion/__init__.py,sha256=yxJiM-S29q8GB3PBff9tV70P2nvydd8aKLEprLkXw5o,664
|
|
2
2
|
vysion/client/__init__.py,sha256=aVHmBuetPdybp7TgcNzUx4HkxTjEuXYzSdDYiYfFQd0,630
|
|
3
|
-
vysion/client/client.py,sha256=
|
|
3
|
+
vysion/client/client.py,sha256=ce61pZP9nWhHnzGpzWA8TAt2DC14W_3UqJexHHBRHrc,12558
|
|
4
4
|
vysion/client/error.py,sha256=-3NGr9ngTGSy-ctqk6S9eMBAvtY3lnjv9i0KiuRjd5g,1158
|
|
5
5
|
vysion/dto/__init__.py,sha256=ct8JxVMfJ0APiOTgr9ju-JIuBlXOrPkx7n2qISSXUts,605
|
|
6
|
-
vysion/dto/dto.py,sha256=
|
|
7
|
-
vysion/dto/tag.py,sha256=
|
|
8
|
-
vysion/dto/util.py,sha256=
|
|
6
|
+
vysion/dto/dto.py,sha256=kRwN3ElHt0GxM4bHuGgDa-IFRqVul0R3CBDfZBh7R-s,13058
|
|
7
|
+
vysion/dto/tag.py,sha256=whGPsdasgYm8oijrL7MRSMmapzaoCmKNeaJ5ih0aBIk,1503
|
|
8
|
+
vysion/dto/util.py,sha256=bs-DXwHakGU1E3463P3fzNQ5C5d7EwvLIN3xqKT8Ahw,4460
|
|
9
9
|
vysion/model/__init__.py,sha256=rJX9eNW9-jQGTgwm97W04jhZa-dV_dSTTTFcbWg73w0,606
|
|
10
10
|
vysion/model/enum/__init__.py,sha256=lhG6rgaYjrFBR8_IfJL0OoT0L7vooR5_ht4zUahQcOc,690
|
|
11
11
|
vysion/model/enum/languages.py,sha256=yrYDwLEM2lK5iqdLR16n8xeCeSmsCsIj4sTiuNz33FM,4204
|
|
@@ -15,8 +15,8 @@ vysion/model/enum/services.py,sha256=fUfZEO0RNNctU4Gzae5TV3c7BU5A_cEwaEb1tzqgcr0
|
|
|
15
15
|
vysion/taxonomy/__init__.py,sha256=Bc364AYxRCyjIn26-XBPeEDCPe3Hma4r5RAI8R8eblU,635
|
|
16
16
|
vysion/taxonomy/flavours.py,sha256=ubImHBE8v0zhzFy_2YozAQk2SzN1XDQwHAxb2RebtCo,2347
|
|
17
17
|
vysion/taxonomy/taxonomy.py,sha256=mG6vHX5Eyp38AKyJBgfBDqdpEmDMbkv8TA8YUBzko54,12227
|
|
18
|
-
vysion/version.py,sha256=
|
|
19
|
-
vysion-2.0.
|
|
20
|
-
vysion-2.0.
|
|
21
|
-
vysion-2.0.
|
|
22
|
-
vysion-2.0.
|
|
18
|
+
vysion/version.py,sha256=vxtas-jndirPiYaFbGS7QFsPL4wNV43j6SwiSecUGQI,610
|
|
19
|
+
vysion-2.0.5.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
|
|
20
|
+
vysion-2.0.5.dist-info/METADATA,sha256=_brYLMOQDb5E7cxIcyQRm_HDVLzk-VpiUkmE5fwF7PM,2122
|
|
21
|
+
vysion-2.0.5.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
|
22
|
+
vysion-2.0.5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|