newsdataapi 0.1.26__tar.gz → 0.1.27__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.
Files changed (21) hide show
  1. {newsdataapi-0.1.26/newsdataapi.egg-info → newsdataapi-0.1.27}/PKG-INFO +1 -1
  2. {newsdataapi-0.1.26 → newsdataapi-0.1.27}/newsdataapi/constants.py +6 -2
  3. {newsdataapi-0.1.26 → newsdataapi-0.1.27}/newsdataapi/helpers.py +0 -16
  4. newsdataapi-0.1.27/newsdataapi/newsdataapi_client.py +701 -0
  5. {newsdataapi-0.1.26 → newsdataapi-0.1.27/newsdataapi.egg-info}/PKG-INFO +1 -1
  6. {newsdataapi-0.1.26 → newsdataapi-0.1.27}/setup.py +1 -1
  7. {newsdataapi-0.1.26 → newsdataapi-0.1.27}/tests/test_newsdataapi.py +4 -0
  8. newsdataapi-0.1.26/newsdataapi/newsdataapi_client.py +0 -346
  9. {newsdataapi-0.1.26 → newsdataapi-0.1.27}/LICENSE +0 -0
  10. {newsdataapi-0.1.26 → newsdataapi-0.1.27}/MANIFEST.in +0 -0
  11. {newsdataapi-0.1.26 → newsdataapi-0.1.27}/README.md +0 -0
  12. {newsdataapi-0.1.26 → newsdataapi-0.1.27}/newsdataapi/__init__.py +0 -0
  13. {newsdataapi-0.1.26 → newsdataapi-0.1.27}/newsdataapi/newsdataapi_exception.py +0 -0
  14. {newsdataapi-0.1.26 → newsdataapi-0.1.27}/newsdataapi/utils.py +0 -0
  15. {newsdataapi-0.1.26 → newsdataapi-0.1.27}/newsdataapi.egg-info/SOURCES.txt +0 -0
  16. {newsdataapi-0.1.26 → newsdataapi-0.1.27}/newsdataapi.egg-info/dependency_links.txt +0 -0
  17. {newsdataapi-0.1.26 → newsdataapi-0.1.27}/newsdataapi.egg-info/requires.txt +0 -0
  18. {newsdataapi-0.1.26 → newsdataapi-0.1.27}/newsdataapi.egg-info/top_level.txt +0 -0
  19. {newsdataapi-0.1.26 → newsdataapi-0.1.27}/requirements.txt +0 -0
  20. {newsdataapi-0.1.26 → newsdataapi-0.1.27}/setup.cfg +0 -0
  21. {newsdataapi-0.1.26 → newsdataapi-0.1.27}/tests/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: newsdataapi
3
- Version: 0.1.26
3
+ Version: 0.1.27
4
4
  Summary: Python library for newsdata client-API Call
5
5
  Home-page: https://github.com/newsdataapi/python-client
6
6
  Author: NewsData.io
@@ -17,9 +17,13 @@ COUNT_ENDPOINT = 'count'
17
17
 
18
18
  CRYPTO_COUNT_ENDPOINT = 'crypto/count'
19
19
 
20
+ # News Market URL
21
+
22
+ MARKET_ENDPOINT = 'market'
23
+
20
24
  # Default request values
21
25
  DEFAULT_REQUEST_TIMEOUT = 300
22
26
  DEFAULT_MAX_RETRIES = 5
23
27
  DEFAULT_RETRY_DELAY = 1800
24
- DEFAULT_RETRY_DELAY_TooManyRequests = 10
25
- DEFAULT_RETRY_DELAY_RateLimitExceeded = 900
28
+
29
+ PAGINATION_SLEEP = 1
@@ -1,21 +1,5 @@
1
1
  import time,os,csv
2
2
 
3
- def get(request_method, URL, URL_parameters_encoded, proxies, request_timeout):
4
- if proxies is None:
5
- return request_method.get(URL + "?" + URL_parameters_encoded, timeout=request_timeout)
6
- else:
7
- return request_method.get(URL + "?" + URL_parameters_encoded, timeout=request_timeout, proxies = proxies)
8
-
9
- def MaxRetries(response, max_retries, retry_delay, request_method, URL, URL_parameters_encoded, proxies, request_timeout):
10
- while (max_retries):
11
- time.sleep(retry_delay)
12
- response = get(request_method, URL, URL_parameters_encoded, proxies, request_timeout)
13
- if response.status_code!=500:
14
- break
15
- max_retries-=1
16
- return response
17
-
18
-
19
3
  class FileHandler:
20
4
 
21
5
  def __init__(self,folder_path:str=None) -> None:
