7
7
class Jokes :
8
8
def __init__ (self ):
9
9
self .http = urllib3 .PoolManager ()
10
+ self .info = self .http .request ('GET' , "https://sv443.net/jokeapi/v2/info" )
11
+ self .info = data = json .loads (self .info .data .decode ('utf-8' ))["jokes" ]
12
+ print (self .info )
10
13
print ("Sv443's JokeAPI" )
11
14
12
15
def build_request (
@@ -17,42 +20,40 @@ def build_request(
17
20
type = None ,
18
21
search_string = None ,
19
22
id_range = None ,
23
+ amount = 1 ,
24
+ lang = "en"
20
25
):
21
26
r = "https://sv443.net/jokeapi/v2/joke/"
22
27
23
- if len (category ) > 0 :
28
+ if len (category ):
24
29
for c in category :
25
- if not c .lower () in [ "programming" , "miscellaneous" , "dark " ]:
30
+ if not c .lower () in self . info [ "categories " ]:
26
31
raise ValueError (
27
- '''Invalid category selected. Available categories are:
32
+ f'''Invalid category selected.
33
+ You selected { c } .
34
+ Available categories are:
28
35
"programming"
29
36
"miscellaneous"
30
- "dark".
37
+ "dark"
38
+ "pun".
31
39
Leave blank for any.'''
32
40
)
33
- return
41
+
34
42
cats = "," .join (category )
35
43
else :
36
44
cats = "Any"
37
45
38
46
if len (blacklist ) > 0 :
39
47
for b in blacklist :
40
- if b not in [
41
- "nsfw" ,
42
- "religious" ,
43
- "political" ,
44
- "racist" ,
45
- "sexist"
46
- ]:
48
+ if b not in self .info ["flags" ]:
47
49
raise ValueError (
48
- '''\n \n
49
- You have blacklisted flags which are not available or you have not put the flags in an array.
50
+ f'''
51
+
52
+
53
+ You have blacklisted flags which are not available or you have not put the flags in a list.
50
54
Available flags are:
51
- "racist"
52
- "religious"
53
- "political"
54
- "sexist"
55
- "nsfw"
55
+ { """
56
+ """ .join (self .info ["flags" ])}
56
57
'''
57
58
)
58
59
return
@@ -81,13 +82,7 @@ def build_request(
81
82
else :
82
83
search_string = urllib .parse .quote (search_string )
83
84
if id_range :
84
-
85
- response = self .http .request (
86
- 'GET' ,
87
- "https://sv443.net/jokeapi/v2/info"
88
- )
89
- dict = json .loads (response .data )
90
- range_limit = dict ["jokes" ]["totalCount" ]
85
+ range_limit = self .info ["totalCount" ]
91
86
92
87
if len (id_range ) > 2 :
93
88
raise ValueError ("id_range must be no longer than 2 items." )
@@ -102,45 +97,49 @@ def build_request(
102
97
103
98
r += cats
104
99
105
- prev_flags = None
100
+ r += f"?format= { response_format } "
106
101
107
102
if blacklistFlags :
108
- r += f"?blacklistFlags={ blacklistFlags } "
109
- prev_flags = True
110
- if prev_flags :
111
- r += f"&format={ response_format } "
112
- else :
113
- r += f"?format={ response_format } "
114
- prev_flags = True
115
- if prev_flags :
116
- r += f"&type={ type } "
117
- else :
118
- r += f"?type={ type } "
119
- prev_flags = True
103
+ r += f"&blacklistFlags={ blacklistFlags } "
104
+
105
+
106
+ r += f"&type={ type } "
107
+
120
108
if search_string :
121
- if prev_flags :
122
- r += f"&contains={ search_string } "
123
- prev_flags = True
124
- else :
125
- r += f"?contains={ search_string } "
109
+ r += f"&contains={ search_string } "
126
110
if id_range :
127
- if prev_flags :
128
- r += f"&idRange={ id_range [0 ]} -{ id_range [1 ]} "
129
- else :
130
- r += f"?idRange={ id_range [0 ]} -{ id_range [1 ]} "
111
+ r += f"i&dRange={ id_range [0 ]} -{ id_range [1 ]} "
112
+ if amount > 10 :
113
+ raise ValueError (
114
+ f"amount parameter must be no greater than 10. you passed { amount } ."
115
+ )
116
+ r += f"&amount={ amount } "
117
+
118
+ r += f"&lang={ lang } "
131
119
132
120
return r
133
121
134
- def send_request (self , request , response_format , return_headers , auth_token , user_agent ):
122
+ def send_request (self ,
123
+ request ,
124
+ response_format ,
125
+ return_headers ,
126
+ auth_token ,
127
+ user_agent
128
+ ):
135
129
returns = []
136
130
137
131
if auth_token :
138
- r = self .http .request ('GET' , request , headers = {'Authorization' : str (
139
- auth_token ), 'user-agent' : str (user_agent )})
132
+ r = self .http .request ('GET' ,
133
+ request ,
134
+ headers = {'Authorization' : str (auth_token ),
135
+ 'user-agent' : str (user_agent ),
136
+ #'accept-encoding': 'gzip'
137
+ }
138
+ )
140
139
else :
141
140
r = self .http .request ('GET' , request , headers = {'user-agent' : str (user_agent )})
142
141
143
- data = r .data
142
+ data = r .data . decode ( 'utf-8' )
144
143
145
144
if response_format == "json" :
146
145
try :
@@ -149,7 +148,6 @@ def send_request(self, request, response_format, return_headers, auth_token, use
149
148
print (data )
150
149
raise
151
150
else :
152
- data = str (data )[2 :- 1 ].replace (r'\n' , '\n ' ).replace ('\\ ' , '' )
153
151
if len (' ' .join (re .split ("error" , data .lower ().replace ("\n " , "NEWLINECHAR" ))[0 :][1 :]).replace (
154
152
'<' , '' ).replace ('/' , '' ).replace (' ' , '' ).replace (':' , '' ).replace ('>' , '' ).replace ('NEWLINECHAR' , '\n ' )) == 4 :
155
153
return [Exception (f"API returned an error. Full response: \n \n { data } " )]
@@ -174,12 +172,14 @@ def get_joke(
174
172
type = None ,
175
173
search_string = None ,
176
174
id_range = None ,
175
+ amount = 1 ,
176
+ lang = None ,
177
177
auth_token = None ,
178
178
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0" ,
179
179
return_headers = False
180
180
):
181
181
r = self .build_request (
182
- category , blacklist , response_format , type , search_string , id_range
182
+ category , blacklist , response_format , type , search_string , id_range , amount , lang
183
183
)
184
184
185
185
response = self .send_request (r , response_format , return_headers , auth_token , user_agent )
0 commit comments