This is an API client for various online judges, used as the backend library of oj
command.
You can use the Python library (onlinejudge
module) and the command-line interface (oj-api
command) which talks JSON compatible with jmerle/competitive-companion.
$ pip3 install online-judge-api-client
website | get sample cases | get system cases | get metadata | get contest data | login service | submit code |
---|---|---|---|---|---|---|
Aizu 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: issue | |
CS 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 of login-service
, you can use oj
command with Selenium as oj login https://...
. This can login almost all services.
oj-api
commandget-problem
oj-api get-problem PROBLEM_URL
parses the given problem and prints the results as JSON compatible with jmerle/competitive-companion.
--system
: get system cases, instead of sample cases--full
: dump all additional dataurl
: 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 to jmerle/competitive-companion)context
:
contest
(optional):
url
: the URL of the contestname
: 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 with jmerle/competitive-companion.timeLimit
: the time limit in milliseconds (msec)tests
:
input
: the input of the test caseoutput
: the output of the test casetests
:
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.$ oj-api get-problem https://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 --compatibility
oj-api get-problem --compatibility PROBLEM_URL
is the variant of get-problem
strictly compatible with jmerle/competitive-companion.
See the document of jmerle/competitive-companion.
{
"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-contest
oj-api get-contest CONTEST_URL
parses the given contest and prints the results as JSON.
url
: the URL of the contestname
: the name of the contestproblems
: problems. For details, see the description of get-problem
.$ oj-api get-contest https://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-service
oj-api get-service SERVICE_URL
prints the data of the service.
--list-contests
: list all contests in the serviceurl
: the URL of the servicename
: the name of the servicecontests
(when --list-contests
): contests. For details, see the description of get-problem
.$ oj-api get-service https://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-service
USERNAME=USERNAME PASSWORD=PASSWORD oj-api login-service SERVICE_URL
logs in the given service.
--check
: only check whether you are already logged in, without trying to log inloggedIn
: the result$ USERNAME=kimiyuki PASSWORD='????????????????' oj-api login-service https://atcoder.jp/ | jq .result
{
"loggedIn": true
}
submit-code
oj-api submit-code PROBLEM_URL --file FILE --language LANGUAGE_ID
submits the file to the given problem.
You can obtrain the LANGUAGE_ID
from the list availableLanguages
of oj-api get-problem --full PROBLEM_URL
or the guess-language-id
subcommand.
url
: the URL of the submission result$ oj-api submit-code https://atcoder.jp/contests/abc160/tasks/abc160_a --file main.py --language 3023 | jq .result
{
"url": "https://atcoder.jp/contests/abc160/submissions/11991846"
}
guess-language-id
oj-api guess-language-id PROBLEM_URL --file FILE
guesses the language id to submit the file to the given problem.
id
: the language iddescription
: the description of the language id$ oj-api guess-language-id http://codeforces.com/contest/1373/problem/A --file=main.py | jq .result
{
"id": "31",
"description": "Python 3.7.2",
}
status
: the status. This contains ok
if the subcommand succeeded.messages
: error messagesresult
: the result$ USERNAME=chokudai PASSWORD=hoge oj-api login-service https://atcoder.jp/ | jq .
{
"status": "error",
"messages": [
"onlinejudge.type.LoginError: failed to login"
],
"result": null
}
For end-users who don't develop any programs:
oj
command instead of this oj-api
command.
oj-api
command 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 use oj-api
:
oj-api
command and the documented modules of onlinejudge
module.oj login
command to login servers with GUI browsers.
oj login
might be imported to oj-api
command in the future.