Comments (7)
Thanks for reporting this. The result_or_error
helper throws a BetfairAPIError
if the response JSON doesn't include a result
key. That may be the source of the error you're describing. I thought the Betfair API always returned a 'resultkey, even if there were no results, but if that's not the case, we can change the
result_or_error` methods so that it handles the missing key and returns an empty list.
from betfair.py.
I made the following (rather ugly) changes to print out the responses I was getting from the API.
diff --git a/betfair/betfair.py b/betfair/betfair.py
index 0ec4c5e..7ff64e1 100644
--- a/betfair/betfair.py
+++ b/betfair/betfair.py
@@ -70,6 +70,10 @@ class Betfair(object):
def make_api_request(self, method, params, codes=None, model=None):
payload = utils.make_payload(method, params)
+ print "\n"
+ print "payload"
+ print payload
+ print "\n"
response = self.session.post(
self.API_URL,
data=json.dumps(payload),
@@ -77,6 +81,10 @@ class Betfair(object):
)
utils.check_status_code(response, codes=codes)
result = utils.result_or_error(response)
+ print "\n"
+ print "result"
+ print result
+ print "\n"
return utils.process_result(result, model)
# Authentication methods
diff --git a/betfair/meta/model.py b/betfair/meta/model.py
index 48c9943..eee8eb7 100644
--- a/betfair/meta/model.py
+++ b/betfair/meta/model.py
@@ -29,6 +29,10 @@ class Model(object):
def unserialize(self, kwargs):
for key, value in six.iteritems(kwargs):
+ print "key"
+ print key
+ print "value"
+ print value
key = self.unserialize_key(key)
if key not in self._fields:
raise ValueError('Key {0} not in model schema'.format(key))
It produces the following output
kgoetz$ ./bf.py
payload
{'params': {'orderBy': None, 'sortDir': None, 'recordCount': None, 'dateRange': None, 'betIds': None, 'orderProjection': None, 'marketIds': None, 'fromRecord': None}, 'jsonrpc': '2.0', 'method': 'SportsAPING/v1.0/listCurrentOrders', 'id': 1}
result
{u'currentOrders': [], u'moreAvailable': False}
key
currentOrders
value
[]
key
moreAvailable
value
False
Traceback (most recent call last):
File "./longodds.py", line 27, in <module>
all_current_bets = bf.list_current_orders()
File "<string>", line 2, in list_current_orders
File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.3-py2.7.egg/betfair/utils.py", line 125, in requires_login
return func(*args, **kwargs)
File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.3-py2.7.egg/betfair/betfair.py", line 346, in list_current_orders
model=models.CurrentOrderSummaryReport,
File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.3-py2.7.egg/betfair/betfair.py", line 88, in make_api_request
return utils.process_result(result, model)
File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.3-py2.7.egg/betfair/utils.py", line 82, in process_result
return model(**result)
File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.3-py2.7.egg/betfair/meta/model.py", line 16, in __init__
self.unserialize(kwargs)
File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.3-py2.7.egg/betfair/meta/model.py", line 40, in unserialize
self.check_complete()
File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.3-py2.7.egg/betfair/meta/model.py", line 50, in check_complete
', '.join(missing)
ValueError: Missing values on fields current_orders
As you can see from the stack trace I'm still on 0.1.3 - I will try and test again on the weekend with current git head.
from betfair.py.
I've just done two tests on this:
0.1.4 codebase produces the same error message displayed above.
python2.7 ./longodds.py
Traceback (most recent call last):
File "./longodds.py", line 37, in <module>
cord = bf.list_current_orders()
File "<string>", line 2, in list_current_orders
File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.4-py2.7.egg/betfair/utils.py", line 125, in requires_login
return func(*args, **kwargs)
File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.4-py2.7.egg/betfair/betfair.py", line 338, in list_current_orders
model=models.CurrentOrderSummaryReport,
File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.4-py2.7.egg/betfair/betfair.py", line 88, in make_api_request
return utils.process_result(result, model)
File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.4-py2.7.egg/betfair/utils.py", line 82, in process_result
return model(**result)
File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.4-py2.7.egg/betfair/meta/model.py", line 20, in __init__
self.unserialize(kwargs)
File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.4-py2.7.egg/betfair/meta/model.py", line 45, in unserialize
self.check_complete()
File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.4-py2.7.egg/betfair/meta/model.py", line 55, in check_complete
', '.join(missing)
ValueError: Missing values on fields current_orders
Second was submitting the son manually
{
"jsonrpc": "2.0",
"method": "SportsAPING/v1.0/listCurrentOrders",
"id": 1
}
The returned data has a result key
{
"jsonrpc": "2.0",
"result": {
"currentOrders": [],
"moreAvailable": false
},
"id": 1
}
Does this help figure out where the problem lies?
from betfair.py.
Hi.
My suggestion for a solution for getting "listcurrentorders" contains 4 different modifications:
1: return value from utils.result_or_error(response) is stored in a member variable in the betfair class which makes debugging much easier
2: unserialize in meta.datatype contains an if statement which handles types containing a single value or multiple values differently
3: removed "required=true" from currentordersummary in models.py. The documentation says that this field always exists but obviously this value is lost somewhere on the internet...
4: made all parameters used by list_current_orders optional
betfair/betfair.py | 6 ++++--
betfair/meta/datatype.py | 5 ++++-
betfair/models.py | 2 +-
3 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/betfair/betfair.py b/betfair/betfair.py
index ba5c764..bf77e31 100644
--- a/betfair/betfair.py
+++ b/betfair/betfair.py
@@ -80,6 +80,7 @@ class Betfair(object):
)
utils.check_status_code(response, codes=codes)
result = utils.result_or_error(response)
+ self.resp=result
return utils.process_result(result, model)
# Authentication methods
@@ -314,8 +315,9 @@ class Betfair(object):
@utils.requires_login
def list_current_orders(
- self, bet_ids, market_ids, order_projection, date_range, order_by,
- sort_dir, from_record, record_count):
+ self, bet_ids=None, market_ids=None, order_projection=None,
+ date_range=None, order_by=None,
+ sort_dir=None, from_record=None, record_count=None):
"""
:param bet_ids:
diff --git a/betfair/meta/datatype.py b/betfair/meta/datatype.py
index 0b0df55..70fe6db 100644
--- a/betfair/meta/datatype.py
+++ b/betfair/meta/datatype.py
@@ -17,4 +17,7 @@ class DataType(object):
processed = self.preprocess(value)
if isinstance(processed, self.type):
return processed
- return self.type(processed)
+ if(isinstance(processed,dict)):
+ return self.type(**processed)
+ else:
+ return self.type(processed)
diff --git a/betfair/models.py b/betfair/models.py
index e3786eb..cb14e46 100644
--- a/betfair/models.py
+++ b/betfair/models.py
@@ -296,7 +296,7 @@ class CurrentOrderSummary(BetfairModel):
persistence_type = Field(EnumType(constants.PersistenceType), required=True)
order_type = Field(EnumType(constants.OrderType), required=True)
placed_date = Field(datetime_type, required=True)
- matched_date = Field(datetime_type, required=True)
+ matched_date = Field(datetime_type)
average_price_matched = Field(DataType(float))
size_matched = Field(DataType(float))
size_remaining = Field(DataType(float))
from betfair.py.
Thanks for looking into this. @JohanSkoglund, parts 3 and 4 of your patch sound good--would you like to send a pull request, or should I make the changes myself?
About part 1, all things being equal, I'd prefer to store less state on the Betfair
object. For debugging, the BetfairAPIError
exception that gets raised exposes the response
it died on, which you can get to like this:
# do something that raises a `BetfairAPIError`...
import sys
sys.last_value.response
And about part 2, unless it fixes a specific bug you're running into, I'd like to defer updates to the model logic while I evaluate porting the models to schematics, which is a more robust and fuller-featured library than the homegrown code we're using at the moment.
from betfair.py.
@JohanSkoglund Was that the correct hunk from models.py?
from betfair.py.
@goetzk
matched_date = Field(datetime_type, required=True)
is changed to
matched_date = Field(datetime_type)
because matched_date is not always available
from betfair.py.
Related Issues (20)
- Problem on install betfair.py HOT 2
- Pull in fixes from forks. HOT 1
- follow up on issue #24, code breaks on rogue fields HOT 1
- Support bet fairs navigation data for applications HOT 1
- Problem running example. HOT 1
- get_account_funds returning Exception HOT 1
- Calls to place order not working
- tasks doesn't work from a pypi install HOT 3
- cannot access exchange games
- ImportError: No module named treq
- Is this repo abandoned? HOT 5
- invoke ssl throws errors (likely related to some path variable...?) HOT 2
- Support for streaming
- Support for scores API
- get marketbook fail HOT 1
- pip version of schematics breaks package.
- SSL Cert Generation cannot find the file specified HOT 1
- invoke command not found
- New endpoints from 20 December HOT 1
- Wrong url for italy market
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from betfair.py.