@@ -0,0 +1,701 @@
1
+ from warnings import warn
2
+ import requests,time,logging
3
+ from typing import Dict, Any, List
4
+ from newsdataapi import constants
5
+ from typing import Optional,Union
6
+ from datetime import datetime,timezone
7
+ from newsdataapi.helpers import FileHandler
8
+ from requests.exceptions import RequestException
9
+ from newsdataapi.newsdataapi_exception import NewsdataException
10
+ from urllib.parse import urlencode, quote,urlparse,parse_qs,urljoin
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+ class NewsDataApiClient(FileHandler):
15
+
16
+ def __init__(
17
+ self,
18
+ apikey: str,
19
+ session: Optional[bool] = False,
20
+ proxies: Optional[Dict[str, Any]] = None,
21
+ max_retries: Optional[int] = constants.DEFAULT_MAX_RETRIES,
22
+ retry_delay: Optional[int] = constants.DEFAULT_RETRY_DELAY,
23
+ request_timeout: Optional[int] = constants.DEFAULT_REQUEST_TIMEOUT,
24
+ max_result: Optional[int] = 10**10,
25
+ max_pages: Optional[int] = 10**10,
26
+ debug: Optional[bool] = False,
27
+ folder_path: Optional[str] = None,
28
+ include_headers: Optional[bool] = False
29
+ ) -> None:
30
+ """Initializes newsdata client object for access Newsdata APIs."""
31
+ self.apikey = apikey
32
+ self.request_method:requests = requests if session == False else requests.Session()
33
+ self.max_result = max_result
34
+ self.max_pages = max_pages
35
+ self.max_retries = max_retries
36
+ self.retry_delay = retry_delay
37
+ self.proxies = proxies
38
+ self.request_timeout = request_timeout
39
+ # self.is_debug = debug
40
+ self.include_headers = include_headers
41
+ self.set_base_url()
42
+ super().__init__(folder_path=folder_path)
43
+
44
+ def set_base_url(self,new_base_url:Optional[str]=constants.BASE_URL)->None:
45
+ self.latest_url = urljoin(new_base_url,constants.LATEST_ENDPOINT)
46
+ self.archive_url = urljoin(new_base_url,constants.ARCHIVE_ENDPOINT)
47
+ self.crypto_url = urljoin(new_base_url,constants.CRYPTO_ENDPOINT)
48
+ self.sources_url = urljoin(new_base_url,constants.SOURCES_ENDPOINT)
49
+ self.count_url = urljoin(new_base_url,constants.COUNT_ENDPOINT)
50
+ self.crypto_count_url = urljoin(new_base_url,constants.CRYPTO_COUNT_ENDPOINT)
51
+ self.market_url = urljoin(new_base_url,constants.MARKET_ENDPOINT)
52
+
53
+ def set_retries( self, max_retries:int, retry_delay:int)->None:
54
+ """ API maximum retry and delay"""
55
+ self.max_retries = max_retries
56
+ self.retry_delay = retry_delay
57
+
58
+ def set_request_timeout( self, request_timeout:int)->None:
59
+ """ API maximum timeout for the request """
60
+ self.request_timeout = request_timeout
61
+
62
+ def get_current_dt(self)->str:
63
+ return datetime.now(tz=timezone.utc).replace(microsecond=0).strftime("%Y-%m-%d %H:%M:%S")
64
+
65
+ def api_proxies( self, proxies:dict)->None:
66
+ """ Configure Proxie dictionary """
67
+ self.proxies = proxies
68
+
69
+ def __validate_parms(self, user_param: Dict[str, Any]) -> Dict[str, Any]:
70
+ bool_params = {'full_content','image','video','removeduplicate'}
71
+ int_params = {'size'}
72
+ string_params = {
73
+ 'q','qInTitle','country','category','language','domain','domainurl','excludedomain','timezone','page',
74
+ 'from_date','to_date','qInMeta','prioritydomain','timeframe','tag','sentiment','region','coin',
75
+ 'excludefield','excludecategory','id','excludelanguage','organization','url','sort','symbol','webhook',
76
+ }
77
+
78
+ def validate_url(url:str)-> str:
79
+ valid_fn_parms = {k.lower() for k in user_param.keys()}
80
+ parsed_url = urlparse(url)
81
+ if parsed_url.netloc:
82
+ q_string = parse_qs(parsed_url.query)
83
+ else:
84
+ q_string = parse_qs(url)
85
+
86
+ valid_q_string = {}
87
+ for k,v in q_string.items():
88
+ k = k.strip().strip('%').strip('?').lower()
89
+ if k in valid_fn_parms:
90
+ valid_q_string[k] = v[0]
91
+ else:
92
+ raise TypeError(f'Provided parameter is invalid: {k}')
93
+
94
+ return valid_q_string
95
+
96
+ if user_param.get('raw_query'):
97
+ value = user_param['raw_query']
98
+ if not isinstance(value,str):
99
+ raise TypeError('raw_query should be of type string.')
100
+ return validate_url(url=value)
101
+
102
+ valid_parms = {}
103
+ for param,value in user_param.items():
104
+ if value is None:
105
+ continue
106
+
107
+ if param in string_params:
108
+ if isinstance(value,list):
109
+ value = ','.join(value)
110
+ if not isinstance(value,str):
111
+ raise TypeError(f'{param} should be of type string.')
112
+ elif param in bool_params:
113
+ if not isinstance(value,bool):
114
+ raise TypeError(f'{param} should be of type bool.')
115
+ value = 1 if value == True else 0
116
+ elif param in int_params:
117
+ if not isinstance(value,int):
118
+ raise TypeError(f'{param} should be of type int.')
119
+
120
+ valid_parms[param] = value
121
+
122
+ return valid_parms
123
+
124
+ def __get_feeds(self, endpoint: str, query_params: dict) -> Dict[str, Any]:
125
+ retry_count = 0
126
+ while retry_count <= self.max_retries:
127
+ retry_count += 1
128
+ try:
129
+ s_time = time.perf_counter()
130
+ params = query_params.copy()
131
+ params['apikey'] = self.apikey
132
+ url = f"{endpoint}?{urlencode(params, quote_via=quote)}"
133
+
134
+ logger.info(f"Fetching data from URL: {url}")
135
+ response = self.request_method.get(url=url, proxies=self.proxies, timeout=self.request_timeout)
136
+ logger.info(f"Time taken to fetch data: {time.perf_counter() - s_time:.2f} seconds")
137
+
138
+ X_API_Limit_Remaining = response.headers.get("X-API-Limit-Remaining")
139
+ X_RateLimit_Remaining = response.headers.get("X-RateLimit-Remaining")
140
+ logger.info(f"X-API-Limit-Remaining: {X_API_Limit_Remaining}, X-RateLimit-Remaining: {X_RateLimit_Remaining}")
141
+
142
+ try:
143
+ feeds_data: dict = response.json()
144
+ except:
145
+ raise NewsdataException(f"Invalid JSON response: {response.text[:200]}")
146
+
147
+ if self.include_headers:
148
+ feeds_data['response_headers'] = dict(response.headers)
149
+
150
+ if response.status_code == 200 and feeds_data.get('status') == 'success':
151
+ return feeds_data
152
+
153
+ elif response.status_code == 500:
154
+ logger.error(f"Encountered 'ServerError' - sleeping for {self.retry_delay}s. (Attempt {retry_count}/{self.max_retries})")
155
+ time.sleep(self.retry_delay)
156
+ continue
157
+
158
+ elif response.status_code == 429:
159
+ Retry_After = int(response.headers.get("Retry-After", self.retry_delay))
160
+ logger.error(f"Rate limit exceeded - sleeping for {Retry_After}s. (Attempt {retry_count}/{self.max_retries})")
161
+ time.sleep(Retry_After)
162
+ continue
163
+
164
+ else:
165
+ msg = f"Unexpected response {response.status_code}: {response.text[:200]}"
166
+ raise NewsdataException(msg)
167
+
168
+ except RequestException as e:
169
+ logger.error(f"ConnectionError on attempt {retry_count}/{self.max_retries}: {e}. Sleeping {self.retry_delay}s.")
170
+ time.sleep(self.retry_delay)
171
+
172
+ raise NewsdataException(f"Maximum retry limit reached: {self.max_retries}.")
173
+
174
+ def __get_feeds_all(self, endpoint:str,query_params:dict, max_result: Optional[int] = None) -> Dict[str, Any]:
175
+
176
+ if max_result is None:
177
+ max_result = self.max_result
178
+
179
+ self.request_method = requests.Session()
180
+
181
+ data = {'totalResults':None,'results':[],'nextPage':None}
182
+ while True:
183
+ response:dict = self.__get_feeds(endpoint=endpoint,query_params=query_params)
184
+ data['totalResults'] = response.get('totalResults')
185
+ data['results'].extend(response.get('results',[]))
186
+ data['nextPage'] = response.get('nextPage')
187
+
188
+ query_params['page'] = data['nextPage']
189
+
190
+ if self.include_headers:
191
+ data['response_headers'] = response.get('response_headers')
192
+
193
+ logger.info(f"Total results: {data['totalResults']} | Extracted: {len(data['results'])}")
194
+
195
+ if not data['nextPage']:
196
+ return data
197
+
198
+ if max_result and len(data['results']) >= max_result:
199
+ return data
200
+
201
+ time.sleep(constants.PAGINATION_SLEEP)
202
+
203
+ def __paginate_results(self,endpoint:str,query_params:dict,max_pages: Optional[int] = None):
204
+ if max_pages is None:
205
+ max_pages = self.max_pages
206
+
207
+ self.request_method = requests.Session()
208
+ current_result_count = 0
209
+ page = 0
210
+ while True:
211
+ response = self.__get_feeds(endpoint=endpoint,query_params=query_params)
212
+ if response['status'] == 'success':
213
+ current_result_count += len(response['results'])
214
+ page += 1
215
+ logger.info(f"Total result: {response['totalResults']}, Current result count: {current_result_count}, Page: {page}")
216
+ yield response
217
+
218
+ if page >= max_pages:
219
+ logger.info(f"Reached maximum page limit: {max_pages}, ending pagination.")
220
+ return
221
+
222
+ if response['nextPage'] is None:
223
+ logger.info("No more pages to fetch, ending pagination.")
224
+ return
225
+
226
+ query_params['page'] = response['nextPage']
227
+ time.sleep(constants.PAGINATION_SLEEP)
228
+
229
+ def news_api(
230
+ self,
231
+ q:Optional[str]=None,
232
+ qInTitle:Optional[str]=None,
233
+ country:Optional[Union[str, List[str]]]=None,
234
+ category:Optional[Union[str, List[str]]]=None,
235
+ language:Optional[Union[str, List[str]]]=None,
236
+ domain:Optional[Union[str, List[str]]]=None,
237
+ timeframe:Optional[Union[int, str]]=None,
238
+ size:Optional[int]=None,
239
+ domainurl:Optional[Union[str, List[str]]]=None,
240
+ excludedomain:Optional[Union[str, List[str]]]=None,
241
+ timezone:Optional[str]=None,
242
+ full_content:Optional[bool]=None,
243
+ image:Optional[bool]=None,
244
+ video:Optional[bool]=None,
245
+ prioritydomain:Optional[str]=None,
246
+ page:Optional[str]=None,
247
+ scroll:Optional[bool]=False,
248
+ max_result:Optional[int]=None,
249
+ qInMeta:Optional[str]=None,
250
+ tag:Optional[Union[str, List[str]]]=None,
251
+ sentiment:Optional[str]=None,
252
+ region:Optional[Union[str, List[str]]]=None,
253
+ excludefield:Optional[Union[str, List[str]]]=None,
254
+ removeduplicate:Optional[bool]=None,
255
+ raw_query:Optional[str]=None
256
+ )->dict:
257
+ """
258
+ Sending GET request to the news api.
259
+ For more information about parameters and input, Please visit our documentation page: https://newsdata.io/documentation
260
+ """
261
+ warn('This method is deprecated and will be removed in upcoming updates, Instead use latest_api()', DeprecationWarning, stacklevel=2)
262
+ params = {
263
+ 'q':q,
264
+ 'qInTitle':qInTitle,
265
+ 'country':country,
266
+ 'category':category,
267
+ 'language':language,
268
+ 'domain':domain,
269
+ 'timeframe':str(timeframe) if timeframe else timeframe,
270
+ 'size':size,
271
+ 'domainurl':domainurl,
272
+ 'excludedomain':excludedomain,
273
+ 'timezone':timezone,
274
+ 'full_content':full_content,
275
+ 'image':image,
276
+ 'video':video,
277
+ 'prioritydomain':prioritydomain,
278
+ 'page':page,
279
+ 'qInMeta':qInMeta,
280
+ 'tag':tag,
281
+ 'sentiment':sentiment,
282
+ 'region':region,
283
+ 'excludefield':excludefield,
284
+ 'removeduplicate':removeduplicate,
285
+ 'raw_query':raw_query
286
+ }
287
+ URL_parameters = self.__validate_parms(user_param=params)
288
+ if scroll:
289
+ return self.__get_feeds_all(endpoint=self.latest_url,query_params=URL_parameters,max_result=max_result)
290
+ else:
291
+ return self.__get_feeds(endpoint=self.latest_url,query_params=URL_parameters)
292
+
293
+ def latest_api(
294
+ self,
295
+ q: Optional[str] = None,
296
+ qInTitle: Optional[str] = None,
297
+ qInMeta: Optional[str] = None,
298
+ country: Optional[Union[str, List[str]]] = None,
299
+ category: Optional[Union[str, List[str]]] = None,
300
+ language: Optional[Union[str, List[str]]] = None,
301
+ domain: Optional[Union[str, List[str]]] = None,
302
+ domainurl: Optional[Union[str, List[str]]] = None,
303
+ prioritydomain: Optional[str] = None,
304
+ excludedomain: Optional[Union[str, List[str]]] = None,
305
+ timeframe: Optional[Union[int, str]] = None,
306
+ size: Optional[int] = None,
307
+ timezone: Optional[str] = None,
308
+ full_content: Optional[bool] = None,
309
+ image: Optional[bool] = None,
310
+ video: Optional[bool] = None,
311
+ page: Optional[str] = None,
312
+ tag: Optional[Union[str, List[str]]] = None,
313
+ sentiment: Optional[str] = None,
314
+ region: Optional[Union[str, List[str]]] = None,
315
+ excludefield: Optional[Union[str, List[str]]] = None,
316
+ removeduplicate: Optional[bool] = None,
317
+ excludecategory: Optional[Union[str, List[str]]] = None,
318
+ id: Optional[str] = None,
319
+ excludelanguage: Optional[Union[str, List[str]]] = None,
320
+ organization: Optional[str] = None,
321
+ url: Optional[str] = None,
322
+ sort: Optional[str] = None,
323
+
324
+ raw_query: Optional[str] = None,
325
+ max_result: Optional[int] = None,
326
+ scroll: Optional[bool] = False,
327
+ paginate: Optional[bool] = False,
328
+ max_pages: Optional[int] = None,
329
+ ) -> Dict[str, Any]:
330
+ """
331
+ Sending GET request to the latest api.
332
+ For more information about parameters and input, Please visit our documentation page: https://newsdata.io/documentation
333
+ """
334
+ params = {
335
+ 'q':q,
336
+ 'qInTitle':qInTitle,
337
+ 'country':country,
338
+ 'category':category,
339
+ 'language':language,
340
+ 'domain':domain,
341
+ 'timeframe':str(timeframe) if timeframe else timeframe,
342
+ 'size':size,
343
+ 'domainurl':domainurl,
344
+ 'excludedomain':excludedomain,
345
+ 'timezone':timezone,
346
+ 'full_content':full_content,
347
+ 'image':image,
348
+ 'video':video,
349
+ 'prioritydomain':prioritydomain,
350
+ 'page':page,
351
+ 'qInMeta':qInMeta,
352
+ 'tag':tag,
353
+ 'sentiment':sentiment,
354
+ 'region':region,
355
+ 'excludefield':excludefield,
356
+ 'removeduplicate':removeduplicate,
357
+ 'raw_query':raw_query,
358
+ 'excludecategory':excludecategory,
359
+ 'id':id,
360
+ 'excludelanguage':excludelanguage,
361
+ 'organization':organization,
362
+ 'url':url,
363
+ 'sort':sort
364
+ }
365
+ if scroll and paginate:
366
+ raise NewsdataException("Both 'scroll' and 'paginate' cannot be True at the same time.")
367
+
368
+ URL_parameters = self.__validate_parms(user_param=params)
369
+ if scroll:
370
+ return self.__get_feeds_all(endpoint=self.latest_url,query_params=URL_parameters,max_result=max_result)
371
+ elif paginate:
372
+ return self.__paginate_results(endpoint=self.latest_url,query_params=URL_parameters,max_pages=max_pages)
373
+ else:
374
+ return self.__get_feeds(endpoint=self.latest_url,query_params=URL_parameters)
375
+
376
+ def archive_api(
377
+ self,
378
+ q: Optional[str] = None,
379
+ qInTitle: Optional[str] = None,
380
+ country: Optional[Union[str, List[str]]] = None,
381
+ category: Optional[Union[str, List[str]]] = None,
382
+ language: Optional[Union[str, List[str]]] = None,
383
+ domain: Optional[Union[str, List[str]]] = None,
384
+ size: Optional[int] = None,
385
+ domainurl: Optional[Union[str, List[str]]] = None,
386
+ excludedomain: Optional[Union[str, List[str]]] = None,
387
+ timezone: Optional[str] = None,
388
+ full_content: Optional[bool] = None,
389
+ image: Optional[bool] = None,
390
+ video: Optional[bool] = None,
391
+ prioritydomain: Optional[str] = None,
392
+ page: Optional[str] = None,
393
+ from_date: Optional[str] = None,
394
+ to_date: Optional[str] = None,
395
+ qInMeta: Optional[str] = None,
396
+ excludefield: Optional[Union[str, List[str]]] = None,
397
+ excludecategory: Optional[Union[str, List[str]]] = None,
398
+ id: Optional[str] = None,
399
+ excludelanguage: Optional[Union[str, List[str]]] = None,
400
+ url: Optional[str] = None,
401
+ sort: Optional[str] = None,
402
+
403
+ raw_query: Optional[str] = None,
404
+ scroll: Optional[bool] = False,
405
+ max_result: Optional[int] = None,
406
+ paginate: Optional[bool] = False,
407
+ max_pages: Optional[int] = None,
408
+ ) -> Dict[str, Any]:
409
+ """
410
+ Sending GET request to the archive api
411
+ For more information about parameters and input, Please visit our documentation page: https://newsdata.io/documentation
412
+ """
413
+ params = {
414
+ 'q':q,
415
+ 'qInTitle':qInTitle,
416
+ 'country':country,
417
+ 'category':category,
418
+ 'language':language,
419
+ 'domain':domain,
420
+ 'size':size,
421
+ 'domainurl':domainurl,
422
+ 'excludedomain':excludedomain,
423
+ 'timezone':timezone,
424
+ 'full_content':full_content,
425
+ 'image':image,
426
+ 'video':video,
427
+ 'prioritydomain':prioritydomain,
428
+ 'page':page,
429
+ 'from_date':from_date,
430
+ 'to_date':to_date,
431
+ 'qInMeta':qInMeta,
432
+ 'excludefield':excludefield,
433
+ 'raw_query':raw_query,
434
+ 'excludecategory':excludecategory,
435
+ 'id':id,
436
+ 'excludelanguage':excludelanguage,
437
+ 'url':url,
438
+ 'sort':sort
439
+ }
440
+ if scroll and paginate:
441
+ raise NewsdataException("Both 'scroll' and 'paginate' cannot be True at the same time.")
442
+
443
+ URL_parameters = self.__validate_parms(user_param=params)
444
+ if scroll:
445
+ return self.__get_feeds_all(endpoint=self.archive_url,query_params=URL_parameters,max_result=max_result)
446
+ elif paginate:
447
+ return self.__paginate_results(endpoint=self.archive_url,query_params=URL_parameters,max_pages=max_pages)
448
+ else:
449
+ return self.__get_feeds(endpoint=self.archive_url,query_params=URL_parameters)
450
+
451
+ def sources_api(
452
+ self,
453
+ country: Optional[Union[str, List[str]]]= None,
454
+ category: Optional[Union[str, List[str]]] = None,
455
+ language: Optional[Union[str, List[str]]] = None,
456
+ prioritydomain: Optional[str] = None,
457
+ domainurl: Optional[Union[str, List[str]]] = None,
458
+
459
+ raw_query: Optional[str] = None
460
+ ) -> Dict[str, Any]:
461
+ """
462
+ Sending GET request to the sources api
463
+ For more information about parameters and input, Please visit our documentation page: https://newsdata.io/documentation
464
+ """
465
+ params = {
466
+ 'country':country,
467
+ 'category':category,
468
+ 'language':language,
469
+ 'prioritydomain':prioritydomain,
470
+ 'domainurl':domainurl,
471
+ 'raw_query':raw_query
472
+ }
473
+ URL_parameters = self.__validate_parms(user_param=params)
474
+ return self.__get_feeds(endpoint=self.sources_url,query_params=URL_parameters)
475
+
476
+ def crypto_api(
477
+ self,
478
+ q: Optional[str] = None,
479
+ qInTitle: Optional[str] = None,
480
+ language: Optional[Union[str, List[str]]] = None,
481
+ domain: Optional[Union[str, List[str]]] = None,
482
+ timeframe: Optional[Union[int, str]] = None,
483
+ size: Optional[int] = None,
484
+ domainurl: Optional[Union[str, List[str]]] = None,
485
+ excludedomain: Optional[Union[str, List[str]]] = None,
486
+ timezone: Optional[str] = None,
487
+ full_content: Optional[bool] = None,
488
+ image: Optional[bool] = None,
489
+ video: Optional[bool] = None,
490
+ prioritydomain: Optional[str] = None,
491
+ page: Optional[str] = None,
492
+ qInMeta: Optional[str] = None,
493
+ tag: Optional[Union[str, List[str]]] = None,
494
+ sentiment: Optional[str] = None,
495
+ coin: Optional[Union[str, List[str]]] = None,
496
+ excludefield: Optional[Union[str, List[str]]] = None,
497
+ from_date: Optional[str] = None,
498
+ to_date: Optional[str] = None,
499
+ removeduplicate: Optional[bool] = None,
500
+ raw_query: Optional[str] = None,
501
+ id: Optional[str] = None,
502
+ excludelanguage: Optional[Union[str, List[str]]] = None,
503
+ url: Optional[str] = None,
504
+ sort: Optional[str] = None,
505
+
506
+ scroll: Optional[bool] = False,
507
+ max_result: Optional[int] = None,
508
+ paginate: Optional[bool] = False,
509
+ max_pages: Optional[int] = None,
510
+ ) -> Dict[str, Any]:
511
+ """
512
+ Sending GET request to the crypto api
513
+ For more information about parameters and input, Please visit our documentation page: https://newsdata.io/documentation
514
+ """
515
+
516
+ params = {
517
+ 'q':q,
518
+ 'qInTitle':qInTitle,
519
+ 'language':language,
520
+ 'domain':domain,
521
+ 'size':size,
522
+ 'domainurl':domainurl,
523
+ 'excludedomain':excludedomain,
524
+ 'timezone':timezone,
525
+ 'full_content':full_content,
526
+ 'image':image,
527
+ 'video':video,
528
+ 'prioritydomain':prioritydomain,
529
+ 'page':page,
530
+ 'timeframe':str(timeframe) if timeframe else timeframe,
531
+ 'qInMeta':qInMeta,
532
+ 'tag':tag,
533
+ 'sentiment':sentiment,
534
+ 'coin':coin,
535
+ 'excludefield':excludefield,
536
+ 'from_date':from_date,
537
+ 'to_date':to_date,
538
+ 'removeduplicate':removeduplicate,
539
+ 'raw_query':raw_query,
540
+ 'id':id,
541
+ 'excludelanguage':excludelanguage,
542
+ 'url':url,
543
+ 'sort':sort
544
+ }
545
+ if scroll and paginate:
546
+ raise NewsdataException("Both 'scroll' and 'paginate' cannot be True at the same time.")
547
+
548
+ URL_parameters = self.__validate_parms(user_param=params)
549
+ if scroll:
550
+ return self.__get_feeds_all(endpoint=self.crypto_url,query_params=URL_parameters,max_result=max_result)
551
+ elif paginate:
552
+ return self.__paginate_results(endpoint=self.crypto_url,query_params=URL_parameters,max_pages=max_pages)
553
+ else:
554
+ return self.__get_feeds(endpoint=self.crypto_url,query_params=URL_parameters)
555
+
556
+ def count_api(
557
+ self,
558
+ q: Optional[str] = None,
559
+ qInTitle: Optional[str] = None,
560
+ qInMeta: Optional[str] = None,
561
+ country: Optional[Union[str, List[str]]] = None,
562
+ category: Optional[Union[str, List[str]]] = None,
563
+ language: Optional[Union[str, List[str]]] = None,
564
+ from_date: Optional[str] = None,
565
+ to_date: Optional[str] = None,
566
+
567
+ raw_query: Optional[str] = None,
568
+ ) -> Dict[str, Any]:
569
+ """
570
+ Sending GET request to the count api
571
+ For more information about parameters and input, Please visit our documentation page: https://newsdata.io/documentation
572
+ """
573
+ params = {
574
+ 'q':q,
575
+ 'qInTitle':qInTitle,
576
+ 'country':country,
577
+ 'category':category,
578
+ 'language':language,
579
+ 'from_date':from_date,
580
+ 'to_date':to_date,
581
+ 'qInMeta':qInMeta,
582
+ 'raw_query':raw_query
583
+ }
584
+ URL_parameters = self.__validate_parms(user_param=params)
585
+ return self.__get_feeds(endpoint=self.count_url,query_params=URL_parameters)
586
+
587
+ def crypto_count_api(
588
+ self,
589
+ q: Optional[str] = None,
590
+ qInTitle: Optional[str] = None,
591
+ qInMeta: Optional[str] = None,
592
+ language: Optional[Union[str, List[str]]] = None,
593
+ from_date: Optional[str] = None,
594
+ to_date: Optional[str] = None,
595
+ coin: Optional[Union[str, List[str]]] = None,
596
+
597
+ raw_query: Optional[str] = None,
598
+ ) -> Dict[str, Any]:
599
+ """
600
+ Sending GET request to the crypto count api
601
+ For more information about parameters and input, Please visit our documentation page: https://newsdata.io/documentation
602
+ """
603
+ params = {
604
+ 'q':q,
605
+ 'qInTitle':qInTitle,
606
+ 'language':language,
607
+ 'from_date':from_date,
608
+ 'to_date':to_date,
609
+ 'coin':coin,
610
+ 'qInMeta':qInMeta,
611
+ 'raw_query':raw_query
612
+ }
613
+ URL_parameters = self.__validate_parms(user_param=params)
614
+ return self.__get_feeds(endpoint=self.crypto_count_url,query_params=URL_parameters)
615
+
616
+ def market_api(
617
+ self,
618
+ q: Optional[str] = None,
619
+ qInTitle: Optional[str] = None,
620
+ qInMeta: Optional[str] = None,
621
+ from_date: Optional[str] = None,
622
+ to_date: Optional[str] = None,
623
+ domain: Optional[str] = None,
624
+ language: Optional[Union[str, List[str]]] = None,
625
+ page: Optional[str] = None,
626
+ full_content: Optional[bool] = None,
627
+ image: Optional[bool] = None,
628
+ video: Optional[bool] = None,
629
+ timeframe: Optional[Union[int, str]] = None,
630
+ prioritydomain: Optional[str] = None,
631
+ timezone: Optional[str] = None,
632
+ size: Optional[int] = None,
633
+ domainurl: Optional[Union[str, List[str]]] = None,
634
+ excludedomain: Optional[Union[str, List[str]]] = None,
635
+ tag: Optional[Union[str, List[str]]] = None,
636
+ sentiment: Optional[str] = None,
637
+ id: Optional[str] = None,
638
+ excludefield: Optional[Union[str, List[str]]] = None,
639
+ removeduplicate: Optional[bool] = None,
640
+ webhook: Optional[str] = None,
641
+ excludelanguage: Optional[Union[str, List[str]]] = None,
642
+ organization: Optional[str] = None,
643
+ url: Optional[str] = None,
644
+ sort: Optional[str] = None,
645
+ symbol: Optional[str] = None,
646
+ country: Optional[Union[str, List[str]]] = None,
647
+
648
+ max_result: Optional[int] = None,
649
+ scroll: Optional[bool] = False,
650
+ paginate: Optional[bool] = False,
651
+ max_pages: Optional[int] = None,
652
+ ) -> Dict[str, Any]:
653
+ """
654
+ Sending GET request to the market api
655
+ For more information about parameters and input, Please visit our documentation page: https://newsdata.io/documentation
656
+ """
657
+ params = {
658
+ 'domain': domain,
659
+ 'language': language,
660
+ 'page': page,
661
+ 'q': q,
662
+ 'qInTitle': qInTitle,
663
+ 'qInMeta': qInMeta,
664
+ 'from_date': from_date,
665
+ 'to_date': to_date,
666
+ 'full_content': full_content,
667
+ 'image': image,
668
+ 'video': video,
669
+ 'timeframe': str(timeframe) if timeframe else timeframe,
670
+ 'prioritydomain': prioritydomain,
671
+ 'timezone': timezone,
672
+ 'size': size,
673
+ 'domainurl': domainurl,
674
+ 'excludedomain': excludedomain,
675
+ 'tag': tag,
676
+ 'sentiment': sentiment,
677
+ 'id': id,
678
+ 'excludefield': excludefield,
679
+ 'removeduplicate': removeduplicate,
680
+ 'webhook': webhook,
681
+ 'excludelanguage': excludelanguage,
682
+ 'organization': organization,
683
+ 'url': url,
684
+ 'sort': sort,
685
+ 'symbol': symbol,
686
+ 'country': country
687
+ }
688
+ if scroll and paginate:
689
+ raise NewsdataException("Both 'scroll' and 'paginate' cannot be True at the same time.")
690
+
691
+ URL_parameters = self.__validate_parms(user_param=params)
692
+ if scroll:
693
+ return self.__get_feeds_all(endpoint=self.market_url,query_params=URL_parameters,max_result=max_result)
694
+ elif paginate:
695
+ return self.__paginate_results(endpoint=self.market_url,query_params=URL_parameters,max_pages=max_pages)
696
+ else:
697
+ return self.__get_feeds(endpoint=self.market_url,query_params=URL_parameters)
698
+
699
+ def __del__(self):
700
+ if isinstance(self.request_method,requests.Session):
701
+ self.request_method.close()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: newsdataapi
3
- Version: 0.1.26
3
+ Version: 0.1.27
4
4
  Summary: Python library for newsdata client-API Call
