#!/usr/bin/env python #API-NG library import requests import urllib import urllib.request import urllib.error import json import datetime import sys import time def isItSummerTime (): return time.localtime()[-1] ########################################################### def checkSummerTime(raceTime): date,time = raceTime.split('T'); # check if BST if it is pull back one hour to allow for Betfair race times being behind if isItSummerTime() == 1: hrs,mins,secs = time.split(':'); hrs = int(hrs) + 1 hrs = str(hrs) raceTime = date+"T"+hrs+':'+mins+':'+secs return raceTime ########################################################### def callAping(jsonrpc_req, appKey, sessionToken): headers = {'X-Application': appKey, 'X-Authentication': sessionToken, 'content-type': 'application/json'} url = "https://api.betfair.com/exchange/betting/json-rpc/v1" try: req = urllib.request.Request(url, jsonrpc_req.encode('utf-8'), headers) response = urllib.request.urlopen(req) jsonResponse = response.read() return jsonResponse.decode('utf-8') except urllib.error.URLError as e: print (e.reason) print ('Oops no service available at ' + str(url)) exit() except urllib.error.HTTPError: print ('Oops not a valid operation from the service ' + str(url)) exit() ############################################################ def loginAPING2(userName,passWord): ### reurns session token or -1 if fails ### appKey = 1 # seems to be needed although not a valid appkey payload = 'username='+userName+'&password='+passWord headers = {'X-Application': appKey,'Content-Type': 'application/x-www-form-urlencoded'} resp = requests.post('https://identitysso.betfair.com/api/certlogin', data=payload, cert=('client-2048.crt', 'client-2048.key'), headers=headers) resp_json = resp.json() if resp_json['loginStatus'] == 'SUCCESS': return resp_json['sessionToken'] else: return -1 ############################################################# def getEventTypes(appKey,sessionToken): ### returns eventypeids for all sports eg racing = 7 or -1 if fails ### event_type_req = '{"jsonrpc": "2.0", "method": "SportsAPING/v1.0/listEventTypes", "params": {"filter":{ }}, "id": 1}' eventTypesResponse = callAping(event_type_req, appKey, sessionToken) eventTypeLoads = json.loads(eventTypesResponse) try: eventTypeResults = eventTypeLoads['result'] return eventTypeResults except: print ('Exception from API-NG' + str(eventTypeLoads['error'])) return -1 ############################################################ def getEventTypeIDForEventTypeName(eventTypesResult, requestedEventTypeName): if(eventTypesResult is not None): for event in eventTypesResult: eventTypeName = event['eventType']['name'] if( eventTypeName == requestedEventTypeName): return event['eventType']['id'] else: print ('Oops there is an issue with the input') return -1 ########################################################### def getEvents(appKey, sessionToken, eventId): now = datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%SZ') date,time = now.split('T'); # check if BST if it is pull back one hour to allow for Betfair race times being behind if isItSummerTime() == 1: hrs,mins,secs = time.split(':'); hrs = int(hrs) - 1 hrs = str(hrs) now = date+"T"+hrs+':'+mins+':'+secs to = date+"T23:59:00Z" market_catalogue_req = '{"jsonrpc": "2.0", "method": "SportsAPING/v1.0/listMarketCatalogue", "params": {"filter":{"eventTypeIds":['+eventId+'],"marketCountries":["GB"],"marketTypeCodes":["WIN"], "marketStartTime":{"from":"' + now + '","to":"' + to + '"}},"sort":"FIRST_TO_START","maxResults":"100","marketProjection":["MARKET_START_TIME"]}, "id": 1}' market_catalogue_response = callAping(market_catalogue_req, appKey, sessionToken) decodedRaces = json.loads(market_catalogue_response) try: decodedRacesResult = decodedRaces['result'] return decodedRacesResult except: return -1 #####################################################