22import os
33from typing import Optional , List
44import requests
5- from pprint import pprint
65from l9format import l9format
76from enum import Enum
87from serde import Model , fields
98from leakix .response import SuccessResponse , ErrorResponse , RateLimitResponse
109from leakix .query import *
1110from leakix .plugin import *
1211from leakix .field import *
13- from leakix import __VERSION__
12+
13+
14+ __VERSION__ = "0.1.2"
1415
1516
1617class Scope (Enum ):
@@ -24,28 +25,24 @@ class HostResult(Model):
2425
2526
2627class Client :
27- BASE_URL = "https://leakix.net"
28-
29- def __init__ (self , api_key : Optional [str ] = None ):
28+ def __init__ (
29+ self ,
30+ api_key : Optional [str ] = None ,
31+ base_url : Optional [str ] = "https://leakix.net" ,
32+ ):
3033 self .api_key = api_key
34+ self .base_url = base_url
3135 self .headers = {
3236 "Accept" : "application/json" ,
3337 "User-agent" : "leakix-client-python/%s" % __VERSION__ ,
3438 }
3539 if api_key :
3640 self .headers ["api-key" ] = api_key
3741
38- def get (self , scope : Scope , queries : Optional [List [Query ]] = None ):
39- if queries is None or len (queries ) == 0 :
40- serialized_query = EmptyQuery ().serialize ()
41- else :
42- serialized_query = [q .serialize () for q in queries ]
43- serialized_query = " " .join (serialized_query )
44- serialized_query = "%s" % serialized_query
45- url = "%s/search" % self .BASE_URL
42+ def __get (self , url , params ):
4643 r = requests .get (
4744 url ,
48- params = { "scope" : scope . value , "q" : serialized_query } ,
45+ params = params ,
4946 headers = self .headers ,
5047 )
5148 if r .status_code == 200 :
@@ -54,7 +51,18 @@ def get(self, scope: Scope, queries: Optional[List[Query]] = None):
5451 elif r .status_code == 429 :
5552 return RateLimitResponse (response = r )
5653 else :
57- return ErrorResponse (response = r , response_json = response .json ())
54+ return ErrorResponse (response = r , response_json = r .json ())
55+
56+ def get (self , scope : Scope , queries : Optional [List [Query ]] = None ):
57+ if queries is None or len (queries ) == 0 :
58+ serialized_query = EmptyQuery ().serialize ()
59+ else :
60+ serialized_query = [q .serialize () for q in queries ]
61+ serialized_query = " " .join (serialized_query )
62+ serialized_query = "%s" % serialized_query
63+ url = "%s/search" % self .base_url
64+ r = self .__get (url = url , params = {"scope" : scope .value , "q" : serialized_query })
65+ return r
5866
5967 def get_service (self , queries : Optional [List [Query ]] = None ):
6068 r = self .get (Scope .SERVICE , queries = queries )
@@ -73,18 +81,21 @@ def get_leak(self, queries: Optional[List[Query]] = None):
7381 return r
7482
7583 def get_host (self , ipv4 : str ):
76- url = "%s/host/%s" % (self .BASE_URL , ipv4 )
77- r = requests . get (url , headers = self . headers )
78- if r .status_code == 200 :
84+ url = "%s/host/%s" % (self .base_url , ipv4 )
85+ r = self . __get (url , params = None )
86+ if r .is_success () :
7987 response_json = r .json ()
8088 formatted_result = HostResult .from_dict (response_json )
8189 response_json = {
8290 "services" : formatted_result .Services ,
8391 "leaks" : formatted_result .Leaks ,
8492 }
85- return SuccessResponse (response = r , response_json = response_json )
86- elif r .status_code == 429 :
87- return RateLimitResponse (response = r )
88- else :
89- response_json = r .json ()
90- return ErrorResponse (response = r , response_json = response_json )
93+ r .response_json = response_json
94+ return r
95+
96+ def get_plugins (self ):
97+ url = "%s/api/plugins" % (self .base_url )
98+ r = self .__get (url , params = None )
99+ if r .is_success ():
100+ r .response_json = [APIResult .from_dict (d ) for d in r .json ()]
101+ return r
0 commit comments