5
5
  Home-page: https://github.com/newsdataapi/python-client
6
6
  Author: NewsData.io
@@ -6,7 +6,7 @@ with open("README.md", "r") as fh:
6
6
 
7
7
  setup(
8
8
  name='newsdataapi',
9
- version='0.1.26',
9
+ version='0.1.27',
10
10
  packages=['newsdataapi'],
11
11
  description='Python library for newsdata client-API Call',
12
12
  long_description=long_description,
@@ -39,3 +39,7 @@ class test_newsdataapi(unittest.TestCase):
39
39
  def test_crypto_count_api(self):
40
40
  response = self.api.crypto_count_api(q='bitcoin',language='en')
41
41
  self.assertEqual(response['status'], "success")
42
+
43
+ def test_market_api(self):
44
+ response = self.api.market_api()
45
+ self.assertEqual(response['status'], "success")
@@ -1,346 +0,0 @@
1
- import requests,time
2
- from warnings import warn
3
- from newsdataapi import constants
4
- from typing import Optional,Union
5
- from datetime import datetime,timezone
6
- from newsdataapi.helpers import FileHandler
7
- from requests.exceptions import RequestException
8
- from newsdataapi.newsdataapi_exception import NewsdataException
9
- from urllib.parse import urlencode, quote,urlparse,parse_qs,urljoin
10
-
11
- class NewsDataApiClient(FileHandler):
12
-
13
- def __init__(
14
- self, apikey:str, session:bool= False, max_retries:int= constants.DEFAULT_MAX_RETRIES, retry_delay:int= constants.DEFAULT_RETRY_DELAY,
15
- proxies:Optional[dict]=None, request_timeout:int= constants.DEFAULT_REQUEST_TIMEOUT,max_result:int=10**10, debug:Optional[bool]=False,
16
- folder_path:str=None,include_headers:bool=False
17
- ):
18
- """Initializes newsdata client object for access Newsdata APIs."""
19
- self.apikey = apikey
20
- self.request_method:requests = requests if session == False else requests.Session()
21
- self.max_result = max_result
22
- self.max_retries = max_retries
23
- self.retry_delay = retry_delay
24
- self.proxies = proxies
25
- self.request_timeout = request_timeout
26
- self.is_debug = debug
27
- self.include_headers = include_headers
28
- self.set_base_url()
29
- super().__init__(folder_path=folder_path)
30
-
31
- def set_base_url(self,new_base_url:str=constants.BASE_URL)->None:
32
- self.latest_url = urljoin(new_base_url,constants.LATEST_ENDPOINT)
33
- self.archive_url = urljoin(new_base_url,constants.ARCHIVE_ENDPOINT)
34
- self.crypto_url = urljoin(new_base_url,constants.CRYPTO_ENDPOINT)
35
- self.sources_url = urljoin(new_base_url,constants.SOURCES_ENDPOINT)
36
- self.count_url = urljoin(new_base_url,constants.COUNT_ENDPOINT)
37
- self.crypto_count_url = urljoin(new_base_url,constants.CRYPTO_COUNT_ENDPOINT)
38
-
39
- def set_retries( self, max_retries:int, retry_delay:int)->None:
40
- """ API maximum retry and delay"""
41
- self.max_retries = max_retries
42
- self.retry_delay = retry_delay
43
-
44
- def set_request_timeout( self, request_timeout:int)->None:
45
- """ API maximum timeout for the request """
46
- self.request_timeout = request_timeout
47
-
48
- def get_current_dt(self)->str:
49
- return datetime.now(tz=timezone.utc).replace(microsecond=0).strftime("%Y-%m-%d %H:%M:%S")
50
-
51
- def api_proxies( self, proxies:dict)->None:
52
- """ Configure Proxie dictionary """
53
- self.proxies = proxies
54
-
55
- def __validate_parms(self,user_param:dict)->dict:
56
- bool_params = {'full_content','image','video','removeduplicate'}
57
- int_params = {'size'}
58
- string_params = {
59
- 'q','qInTitle','country','category','language','domain','domainurl','excludedomain','timezone','page',
60
- 'from_date','to_date','apikey','qInMeta','prioritydomain','timeframe','tag','sentiment','region','coin',
61
- 'excludefield','excludecategory','id'
62
- }
63
-
64
- def validate_url(url:str)-> str:
65
- valid_fn_parms = {k.lower() for k in user_param.keys()}
66
- parsed_url = urlparse(url)
67
- if parsed_url.netloc:
68
- q_string = parse_qs(parsed_url.query)
69
- else:
70
- q_string = parse_qs(url)
71
-
72
- valid_q_string = {}
73
- for k,v in q_string.items():
74
- k = k.strip().strip('%').strip('?').lower()
75
- if k in valid_fn_parms:
76
- valid_q_string[k] = v[0]
77
- else:
78
- raise TypeError(f'Provided parameter is invalid: {k}')
79
-
80
- if not valid_q_string.get('apikey'):
81
- valid_q_string['apikey'] = self.apikey
82
-
83
- return valid_q_string
84
-
85
- if user_param.get('raw_query'):
86
- value = user_param['raw_query']
87
- if not isinstance(value,str):
88
- raise TypeError('raw_query should be of type string.')
89
- return validate_url(url=value)
90
-
91
- valid_parms = {}
92
- for param,value in user_param.items():
93
- if not value:continue
94
- if param in string_params:
95
- if isinstance(value,list):
96
- value = ','.join(value)
97
- if not isinstance(value,str):
98
- raise TypeError(f'{param} should be of type string.')
99
- elif param in bool_params:
100
- if not isinstance(value,bool):
101
- raise TypeError(f'{param} should be of type bool.')
102
- value = 1 if value == True else 0
103
- elif param in int_params:
104
- if not isinstance(value,int):
105
- raise TypeError(f'{param} should be of type int.')
106
-
107
- valid_parms[param] = value
108
-
109
- return valid_parms
110
-
111
- def __get_feeds(self,url:str,retry_count:int=None)-> dict:
112
- try:
113
- if retry_count is None:
114
- retry_count = self.max_retries
115
-
116
- if retry_count <= 0:
117
- raise NewsdataException('Maximum retry limit reached. For more information use debug parameter while initializing NewsDataApiClient.')
118
-
119
- response = self.request_method.get(url=url,proxies=self.proxies,timeout=self.request_timeout)
120
- headers = dict(response.headers)
121
-
122
- if self.is_debug == True:
123
- print(f'Debug | {self.get_current_dt()} | x_rate_limit_remaining: {headers.get("x_rate_limit_remaining")} | x_api_limit_remaining: {headers.get("x_api_limit_remaining")}')
124
-
125
- feeds_data:dict = response.json()
126
- if self.include_headers == True:
127
- feeds_data.update({'response_headers':headers})
128
-
129
- if response.status_code != 200:
130
-
131
- if response.status_code == 500:
132
- if self.is_debug == True:
133
- print(f"Debug | {self.get_current_dt()} | Encountered 'ServerError' going to sleep for: {self.retry_delay} seconds.")
134
- time.sleep(self.retry_delay)
135
- return self.__get_feeds(url=url,retry_count=retry_count-1)
136
-
137
- elif feeds_data.get('results',{}).get('code') == 'TooManyRequests':
138
- if self.is_debug == True:
139
- print(f"Debug | {self.get_current_dt()} | Encountered 'TooManyRequests' going to sleep for: {constants.DEFAULT_RETRY_DELAY_TooManyRequests} seconds.")
140
- time.sleep(constants.DEFAULT_RETRY_DELAY_TooManyRequests)
141
- return self.__get_feeds(url=url,retry_count=retry_count-1)
142
-
143
- elif feeds_data.get('results',{}).get('code') == 'RateLimitExceeded':
144
- if self.is_debug == True:
145
- print(f"Debug | {self.get_current_dt()} | Encountered 'RateLimitExceeded' going to sleep for: {constants.DEFAULT_RETRY_DELAY_RateLimitExceeded} seconds.")
146
- time.sleep(constants.DEFAULT_RETRY_DELAY_RateLimitExceeded)
147
- return self.__get_feeds(url=url,retry_count=retry_count-1)
148
-
149
- else:
150
- raise NewsdataException(response.json())
151
-
152
- else:
153
- return feeds_data
154
-
155
- except RequestException:
156
-
157
- if self.is_debug == True:
158
- print(f"Debug | {self.get_current_dt()} | Encountered 'ConnectionError' going to sleep for: {self.retry_delay} seconds.")
159
- time.sleep(self.retry_delay)
160
-
161
- if isinstance(self.request_method,requests.Session):
162
- self.request_method = requests.Session()
163
-
164
- return self.__get_feeds(url=url,retry_count=retry_count-1)
165
-
166
- def __get_feeds_all(self,url:str,max_result:int)-> dict:
167
-
168
- if max_result is None:
169
- max_result = self.max_result
170
-
171
- if not isinstance(max_result,int):
172
- raise TypeError('max_result should be of type int.')
173
-
174
- if not isinstance(self.request_method,requests.Session):
175
- self.request_method = requests.Session()
176
-
177
- feeds_count = 0
178
- data = {'totalResults':None,'results':[],'nextPage':True}
179
- while data.get("nextPage"):
180
- try:
181
- response = self.__get_feeds(url=f'{url}&page={data.get("nextPage")}' if data.get('results') else url)
182
- except NewsdataException as e:
183
- if data['totalResults'] is None:
184
- raise e
185
- return data
186
- data['totalResults'] = response.get('totalResults')
187
- results = response.get('results')
188
- data['results'].extend(results)
189
- data['nextPage'] = response.get('nextPage')
190
- if self.include_headers:
191
- data['response_headers'] = response.get('response_headers')
192
- feeds_count+=len(results)
193
- if self.is_debug == True:
194
- print(f"Debug | {self.get_current_dt()} | total results: {data['totalResults']} | extracted: {feeds_count}")
195
- if feeds_count >= max_result:
196
- return data
197
- time.sleep(0.5)
198
- return data
199
-
200
- def news_api(
201
- self, q:Optional[str]=None, qInTitle:Optional[str]=None, country:Optional[Union[str, list]]=None, category:Optional[Union[str, list]]=None,
202
- language:Optional[Union[str, list]]=None, domain:Optional[Union[str, list]]=None, timeframe:Optional[Union[int,str]]=None, size:Optional[int]=None,
203
- domainurl:Optional[Union[str, list]]=None, excludedomain:Optional[Union[str, list]]=None, timezone:Optional[str]=None, full_content:Optional[bool]=None,
204
- image:Optional[bool]=None, video:Optional[bool]=None, prioritydomain:Optional[str]=None, page:Optional[str]=None, scroll:Optional[bool]=False,
205
- max_result:Optional[int]=None, qInMeta:Optional[str]=None, tag:Optional[Union[str,list]]=None, sentiment:Optional[str]=None,
206
- region:Optional[Union[str,list]]=None,excludefield:Optional[Union[str,list]]=None,removeduplicate:Optional[bool]=None,raw_query:Optional[str]=None
207
- )->dict:
208
- """
209
- Sending GET request to the news api.
210
- For more information about parameters and input, Please visit our documentation page: https://newsdata.io/documentation
211
- """
212
- warn('This method is deprecated and will be removed in upcoming updates, Instead use latest_api()', DeprecationWarning, stacklevel=2)
213
- params = {
214
- 'apikey':self.apikey,'q':q,'qInTitle':qInTitle,'country':country,'category':category,'language':language,'domain':domain,'timeframe':str(timeframe) if timeframe else timeframe,
215
- 'size':size,'domainurl':domainurl,'excludedomain':excludedomain,'timezone':timezone,'full_content':full_content,'image':image,'video':video,'prioritydomain':prioritydomain,
216
- 'page':page,'qInMeta':qInMeta,'tag':tag, 'sentiment':sentiment, 'region':region,'excludefield':excludefield,'removeduplicate':removeduplicate,'raw_query':raw_query
217
- }
218
- URL_parameters = self.__validate_parms(user_param=params)
219
- URL_parameters_encoded = urlencode(URL_parameters, quote_via=quote)
220
- if scroll == True:
221
- return self.__get_feeds_all(url=f'{self.latest_url}?{URL_parameters_encoded}',max_result=max_result)
222
- else:
223
- return self.__get_feeds(url=f'{self.latest_url}?{URL_parameters_encoded}')
224
-
225
- def latest_api(
226
- self, q:Optional[str]=None, qInTitle:Optional[str]=None, country:Optional[Union[str, list]]=None, category:Optional[Union[str, list]]=None,
227
- language:Optional[Union[str, list]]=None, domain:Optional[Union[str, list]]=None, timeframe:Optional[Union[int,str]]=None, size:Optional[int]=None,
228
- domainurl:Optional[Union[str, list]]=None, excludedomain:Optional[Union[str, list]]=None, timezone:Optional[str]=None, full_content:Optional[bool]=None,
229
- image:Optional[bool]=None, video:Optional[bool]=None, prioritydomain:Optional[str]=None, page:Optional[str]=None, scroll:Optional[bool]=False,
230
- max_result:Optional[int]=None, qInMeta:Optional[str]=None, tag:Optional[Union[str,list]]=None, sentiment:Optional[str]=None,
231
- region:Optional[Union[str,list]]=None,excludefield:Optional[Union[str,list]]=None,removeduplicate:Optional[bool]=None,raw_query:Optional[str]=None,
232
- excludecategory:Optional[Union[str,list]]=None,id:Optional[str]=None
233
- )->dict:
234
- """
235
- Sending GET request to the latest api.
236
- For more information about parameters and input, Please visit our documentation page: https://newsdata.io/documentation
237
- """
238
- params = {
239
- 'apikey':self.apikey,'q':q,'qInTitle':qInTitle,'country':country,'category':category,'language':language,'domain':domain,'timeframe':str(timeframe) if timeframe else timeframe,
240
- 'size':size,'domainurl':domainurl,'excludedomain':excludedomain,'timezone':timezone,'full_content':full_content,'image':image,'video':video,'prioritydomain':prioritydomain,
241
- 'page':page,'qInMeta':qInMeta,'tag':tag, 'sentiment':sentiment, 'region':region,'excludefield':excludefield,'removeduplicate':removeduplicate,'raw_query':raw_query,
242
- 'excludecategory':excludecategory,'id':id
243
- }
244
- URL_parameters = self.__validate_parms(user_param=params)
245
- URL_parameters_encoded = urlencode(URL_parameters, quote_via=quote)
246
- if scroll == True:
247
- return self.__get_feeds_all(url=f'{self.latest_url}?{URL_parameters_encoded}',max_result=max_result)
248
- else:
249
- return self.__get_feeds(url=f'{self.latest_url}?{URL_parameters_encoded}')
250
-
251
- def archive_api(
252
- self, q:Optional[str]=None, qInTitle:Optional[str]=None, country:Optional[Union[str, list]]=None, category:Optional[Union[str, list]]=None,
253
- language:Optional[Union[str, list]]=None, domain:Optional[Union[str, list]]=None, size:Optional[int]=None,domainurl:Optional[Union[str, list]]=None,
254
- excludedomain:Optional[Union[str, list]]=None, timezone:Optional[str]=None, full_content:Optional[bool]=None,image:Optional[bool]=None,
255
- video:Optional[bool]=None,prioritydomain:Optional[str]=None, page:Optional[str]=None, scroll:Optional[bool]=False, max_result:Optional[int]=None,
256
- from_date:Optional[str]=None, to_date:Optional[str]=None, qInMeta:Optional[str]=None, excludefield:Optional[Union[str,list]]=None,raw_query:Optional[str]=None,
257
- excludecategory:Optional[Union[str,list]]=None,id:Optional[str]=None
258
- ) -> dict:
259
- """
260
- Sending GET request to the archive api
261
- For more information about parameters and input, Please visit our documentation page: https://newsdata.io/documentation
262
- """
263
- params = {
264
- 'q':q,'qInTitle':qInTitle,'country':country,'category':category,'language':language,'domain':domain,'size':size,'domainurl':domainurl,'excludedomain':excludedomain,
265
- 'timezone':timezone,'full_content':full_content,'image':image,'video':video,'prioritydomain':prioritydomain,'page':page,'from_date':from_date,'to_date':to_date,
266
- 'apikey':self.apikey,'qInMeta':qInMeta,'excludefield':excludefield,'raw_query':raw_query,'excludecategory':excludecategory,'id':id
267
- }
268
- URL_parameters = self.__validate_parms(user_param=params)
269
- URL_parameters_encoded = urlencode(URL_parameters, quote_via=quote)
270
- if scroll == True:
271
- return self.__get_feeds_all(url=f'{self.archive_url}?{URL_parameters_encoded}',max_result=max_result)
272
- else:
273
- return self.__get_feeds(url=f'{self.archive_url}?{URL_parameters_encoded}')
274
-
275
- def sources_api( self, country:Optional[str]= None, category:Optional[str]= None, language:Optional[str]= None, prioritydomain:Optional[str]= None,raw_query:Optional[str]=None):
276
- """
277
- Sending GET request to the sources api
278
- For more information about parameters and input, Please visit our documentation page: https://newsdata.io/documentation
279
- """
280
- params = {"apikey":self.apikey, "country":country, "category":category, "language":language, "prioritydomain":prioritydomain,'raw_query':raw_query}
281
- URL_parameters = self.__validate_parms(user_param=params)
282
- URL_parameters_encoded = urlencode(URL_parameters, quote_via=quote)
283
- return self.__get_feeds(url=f'{self.sources_url}?{URL_parameters_encoded}')
284
-
285
- def crypto_api(
286
- self, q:Optional[str]=None, qInTitle:Optional[str]=None,language:Optional[Union[str, list]]=None, domain:Optional[Union[str, list]]=None,
287
- timeframe:Optional[Union[int,str]]=None, size:Optional[int]=None,domainurl:Optional[Union[str, list]]=None, excludedomain:Optional[Union[str, list]]=None,
288
- timezone:Optional[str]=None, full_content:Optional[bool]=None,image:Optional[bool]=None, video:Optional[bool]=None, prioritydomain:Optional[str]=None,
289
- page:Optional[str]=None, scroll:Optional[bool]=False,max_result:Optional[int]=None, qInMeta:Optional[str]=None,tag:Optional[Union[str,list]]=None,
290
- sentiment:Optional[str]=None,coin:Optional[Union[str, list]]=None,excludefield:Optional[Union[str,list]]=None,from_date:Optional[str]=None,
291
- to_date:Optional[str]=None,removeduplicate:Optional[bool]=None,raw_query:Optional[str]=None,id:Optional[str]=None,
292
- )->dict:
293
- """
294
- Sending GET request to the crypto api
295
- For more information about parameters and input, Please visit our documentation page: https://newsdata.io/documentation
296
- """
297
-
298
- params = {
299
- 'apikey':self.apikey,'q':q,'qInTitle':qInTitle,'language':language,'domain':domain,'size':size,'domainurl':domainurl,
300
- 'excludedomain':excludedomain,'timezone':timezone,'full_content':full_content,'image':image,'video':video,'prioritydomain':prioritydomain,'page':page,
301
- 'timeframe':str(timeframe) if timeframe else timeframe,'qInMeta':qInMeta,'tag':tag, 'sentiment':sentiment,'coin':coin,'excludefield':excludefield,
302
- 'from_date':from_date,'to_date':to_date,'removeduplicate':removeduplicate,'raw_query':raw_query,'id':id
303
- }
304
- URL_parameters = self.__validate_parms(user_param=params)
305
- URL_parameters_encoded = urlencode(URL_parameters, quote_via=quote)
306
- if scroll == True:
307
- return self.__get_feeds_all(url=f'{self.crypto_url}?{URL_parameters_encoded}',max_result=max_result)
308
- else:
309
- return self.__get_feeds(url=f'{self.crypto_url}?{URL_parameters_encoded}')
310
-
311
- def count_api(
312
- self, q:Optional[str]=None, qInTitle:Optional[str]=None, qInMeta:Optional[str]=None, country:Optional[Union[str, list]]=None,
313
- category:Optional[Union[str, list]]=None,language:Optional[Union[str, list]]=None, from_date:Optional[str]=None,
314
- to_date:Optional[str]=None,raw_query:Optional[str]=None
315
- ) -> dict:
316
- """
317
- Sending GET request to the count api
318
- For more information about parameters and input, Please visit our documentation page: https://newsdata.io/documentation
319
- """
320
- params = {
321
- 'q':q,'qInTitle':qInTitle,'country':country,'category':category,'language':language,'from_date':from_date,'to_date':to_date,
322
- 'apikey':self.apikey,'qInMeta':qInMeta,'raw_query':raw_query
323
- }
324
- URL_parameters = self.__validate_parms(user_param=params)
325
- URL_parameters_encoded = urlencode(URL_parameters, quote_via=quote)
326
- return self.__get_feeds(url=f'{self.count_url}?{URL_parameters_encoded}')
327
-
328
- def crypto_count_api(
329
- self, q:Optional[str]=None, qInTitle:Optional[str]=None, qInMeta:Optional[str]=None,language:Optional[Union[str, list]]=None,
330
- from_date:Optional[str]=None,to_date:Optional[str]=None,coin:Optional[str]=None,raw_query:Optional[str]=None
331
- ) -> dict:
332
- """
333
- Sending GET request to the crypto count api
334
- For more information about parameters and input, Please visit our documentation page: https://newsdata.io/documentation
335
- """
336
- params = {
337
- 'q':q,'qInTitle':qInTitle,'language':language,'from_date':from_date,'to_date':to_date,'coin':coin,
338
- 'apikey':self.apikey,'qInMeta':qInMeta,'raw_query':raw_query
339
- }
340
- URL_parameters = self.__validate_parms(user_param=params)
341
- URL_parameters_encoded = urlencode(URL_parameters, quote_via=quote)
342
- return self.__get_feeds(url=f'{self.crypto_count_url}?{URL_parameters_encoded}')
343
-
344
- def __del__(self):
345
- if isinstance(self.request_method,requests.Session):
346
- self.request_method.close()
File without changes
File without changes
File without changes
File without changes