Source code for pybet365.client.client

"""
Bet365 API Wrapper.

Bet365 Serves as a Client to make requests to Bet365 API
see for documentation: (https://1394697259.gitbook.io/bet365-api/)

Bet365 Exposes 6 Endpoints:

    Result ["GET"]

    InPlay Filter ["GET"]

    InPlay Odds ["GET"]

    PreMatch odds ["GET"]

    InPlay Events ["GET"]

    Upcoming Events ["GET"]

Responses are parsed into Facade Access objects (Base Bet365Response)

"""
from typing import Optional, Union
from urllib.parse import urljoin

import requests

import pybet365.response as facades
from pybet365.response import Bet365Response
from pybet365.client.config import RESPONSE_OBJECT_FACTORY


[docs]class Bet365(object): """Bet365 API Wrapper.""" def __init__(self, api_host, api_key): """Constructor for Bet365.""" self.base_url = "https://bet365-sports-odds.p.rapidapi.com/{}/bet365/" self.headers = { "x-rapidapi-host": api_host, "x-rapidapi-key": api_key, } def _get( self, url_extras: str, params: dict, version: str = "v1" ) -> Bet365Response: """ Request maker for Bet365. NOTE: Internal method to be invoked by direct endpoint requests Args: url_extras (str): Tail for desired endpoint provided by caller params (dict): GET operation params dict version (str): API version for `url` provided by caller Returns: Bet365Response: Response object accessible by dot notation Raises: `raise_for_status()` for statuses other than `200` """ url = urljoin(self.base_url.format(version), url_extras) response = requests.get( url=url, headers=self.headers, params=self._prune(params) ) response.raise_for_status() try: # Using factory pattern we instantiate the Response Object delegation = getattr( facades, RESPONSE_OBJECT_FACTORY.get(url_extras) ) # Load the desired `.json()` response to ResponseObject delegate_object = delegation(response.json()) except AttributeError: # fall back on `.json()` if facade does not exist return response.json() return delegate_object
[docs] def result(self, event_id: str) -> Bet365Response: """ Caller for `Result` endpoint of Bet365 API. Args: event_id (str): Sporting event id to get result for Returns: Bet365Response: Response Object for `result` endpoint """ querystring = {"event_id": event_id} return self._get(url_extras="result", params=querystring)
[docs] def in_play_filter( self, sport_id: Optional[str] = None, league_id: Optional[str] = None ) -> Bet365Response: """ Caller for `InPlay Filters` endpoint of Bet365 API. Args: sport_id (Optional[str]): Identifier for sport type league_id (Optional[str]): Identifier for specific league Returns: Bet365Response: Response Object for `in_play_filter` endpoint """ querystring = {"sport_id": sport_id, "league_id": league_id} return self._get(url_extras="inplay_filter", params=querystring)
[docs] def in_play_odds( self, fi: str, raw: Optional[str] = None, lineup: Optional[str] = None, stats: Optional[str] = None, ) -> Bet365Response: """ Caller for `InPlay Odds` endpoint of Bet365 API. Args: fi (str): FI from Bet365 InPlay raw (Optional[str]): option for raw Bet365 body response lineup (Optional[str]): lineup info (NOTE: ONLY FOR CRICKET) stats (Optional[str]): extra stats info (NOTE: ONLY FOR SOCCER, BASKETBALL, CRICKET, BASEBALL, TENNIS) Returns: Bet365Response: Response Object for `in_play_odds` endpoint """ querystring = {"FI": fi, "raw": raw, "lineup": lineup, "stats": stats} return self._get(url_extras="event", params=querystring)
[docs] def pre_match_odds( self, fi: str, raw: Optional[str] = None ) -> Bet365Response: """ Caller for `PreMatch Odds` endpoint of Bet365 API. Args: fi (str): FI from Bet365 InPlay raw (Optional[str]): option for raw Bet365 body response Returns: Bet365Response: Response Object for `pre_match_odds` endpoint """ querystring = {"FI": fi, "raw": raw} return self._get( url_extras="prematch", params=querystring, version="v2" )
[docs] def in_play_events(self, raw: Optional[str] = None) -> Bet365Response: """ Caller for `InPlay Events` endpoint of Bet365 API. Args: raw (Optional[str]): option for raw Bet365 body response Returns: Bet365Response: Response Object for `in_play_events` endpoint """ querystring = {"raw": raw} return self._get(url_extras="inplay", params=querystring)
[docs] def upcoming_events( self, sport_id: str, page: Optional[str] = None, lng_id: Optional[str] = None, day: Optional[str] = None, league_id: Optional[str] = None, ) -> Bet365Response: """ Caller for `Upcoming Events` endpoint of Bet365 API. Args: sport_id (str): String identifier for sport type page (Optional[str]): Pagination for API Response lng_id (Optional[str]): Language Id day (Optional[str]): Go forward ONLY date to query league_id (Optional[str]): Id for desired league Returns: Bet365Response: Response Object for `upcoming_events` endpoint """ querystring = { "sport_id": sport_id, "page": page, "LNG_ID": lng_id, "day": day, "league_id": league_id, } return self._get(url_extras="upcoming", params=querystring)
@staticmethod def _prune(params: dict) -> Union[dict, None]: """ Cleaner of `params` dictionary for API Request. Args: params (dict): `params` dictionary for API request Returns: pruned_params (dict): `params` dict without `None` values or keys """ pruned_params = dict((k, v) for k, v in params.items() if v) return pruned_params