Search code examples
pythonchess

Chess.com API request not working when using Python Wrapper


I'm trying to retrieve various data from the Chess.com API using Python. I came across a pretty intuitive wrapper documented here, but when I try to run any of the given functions I keep getting a ChessDotComError due to the API's response.

Here is the original code:

from chessdotcom import get_leaderboards

def print_leaderboards():
    data = get_leaderboards().json
    print("Success!")

print_leaderboards()

Here is the error:

Traceback (most recent call last):
  File "c:\Users\witte\Documents\VS Code\chessdotcom-scraper.py", line 7, in <module>
    print_leaderboards()
  File "c:\Users\witte\Documents\VS Code\chessdotcom-scraper.py", line 4, in print_leaderboards
    data = get_leaderboards().json
           ^^^^^^^^^^^^^^^^^^
  File "C:\Users\witte\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\chessdotcom\client.py", line 118, in wrapper
    return cls.do_get_request(func(*args, **kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\witte\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\chessdotcom\client.py", line 112, in do_get_request
    return _do_get_request(resource)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\witte\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\chessdotcom\client.py", line 78, in _do_sync_get_request
    raise ChessDotComError(
chessdotcom.types.ChessDotComError: <class 'chessdotcom.types.ChessDotComError'>(status_code=403, text=<!DOCTYPE html><html lang="en-US"><head><title>Just a moment...</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge"><meta name="robots" content="noindex,nofollow"><meta name="viewport" content="width=device-width,initial-scale=1"><link href="/cdn-cgi/styles/challenges.css" rel="stylesheet"></head><body class="no-js"><div class="main-wrapper" role="main"><div class="main-content"><noscript><div id="challenge-error-title"><div class="h2"><span class="icon-wrapper"><div class="heading-icon warning-icon"></div></span><span id="challenge-error-text">Enable JavaScript and cookies to continue</span></div></div></noscript></div></div><script>(function(){window._cf_chl_opt={cvId: '2',cZone: 'api.chess.com',cType: 'managed',cNounce: '2570',cRay: '7ff6ba7f2d87adb0',cHash: '5eca551eeebf8dd',cUPMDTk: "\/pub\/leaderboards?__cf_chl_tk=TOjNMnBQA2uWEKBQ6Ogbi8NTAMvz8ex0SiOvzj3T.kA-1693500165-0-gaNycGzNCrs",cFPWv: 'b',cTTimeMs: '1000',cMTimeMs: '0',cTplV: 5,cTplB: 'cf',cK: "visitor-time",fa: "/pub/leaderboards?__cf_chl_f_tk=TOjNMnBQA2uWEKBQ6Ogbi8NTAMvz8ex0SiOvzj3T.kA-1693500165-0-gaNycGzNCrs",md: "3JHIck3F0nZeQZpWQ.KJj_VB7BuKIOP28zUXwcRt7rQ-1693500165-0-Ae1oLSDeZ7LWV1ec3PqOkc4dXjzfUJZY9w6Nv2UJPei-MglHKwBxDS9sxN8SwalLYJDWW7WxQ_cwUto6nCuHqfthewug-i8r0vsKxjDp-zLyFcOPPUOHb4BegCxBCkkmbJHieaDX2fM-5V6pJ5gCkKiVp3NTaerWw-fxMMN1S9BGV7gsEeC9-01y6M37Lq8mAbxAqrC_nt6_H7ADip8A6WI2zyGPhqbwYd4ddUNragaMjeoXgkA9-AovrYWYsibQt4VCyo0XtVG4fs7Qpsxw_XQVRB7CEz2wgMpYdAJ9EiDPi3Bx3HyFuNq480uVg1kfj0mNeTaFPe9CdAOfMXyySTCjD9lnWHRLncP1DLuqq6GwDwakFK87sAP0BWZIjKFXPJXscp-ybk9uCB1mWTtIl_hwHjuFf_nMajdpGcfPcx_KR1ShlqYU_PF5noGJZ11LJiZvxIa9of0yvsIoBBeqj6HH5uTrFr9YT_5WNfSTCwlB59LlrbGc8Ci3NJ-l3UjT33Yw6C9G2L44EbMt3TNn-K5qMSYL54Sg0PXZbd0wuyL1fW8h5eWb9cwKwtuAHzrPIZt5GdRTW046TblivxLNXsHe76O-Tk00gZ7BDTGmJL0T6l81pav_yIYgVmq6dxIeZ2z0HQvc5EH3KBjLvP3hWv2UrtOJtfDun9l44ptxIF35WQSTU9poNYSz81tKKS0oWIUPy-JBQZe0sUqxnf2DtTfw9qH7pC-haaQ4dH-FuQyz47_Zk4mFFoXxzWtql__J0fY76VkyZ0UJbV_dWzvfn8ny0ad-yg4aPzNscl6tZx8ojYjwsuviP2hLixH_uzgtHLNo_mV2owV981Hm829sEJ-wI7WuDVvs4Sm8awGfoSs1OCLCnD6QBTeNOLLWv-iORdfho0ILo1xK51svRdnl7ypP-ve5WmoIwZEIKXsH_Q9Zar9LsUcroRaOpNLb8OlVEFg9p3ftlkL3gNZEu9qGFIutu9xvczQoZOANY0gEjucLXx6oFLWPkQ_8q7EXcpHb0v6TnpwJXV2Q4kFVEt5HRAFzcfwnAg_UPlvxlbUrc-gYwgnR8KlaqLU11NH0eFwh1c_ZzdQrG0YdTu-aTxF730hNxrG5QX5Ql04L_L-sV1IwvFuIxHxJ1ogIcJp6CZZtEwqoN94NkJ64BVSZX_71jH4Pgd1791DbF8FLgGvc3xanSzG5n4I9Kb_-_RhO4PmTzCzDp4rqvpIJxX0myy5ZmD3h-7gdpAIirv5wYPXZt4wjGDNJIwJf-I6MMwnRIpv2EsmSSdf5hs9BQ1i7gSGfuoxyS23k6hHnUtJIPwT8YfhghojG2EuSKsVwMDRdzxPbwFwKt2JxPpdNNtTbvACMTkoUEPTFr9ZU0LLKZnmp2ngctYg4RnoAFe4ehZATZk3_IBWnBqN8E_pYGRwVeLKD1eIKku2hJBQIe_QY_U8dzqtxK5xXlu7GmV3SDRa7X__OwzJFaf1G2q6t6MfSgcg-M8cS7cUg0lBWPffxqHaBwsrVzGLoAXJcGOqrYi1kPgoF2Lqo8nibfiSGPtVOZHxtGLrq2Dmq9KIT65VfxqaBZBPNhf19NFZ_d91sawMpA2GcnDdWXqKTo_aqYguxxT6svD7MCbjuOCAuKr5eZg256EQeYSHRbf-tuyb_tlmEIxbIs5T0SQfc65kkgjqOWihyqS0_tD7TAf2-0BT5nrVHvD9Xb2YMwZXHe3YlRQ8E_TbVAJay9ZxY4Aw4HVxhxF9-SUAbKhC03jfU7SFbeqhjbF8Khh1HSWvflK2rFYsFc9vHGrpQ_vQMmrAHEI7ZENRNpcki34dx8eEic_zze7AQduRQ6qVDRBzJAeg-U2iUVVPLVDhbfuzp2wZFdEOvtME2n0SZecST1Z0SANGIEQSpUf9_pw83J8fC2VnWAClLdTdy6GPKCSAUttipAjpr7vyLdcyjN5YhQXm-yxXG6vVF8syKIDV-TeTGwbJgmWHi3Mk7tQdgO-b-_ZPZ4ZQUN0yyUBS7DgTmCRilhzayL02oC3MB1Zbui1m_Zt3d6y2x97kJcjC4zTEWg3mRoLWcWI7nwmra3PCpENkZCzT047ixDQmw0AQeLGY6Yq7zqE3V324FHLqjzKvjcrB2k_JrfoP5oOs59JYeGBX55t7mZsqJDTLtFVGAMX4Hnm4rf5igJ6edowmqfvXH8Ybtv3GALIEIPvoN6MInuTwSNu4AMPE5uWsmXtiXgiZfDWljyOtnqneTpdi_fHFIohFz6E5ch8bwwW-tv3dmJTPGtRo94TXRItxE8D-Hmj38wa7UL_N_F5HbSWBWQpTz2_Ri-Mb0W1H6NuqCZKQJcs-y3qQ1XjRQIUSfmwz57BQC9VQBR9EnLx7EKGJpKZUTFXjRvWn4VXE_eYb8ylQKPqxS-mrxEW5tbtuuouicEdFCxttY8yvFHnZYYfDzowp3Jt5CFKlWlJlDWxYZH_ram0cF_uTzLFQz7cSaJtE985P4cJZacYXtMXB1hnZzU4nJyFonSgdqX0PXfM16pOkCcRMhsRTVK7y25cJyUiIZo5JN0XpwYxLWHmMTR3t4wVLoFB6v6Se5m740_W60UdOt0tYaumbdK1Np09Q08gATfB8P_WyMQsBNl38dJjV4DhA-o85SoPcn-LFXVZzK2sun4iJc3RkRsRfgujNuEWSwj8fo6toC3q29UYXe9A",cRq: {ru: 'aHR0cHM6Ly9hcGkuY2hlc3MuY29tL3B1Yi9sZWFkZXJib2FyZHM=',ra: 'cHl0aG9uLXJlcXVlc3RzLzIuMjguMA==',rm: 'R0VU',d: 'CuUuEtXgR5UfVHaIhRDf8G7pHNDlQlQtaOCAk79s0VIUxWIhMjrvKkNMhOguKKDOYPYmtY0EB/K9X1yMzisceBERdAIlJLoaKoIrY/MzvTQeUBweLkLw2laOymg2veQtewhY9W390tjn3dZC0I/ytxkk8LNDGhy6PZdRKSToHmw6ZSwnL2bsm1uwg9DvoVtQY273r262KTEtAj671fiD0Zo3eAPCWwvRMRT5A1qtc4hQGV1enc5mbWxWfrRNHwnzwWvQqXisGvu+QtITyr6X904J8IY+0/PyAlrdawrje7ReFLvbTnSR5y/kfTg4f+L0lrVDM286bTCD4EnsTMaTGU7leZK44C9x3yykycK/dxohXs5xtunm97oGEP3iKNFWe1jFb2fA+7IK3LVLV5kQTYOJ7O+P5PQ/qly3NkIIzd38p/V+pUItrWRcyxGqtTyQW7b0E+ICXoX9SLVW3V1FyCLW7s8ov0X25Wh4puvbhliUACEA6eZ4PXycNOOMERPHJzEAJkMXv8CW00FX252Q42xh7lT/wwJMz0KPYJ2MrM4n6QyFbvUqYrQrHSH26Xku',t: 'MTY5MzUwMDE2NS4wMTEwMDA=',cT: Math.floor(Date.now() / 1000),m: 'K2G193aVCGWGcnKDpHpputd1TGHd61bNMnRqOWa6dT8=',i1: 'mrAtGCdZrjcMWlOO0SwwTg==',i2: 'MVr+a0vkRBArrUubL8Y5zw==',zh: 'mQFfcmIV15X+HE0ijfrq3Z1ehKRcjJIGDhfUaKSYuM8=',uh: 'KXOU42hMUUNBCj8raB/cd2As9NbLMb3/GhNBEShv6ew=',hh: 'EGuE0ahtNILIszXIr11UvFRQh2K7u6ykBalHqwDQljU=',}};var cpo = document.createElement('script');cpo.src = '/cdn-cgi/challenge-platform/h/b/orchestrate/chl_page/v1?ray=7ff6ba7f2d87adb0';window._cf_chl_opt.cOgUHash = location.hash === '' && location.href.indexOf('#') !== -1 ? '#' : location.hash;window._cf_chl_opt.cOgUQuery = location.search === '' && location.href.slice(0, location.href.length - window._cf_chl_opt.cOgUHash.length).indexOf('?') !== -1 ? '?' : location.search;if (window.history && window.history.replaceState) {var ogU = location.pathname + window._cf_chl_opt.cOgUQuery + window._cf_chl_opt.cOgUHash;history.replaceState(null, null, "\/pub\/leaderboards?__cf_chl_rt_tk=TOjNMnBQA2uWEKBQ6Ogbi8NTAMvz8ex0SiOvzj3T.kA-1693500165-0-gaNycGzNCrs" + window._cf_chl_opt.cOgUHash);cpo.onload = function() {history.replaceState(null, null, ogU);};}document.getElementsByTagName('head')[0].appendChild(cpo);}());</script></body></html>)

Here is documentation of a ChessDotComError (source):

exception chessdotcom.types.ChessDotComError(status_code: int, response_text: str, headers:CIMultiDictProxy)

Variables
• status_code – Contains the status code of the API’s response.
• json – Dictionary representation of the API’s response.
• text – API’s raw response decoded into a string.

In the API response I see it says "Enable JavaScript and cookies to continue", but I'm not sure how to do that or if that's what's causing the issue. Is anyone else having trouble using this wrapper or the chess.com API? Any help is appreciated!


Solution

  • In the wrapper's documentation there's two methods listed for retrieving data. I was initially using synchronous API requests, but when I switched to asynchronous requests I got it working.

    BTW - Make sure to use await instead of asyncio.run() in the last line of their example in 3.2.2