https://github.com/letmefly666/buctoj
Python BUCTOJ,用Python实现对BUCTOJ的一些操作
https://github.com/letmefly666/buctoj
Last synced: 10 months ago
JSON representation
Python BUCTOJ,用Python实现对BUCTOJ的一些操作
- Host: GitHub
- URL: https://github.com/letmefly666/buctoj
- Owner: LetMeFly666
- License: apache-2.0
- Created: 2022-01-26T04:37:49.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2024-06-19T03:15:48.000Z (about 2 years ago)
- Last Synced: 2025-07-04T11:56:12.343Z (12 months ago)
- Language: Python
- Homepage: https://pypi.org/project/BUCTOJ/
- Size: 71.3 KB
- Stars: 4
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.rst
- License: LICENSE
Awesome Lists containing this project
README
BUCTOJ 用Python玩转北化OJ平台
========================================
.. .. image:: https://readthedocs.org/projects/buctoj/badge/?version=latest
.. :target: https://buctoj.readthedocs.io/zh_CN/latest/?badge=latest
.. :alt: 文档状态
.. image:: https://readthedocs.org/projects/buctoj/badge/?version=latest
将 `BUCT-OJ `_ 的一些功能封装成包,从而实现通过脚本提交代码等。
⚠ 仅供学习测试,不能用于特殊用途
⚠ 对于拥有管理员账号的同学,应该有自觉使用管理号的觉悟,不会用来免做题目
主要供BUCTOJ管理员使用
主要功能
=============
模拟登录
--------------------------
::
from BUCTOJ import login
cookies = login(用户名, 密码)
使用cookies中的session即可以账号身份进行操作
若账号密码错误,则返回cookie不可用
提交代码
--------------------------
::
from BUCTOJ import submit
submit(比赛的cid,要提交问题的pid,你的cookie,要提交的代码)
上述方式会使用C++语言进行提交(目前仅支持C++)
进入比赛的某道题目后,地址栏的url中会有cid和pid。
例如 `Contest2347` 的 `A` 题,url为 `https://buctcoder.com/problem.php?cid=2347&pid=0` ,因此此题目的cid为2374,pid为0
cookie是登录功能所获得的cookie。
通过id提交代码
--------------------------
::
from BUCTOJ import submitById, login
submit(login(账号,密码),题目id,代码,语言)
# response = submit(login('LetMeFly', 'SoHandsome'), '6264', """#include \n...""", 'C++')
# response = submit(login('LetMeFly', 'SoHandsome'), '6264', """#include \n...""", '1')
上述方式支持多种语言提交,可以传参languageid(对应的languageid在BUCTOJ的提交页面),也可传参语言名。当语言名不受支持时会认为传递的参数是languageid。
语言、id对照表:
+-----------+------------+
| 语言 | languageid |
+===========+============+
| C | 0 |
+-----------+------------+
| C++ | 1 |
+-----------+------------+
| Java | 3 |
+-----------+------------+
| Python | 6 |
+-----------+------------+
| PHP | 7 |
+-----------+------------+
| JavaScript| 16 |
+-----------+------------+
| Go | 17 |
+-----------+------------+
| SQL | 18 |
+-----------+------------+
题库中的问题提交之前地址栏中会存在问题id,例如问题“还原撕碎的字条,哄笑生气的毛毛”的id为6264( `https://buctoj.com/problem.php?id=6264` )
函数返回来自BUCTOJ的response
新建问题
--------------------------------
::
from BUCTOJ import create1problem, login
cookies = login(管理员用户名, 管理员密码)
problem_id = create1problem(cookies=cookies, title="题目标题", description="题目描述", input="输入描述", output="输出描述", sample_input="1\n0", sample_output="0")
上述代码会使用管理员账号创建一道新的问题,并返回新建问题的id。
在BUCTOJ提供的新建题目的网页经常会出现编辑了很多之后提交失败的情况,使用此脚本提交可以先在本地编辑好之后一次提交成功。
编辑问题
--------------------------------
::
from BUCTOJ import edit1problem, login
cookies = login(管理员用户名, 管理员密码)
edit1problem(cookies=cookies, problem_id="6080", title=...后面参考新建问题create1problem函数)
自动完成一个比赛
--------------------------------
::
from BUCTOJ import finish1contest
finish1contest(比赛cid, 你的用户名, 你的密码, 管理员用户名, 管理员密码)
**前提**:
1. 拥有一个管理员账号
2. 每道题都有用C++通过者(非本次比赛提交也可)
**功能**:
若满足以上两个条件,则此函数具有以下功能:
1. 每隔大约15s通过一道题
2. 查重率为0
若某次比赛中一些题目无人用C++通过,则程序会跳过此题继续提交下一题
下载某比赛/题目的所有提交/AC代码
--------------------------------
::
from BUCTOJ import Config, login, saveAllCodes
cookies = login('账号', '密码')
saveAllCodes(baseurl='http://oj.narc.letmefly.xyz/status.php?cid=1269&jresult=4', cookies=cookies)
**前提**:
1. 拥有一个管理员账号
**功能**:
若满足以上一个条件,则此函数具有以下功能:
1. 获取baseurl的所有提交代码(会自动下一页)
2. 以“{用户}-{提交编号}.java”命名保存到results文件夹下(若无则会自动创建)
**TODO**:
1. 根据提交语音自动生成文件后缀,而非默认的.java
2. 支持用户自定义文件夹名,而非默认的results
修改配置
=============
修改域名
--------------------------
脚本的默认oj域名为"https://buctcoder.com/"
若非本域名的其他相同oj平台,则可以进行配置其他域名。
假如"https://oj.letmefly.xyz/"也是采用的 `hustoj `_ ,那么此脚本可能也能用来进行oj.letmefly.xyz的操纵。
::
from BUCTOJ import Config
from BUCTOJ import login
Config.set_info("base_url", "https://oj.letmefly.xyz/")
cookies = login(0, 0)
当前仅支持“域名”这一个配置。
TODO:
=============
BUGFIX: 脚本自动添加的头部会include上C++的 `` 头文件,这可能导致原本能通过的代码产生编译错误(如 `int map;` 等)