Package: online-judge-api-client
online-judge-tools/api-clientWhat is this?This is an API client for various online judges, used as the backend library ofojcommand.
You can use the Python library (onlinejudgemodule) and the command-line interface (oj-apicommand) which talks JSON compatible withjmerle/competitive-companion.How to install$pip3installonline-judge-api-clientSupported websiteswebsiteget sample casesget system casesget metadataget contest datalogin servicesubmit codeAizu Online Judge:heavy_check_mark::heavy_check_mark:Anarchy Golf:heavy_check_mark::grey_question: (same to samples)AtCoder:heavy_check_mark::heavy_check_mark::heavy_check_mark::heavy_check_mark::heavy_check_mark::heavy_check_mark:AtCoder Problems(virtual contests):heavy_check_mark:CodeChef:heavy_check_mark::heavy_check_mark::heavy_check_mark::grey_question:Codeforces:heavy_check_mark::heavy_check_mark::heavy_check_mark::heavy_check_mark::x:issueCS Academy:heavy_check_mark:Facebook Hacker Cup:heavy_check_mark:Google Code Jam:heavy_check_mark:Google Kick Start:heavy_check_mark:HackerRank:heavy_check_mark::heavy_check_mark::grey_question::heavy_check_mark:Kagamiz Contest System:x::grey_question::heavy_check_mark:Kattis:heavy_check_mark:Library Checker:heavy_check_mark::heavy_check_mark:PKU JudgeOnline:heavy_check_mark:Sphere Online Judge:heavy_check_mark:Topcoder:heavy_check_mark: (archived problems only):grey_question:Toph:heavy_check_mark::grey_question::heavy_check_mark:yukicoder:heavy_check_mark::heavy_check_mark::heavy_check_mark::grey_question::heavy_check_mark:Instead oflogin-service, you can useojcommandwith Selenium asoj login https://.... This can login almost all services.Supported subcommands ofoj-apicommandget-problemoj-api get-problem PROBLEM_URLparses the given problem and prints the results as JSON compatible withjmerle/competitive-companion.options--system: get system cases, instead of sample cases--full: dump all additional dataformaturl: the URL of the problemname: the name of the problem. This doesn't include alphabets (e.g. just "Xor Sum" is used instead of "D. Xor Sum") because such alphabets are attributes belonging to the relation between problems and contests rather than belonging to only problems. (not compatible tojmerle/competitive-companion)context:contest(optional):
-url: the URL of the contest
-name: the name of the contestalphabet(optional): the alphabet of the problem in the contestmemoryLimit: the memory limit in megabytes (MB); not mebibytes (MiB). They sometimes become non-integers, but be rounded down for the compatibility reason withjmerle/competitive-companion.timeLimit: the time limit in milliseconds (msec)tests:input: the input of the test caseoutput: the output of the test caseformat (additional)tests:name(optional, when--system): the name of the system case (e.g.random-004.in,fft_killer_01,99_hand.txt)availableLanguages(optional, when--full):id: the ID of language to submit the server (e.g.3003)description: the description of the language to show to users (e.g.C++14 (GCC 5.4.1))raw(optional, when--full):html(optional): the raw HTML used internally. This might contain sensitive info like CSRF tokens.json(optional): the raw JSON used internally. This might contain sensitive info like access tokens.etc.example$oj-apiget-problemhttps://atcoder.jp/contests/arc100/tasks/arc100_b | jq .result{"url":"https://atcoder.jp/contests/arc100/tasks/arc100_b","name":"Equal Cut","context":{"contest":{"url":"https://atcoder.jp/contests/arc100","name":"AtCoder Regular Contest 100"},"alphabet":"D"},"memoryLimit":1024,"timeLimit":2000,"tests":[{"input":"5\n3 2 4 1 2\n","output":"2\n"},{"input":"10\n10 71 84 33 6 47 23 25 52 64\n","output":"36\n"},{"input":"7\n1 2 3 1000000000 4 5 6\n","output":"999999994\n"}]}get-problem --compatibilityoj-api get-problem --compatibility PROBLEM_URLis the variant ofget-problemstrictly compatible withjmerle/competitive-companion.formatSee the document ofjmerle/competitive-companion.example{"name":"D. Equal Cut","group":"AtCoder Regular Contest 100","url":"https://atcoder.jp/contests/arc100/tasks/arc100_b","interactive":false,"memoryLimit":1024,"timeLimit":2000,"tests":[{"input":"5\n3 2 4 1 2\n","output":"2\n"},{"input":"10\n10 71 84 33 6 47 23 25 52 64\n","output":"36\n"},{"input":"7\n1 2 3 1000000000 4 5 6\n","output":"999999994\n"}],"testType":"single","input":{"type":"stdin"},"output":{"type":"stdout"},"languages":{"java":{"mainClass":"Main","taskClass":"Task"}}}get-contestoj-api get-contest CONTEST_URLparses the given contest and prints the results as JSON.formaturl: the URL of the contestname: the name of the contestproblems: problems. For details, see the description ofget-problem.example$oj-apiget-contesthttps://atcoder.jp/contests/arc100 | jq .result{"url":"https://atcoder.jp/contests/arc100","name":"AtCoder Regular Contest 100","problems":[{"url":"https://atcoder.jp/contests/arc100/tasks/arc100_a","name":"Linear Approximation","context":{"contest":{"url":"https://atcoder.jp/contests/arc100","name":"AtCoder Regular Contest 100"},"alphabet":"C"}},{"url":"https://atcoder.jp/contests/arc100/tasks/arc100_b","name":"Equal Cut","context":{"contest":{"url":"https://atcoder.jp/contests/arc100","name":"AtCoder Regular Contest 100"},"alphabet":"D"}},{"url":"https://atcoder.jp/contests/arc100/tasks/arc100_c","name":"Or Plus Max","context":{"contest":{"url":"https://atcoder.jp/contests/arc100","name":"AtCoder Regular Contest 100"},"alphabet":"E"}},{"url":"https://atcoder.jp/contests/arc100/tasks/arc100_d","name":"Colorful Sequences","context":{"contest":{"url":"https://atcoder.jp/contests/arc100","name":"AtCoder Regular Contest 100"},"alphabet":"F"}}]}get-serviceoj-api get-service SERVICE_URLprints the data of the service.options--list-contests: list all contests in the serviceformaturl: the URL of the servicename: the name of the servicecontests(when--list-contests): contests. For details, see the description ofget-problem.example$oj-apiget-servicehttps://atcoder.jp/ --list-contests | jq .result{"url":"https://atcoder.jp/","name":"AtCoder","contests":[{"url":"https://atcoder.jp/contests/abc162","name":"AtCoder Beginner Contest 162"},{"url":"https://atcoder.jp/contests/judge-update-202004","name":"Judge System Update Test Contest 202004"},{"url":"https://atcoder.jp/contests/abc161","name":"AtCoder Beginner Contest 161"},{"url":"https://atcoder.jp/contests/abc160","name":"AtCoder Beginner Contest 160"},...]}login-serviceUSERNAME=USERNAME PASSWORD=PASSWORD oj-api login-service SERVICE_URLlogs in the given service.options--check: only check whether you are already logged in, without trying to log informatloggedIn: the resultexample$USERNAME=kimiyukiPASSWORD='????????????????'oj-apilogin-servicehttps://atcoder.jp/ | jq .result{"loggedIn":true}submit-codeoj-api submit-code PROBLEM_URL --file FILE --language LANGUAGE_IDsubmits the file to the given problem.
You can obtrain theLANGUAGE_IDfrom the listavailableLanguagesofoj-api get-problem --full PROBLEM_URLor theguess-language-idsubcommand.formaturl: the URL of the submission resultexample$oj-apisubmit-codehttps://atcoder.jp/contests/abc160/tasks/abc160_a --file main.py --language 3023 | jq .result{"url":"https://atcoder.jp/contests/abc160/submissions/11991846"}guess-language-idoj-api guess-language-id PROBLEM_URL --file FILEguesses the language id to submit the file to the given problem.formatid: the language iddescription: the description of the language idexample$oj-apiguess-language-idhttp://codeforces.com/contest/1373/problem/A --file=main.py | jq .result{"id":"31","description":"Python 3.7.2",}JSON API responsesformatstatus: the status. This containsokif the subcommand succeeded.messages: error messagesresult: the resultexample$USERNAME=chokudaiPASSWORD=hogeoj-apilogin-servicehttps://atcoder.jp/ | jq .{"status":"error","messages":["onlinejudge.type.LoginError: failed to login"],"result":null}TipsFor end-users who don't develop any programs:Please use theojcommandinstead of thisoj-apicommand.Theoj-apicommand is intended to be used as a backend of other programs. It's not a frontend which humans use directly.For developers of programs which useoj-api:Please be polite to judge servers.We are accessing the web pages using the unintended way, i.e. without GUI browsers. We should not forget that this is basically not welcomed.Please be aware that this package usesSemantic Versioning.The "public API" of this package is the documented features ofoj-apicommand and thedocumented modulesofonlinejudgemodule.You can also use theoj logincommand to login servers with GUI browsers.The implementation around authentication is very complicated and fragile. For example, Codeforces has four methods to login: password, Gmail, Facebook, and ICPC. So we need to use GUI browsers for the development cost and stability.This feature ofoj loginmight be imported tooj-apicommand in the future.