Skip to content

Repository files navigation

buildtestspypipypi-downloadspython-versionslicense

Leetcode API implementation

This repo contains a python client to access all known so far methods of Leetcode API.

The code is autogenerated by swagger. Swagger reference can be found here: https://github.com/fspv/leetcode-swagger

PyPi package link: https://pypi.org/project/python-leetcode/

Minimal working example

First set up a virtualenv

virtualenv -p python3 leetcode
. leetcode/bin/activate
pip3 install python-leetcode

Then in python shell initialize necessary environment variables. You can get it directly from your browser cookies (csrftoken and LEETCODE_SESSION)

importleetcode# Get the next two values from your browser cookiesleetcode_session="yyy"csrf_token="xxx"configuration=leetcode.Configuration()
configuration.api_key["x-csrftoken"] =csrf_tokenconfiguration.api_key["csrftoken"] =csrf_tokenconfiguration.api_key["LEETCODE_SESSION"] =leetcode_sessionconfiguration.api_key["Referer"] ="https://leetcode.com"configuration.debug=Falseapi_instance=leetcode.DefaultApi(leetcode.ApiClient(configuration))

Now once the client is initilized, you can start performing actual queries

graphql_request=leetcode.GraphqlQuery(
query=""" { user { username isCurrentUserPremium } } """,
variables=leetcode.GraphqlQueryVariables(),
)
print(api_instance.graphql_post(body=graphql_request))

You should get something like that in the response

{'data': {'question': None,
'user': {'is_current_user_premium': True, 'username': 'omgitspavel'}}}

This confirms you've set up auth correctly.

Advanced example

Now let's try to do something more complicated. For example calculate the percentage of the problems we've solved by topic.

For that we have to acquire the list of all the problems we solved.

api_response=api_instance.api_problems_topic_get(topic="algorithms")
slug_to_solved_status= {
pair.stat.question__title_slug: Trueifpair.status=="ac"elseFalseforpairinapi_response.stat_status_pairs
}

Now for each problem we want to get its tags

importtimefromcollectionsimportCountertopic_to_accepted=Counter()
topic_to_total=Counter()
# Take only the first 10 for test purposesforsluginlist(slug_to_solved_status.keys())[:10]:
time.sleep(1) # Leetcode has a rate limitergraphql_request=leetcode.GraphqlQuery(
query=""" query getQuestionDetail($titleSlug: String!) { question(titleSlug: $titleSlug) { topicTags { name slug } } } """,
variables=leetcode.GraphqlQueryVariables(title_slug=slug),
operation_name="getQuestionDetail",
)
api_response=api_instance.graphql_post(body=graphql_request)
fortopicin (tag.slugfortaginapi_response.data.question.topic_tags):
topic_to_accepted[topic] +=int(slug_to_solved_status[slug])
topic_to_total[topic] +=1print(
list(
sorted(
((topic, accepted/topic_to_total[topic]) fortopic, acceptedintopic_to_accepted.items()),
key=lambdax: x[1]
)
)
)

The output will look like this:

[('memoization', 0.0),
('number-theory', 0.0),
('binary-search-tree', 0.0),
('quickselect', 0.0),
('recursion', 0.0),
('suffix-array', 0.0),
('topological-sort', 0.0),
('shortest-path', 0.0),
('trie', 0.0),
('geometry', 0.0),
('brainteaser', 0.0),
('combinatorics', 0.0),
('line-sweep', 0.0),
...
('union-find', 0.3076923076923077),
('linked-list', 0.3333333333333333),
('string-matching', 0.3333333333333333),
('segment-tree', 0.4),
('data-stream', 0.5),
('strongly-connected-component', 0.5),
('minimum-spanning-tree', 0.6666666666666666),
('merge-sort', 1.0),
('doubly-linked-list', 1.0)]

So it is clearly visible which topics we should focus on in our preparation. In this case memoization topic is one of the targets for improvement, so I can go to https://leetcode.com/tag/memoization/ and choose a new memoization problem. Or use python to automate the process.

Example services using this library

Additional info

You can find other examples of usage in example.py

Autogenerated by swagger documentation can be found here.

Development

Build package locally and upload to test pypi

virtualenv .venv
. .venv/bin/activate
pip install setuptools twine wheel
rm -rf build/ dist/ *.egg-info/ *.egg
python setup.py sdist bdist_wheel
twine upload --repository-url https://test.pypi.org/legacy/ dist/*.whl

To run tests set up env variables and run this

docker build --env LEETCODE_SESSION_ID=$LEETCODE_SESSION_ID --env LEETCODE_CSRF_TOKEN=$LEETCODE_CSRF_TOKEN.

Test new created package before publishing

pip install -i https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ python-leetcode==1.2.5

Publish package

git tag 1.2.4
git push --tags

About

python client for leetcode api

Topics

Resources

Stars

83 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages