From f245b440ed53c82e351b5a190bfe5a7a27828562 Mon Sep 17 00:00:00 2001 From: khngo01 Date: Wed, 28 Jan 2026 15:12:19 -0800 Subject: [PATCH 1/3] Fixed deprecated reports/download --- shadowapi/call_api.py | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/shadowapi/call_api.py b/shadowapi/call_api.py index f395ae1..c4b565a 100644 --- a/shadowapi/call_api.py +++ b/shadowapi/call_api.py @@ -4,6 +4,7 @@ import json import requests from datetime import date +import csv from .resources import QueryFilters, SSLQuery, ReportTypes @@ -188,29 +189,30 @@ def report_list(self, limit: int = None, type_: str = None, reports: list = None ) return self.api_call('reports/list', req_dict) - def report_download(self, id_: str = None, report: str = None, limit: int = None, - type_: str = None, date_: date = None, date_end: date = None - ) -> list or str: + def report_download(self, id_: str = None) -> list or str: """Downloads details on reports Args: id_ (str, optional): ID of report. Defaults to None. - report (str, optional): Name of report. Defaults to None. - limit (int, optional): Limit on number of reports. Defaults to None. - date_ (date, optional): Date to search reports for. Defaults to None. - date_end (date, optional): Date to search reports since ``date_``; should be - later than ``date_``. Defaults to None. Returns: list: List of report JSON """ - req_dict = {} - if date_: date_ = self.date_eval(date_, date_end) - req_dict = self.check_valid(req_dict, - [("id", id_), ("limit", limit), ("report", report), ("date", date_)] - ) - data = self.api_call("reports/download", req_dict) - return data + + if not id_: + return "Missing ID" + + url = f"https://dl.shadowserver.org/{id_}" + + with requests.get(url, stream=True, timeout=120) as r: + try: + r.raise_for_status() + except requests.HTTPError as e: + return r.text + + lines = r.iter_lines(decode_unicode=True) + reader = csv.DictReader(lines) + return list(reader) def report_stats(self, report: str = None, type_: str = None, date_: date = None, date_end: date = None) -> list or str: From 1c3fdaa82f83bc6b481439b4b280d15f37da471a Mon Sep 17 00:00:00 2001 From: khngo01 Date: Mon, 9 Feb 2026 09:28:17 -0800 Subject: [PATCH 2/3] Fixed exception --- shadowapi/call_api.py | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/shadowapi/call_api.py b/shadowapi/call_api.py index c4b565a..e658a33 100644 --- a/shadowapi/call_api.py +++ b/shadowapi/call_api.py @@ -189,27 +189,20 @@ def report_list(self, limit: int = None, type_: str = None, reports: list = None ) return self.api_call('reports/list', req_dict) - def report_download(self, id_: str = None) -> list or str: + def report_download(self, id_: str) -> list or str: """Downloads details on reports Args: - id_ (str, optional): ID of report. Defaults to None. + id_ (str): ID of report Returns: list: List of report JSON """ - - if not id_: - return "Missing ID" - url = f"https://dl.shadowserver.org/{id_}" with requests.get(url, stream=True, timeout=120) as r: - try: - r.raise_for_status() - except requests.HTTPError as e: - return r.text - + r.raise_for_status() + lines = r.iter_lines(decode_unicode=True) reader = csv.DictReader(lines) return list(reader) From c715c1f04414018d2d5044d9c25de5ac316bf623 Mon Sep 17 00:00:00 2001 From: khngo01 Date: Mon, 9 Feb 2026 09:43:59 -0800 Subject: [PATCH 3/3] update --- shadowapi/call_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shadowapi/call_api.py b/shadowapi/call_api.py index e658a33..8398c52 100644 --- a/shadowapi/call_api.py +++ b/shadowapi/call_api.py @@ -193,7 +193,7 @@ def report_download(self, id_: str) -> list or str: """Downloads details on reports Args: - id_ (str): ID of report + id_ (str): ID of report (mandatory) Returns: list: List of report JSON