Git Product home page Git Product logo

pkuautoelective's People

Contributors

guyutongxue avatar lhydave avatar yousiki avatar zhongxinghong avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pkuautoelective's Issues

选课网提示处理不正确

[WARNING] hook, 16:03:20, Unknown tips: 补选课程概率统计 (A)成功,请查看已选上列表确认,并查看选课结果。

显示Unknown tips

长时间运行可能导致无法获取最新的课程情况

Check List

Version / Environment

System infomation: Ubuntu 18.04 amd64
Python version: Python 3.6.9
AutoElective version: 4.0.1

Config

dual_degree = false
identity = bzx

[client]

supply_cancel_page = 2
refresh_interval = 2
random_deviation = 0.2
iaaa_client_timeout = 30
elective_client_timeout = 60
elective_client_pool_size = 3
login_loop_interval = 2
debug_print_request = false
debug_dump_request = true

[monitor]

host = 127.0.0.1
port = 7074

[course:ld]

name = 逻辑导论
class = 1
school = 哲学系

[course:xy]

name = 西方音乐欣赏
class = 1
school = 艺术学院

[mutex:mt0]

courses = ld,xy

Issue Description

What

2020年9月24日下午,逻辑导论从250人扩至280人,查看刷课机导出的日志显示依然只有250人;
结束程序后重新运行,观察到导出的日志变为280人。
推测可能与账号长时间未退出登录有关?

程序在阿里云上跑了2天左右;日志均有备份,但过于敏感就不放上来了,如果作者需要可以留个邮箱?

Console Log

Reproduce

出现了课程名相同,班号一样,学院相同的课程

Check List

Version / Environment

System infomation: [Windows10 64bit]
Python version: [3.6.8]
AutoElective version: [3.0.5]

Config

除了学号/密码外的其他配置

[course:wl]
name = 财务会计
class = 1
school = 光华管理学院

[course:hh]
name = 财务会计
class = 2
school = 光华管理学院

Issue Description

What

遇到的问题
见图片
issue
财会有两门课,用英语和汉语授课,唯一区别是课号不同
想问一下
if 三门都在培养方案中,如果不想上英文课程,想抢两门中文课程的任意一门,如何操作?
else if 需要跨院系选课,三门上哪一门都可以,config里的配置可以保证刷课成功吗,即两门班号为1的课程有任意一门出现空位就可以补选
没有看源码,不是很了解补选的实现算法

Console Log

必要的终端输出信息
这个似乎不是很需要?

Reproduce

如有必要,提供复现的步骤

【更新】无法识别第一门课程在current task中/【原标题】无法识别在预选阶段“未选上”的课程

Check List

Version / Environment

System infomation: [Win 10 ] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [ python 3.7 ] ( run python3 --version )
AutoElective version: [最新版 ] ( run python3 main.py --version )

Config

[course:2]

name = 秦汉魏晋南北朝政治历程
class = 1
school = 历史学系

[course:3]

name = **图书出版史
class = 1
school = 新闻与传播学院

[course:4]

name = 投资中的数据分析方法
class = 1
school = 经济学院

[course:5]

name = 程序设计实习
class = 4
school = 信息科学技术学院

Issue Description

What

我在预选阶段就选了“秦汉魏晋南北朝政治历程”,但抽签未中。在补退选阶段再次运行main.py时,这门课不显示在task中。

[INFO] loop, 15:31:37, ======== Loop 35 ========
[INFO] loop, 15:31:37,
[INFO] loop, 15:31:37, > Current tasks
[INFO] loop, 15:31:37, ------------------------------
[INFO] loop, 15:31:37, 01. Course(**图书出版史, 1, 新闻与传播学院)
[INFO] loop, 15:31:37, 02. Course(投资中的数据分析方法, 1, 经济学院)
[INFO] loop, 15:31:37, 03. Course(程序设计实习, 4, 信息科学技术学院)

Console Log

必要的终端输出信息

Reproduce

我用了我预选时也没抽中签的毛概做了测试,毛概也不出现在current task中。
请问是否有解决办法?谢谢!

【!!!更新】
我把config的顺序调整为
[course:2]

name = **图书出版史
class = 1
school = 新闻与传播学院

[course:1]

name = 秦汉魏晋南北朝政治历程
class = 1
school = 历史学系

[course:4]

name = 投资中的数据分析方法
class = 1
school = 经济学院

[course:5]

name = 程序设计实习
class = 4
school = 信息科学技术学院

问题就解决了……

但我之前把秦汉魏晋南北朝删掉之后依然能识别**图书出版史……
不知道该如何描述问题了orzzz感谢大佬

关于course的设置问题

Check List

Version / Environment

System infomation: [ ] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [ ] ( run python3 --version )
AutoElective version: [ ] ( run python3 main.py --version )

Config

除了学号/密码外的其他配置

Issue Description

What

想问下大佬,courseId是指系统里的“”课程号“”吗?还是我随便设置一个就行。class是指系统里的班号还是课号呢。

; [course:${id}] ; 用户为该课程定义的 id
;
; name = ${name} ; elective 中的 课程名
; class = ${class} ; elective 中的 课号
; school = ${school} ; elective 中的 开课单位

Console Log

必要的终端输出信息

Reproduce

如有必要,提供复现的步骤

Max retries exceeded with url,Connection to elective.pku.edu.cn timed out

Check List

Version / Environment

System infomation: [ ] ( Windows10 64bit ... )
Python version: [ ] ( run python3 --version )
AutoElective version: [ ] ( run python3 main.py --version )

Config

除了学号/密码外的其他配置

Issue Description

What

遇到的问题

开启一段时间后,逐渐出现Max retries exceeded with url...错误,猜测requests高频率访问访问同一个ip而出现。出现后浏览器都打不开elective,其他网站正常。只能断开WIFI断开its所有连接并重连(猜测ip被禁,需要重连更换)。不知是否个案。

Console Log

[ERROR] loop.error, 20:39:47, HTTPSConnectionPool(host='elective.pku.edu.cn', port=443): Max retries exceeded with url: /elective2008/edu/pku/stu/elective/controller/supplement/SupplyCancel.do (Caused by ConnectTimeoutError(<urllib3.connection.VerifiedHTTPSConnection object at 0x000002E282DE68E0>, 'Connection to elective.pku.edu.cn timed out. (connect timeout=20.0)'))

其中,重复出现的错误信息一般“0x0...”部分不同

必要的终端输出信息

Reproduce

如有必要,提供复现的步骤

功能建议:成功选课通知功能

Check List

===
又到一年选课季,虽然离补退选时间还早,不过我想现在早点提出来可能补退选的时候就已经更新了(
那个比较经典的chrome插件刷课机我们都知道是有一个选课成功通知功能的,但是这个python刷课机是没有这项功能的,想知道有没有成功选上课必须进入选课网查询(还是有别的简单方式可以知道?),但是不知道在刷课进程运行过程中通过其他终端或浏览器进入选课网会不会导致刷课机故障。因此建议能够追加一个成功选课通知功能,可以是最简单的选课成功就新建一个文件记录成功选上的课程,也可以是用各个系统自带的通知功能(比如Windows 10 的操作中心通知)。当然如果考虑到为了保证刷课机的电力供应,上课时会把电脑放在宿舍,如果实现比较简单的话,还可以有一个成功选课邮箱通知功能~

"AssertionError" in "course.py", line 39

Check List

Version / Environment

System infomation: Windows10 64bit
Python version: 3.7.6 x86_64
AutoElective version: 3.0.2 Beta

Config

filename: config.ini

coding: utf-8

[user]

; student_id string 学号
; password string 密码
; dual_degree boolean 是否为双学位账号,可选 (true, false, True, False, 1, 0)
; 住:只要你的账号在登录时需要选择 "主修/辅双" 身份,此处就需要设为 true
; identity string 双学位账号登录身份,可选 ("bzx","bfx") 对应于 "主修/辅双"

student_id = XXXXX
password = XXXXX
dual_degree = false
identity = bzx

[client]

; supply_cancel_page int 待刷课程处在选课计划的第几页
; refresh_interval float 每次循环后的暂停时间,单位 s
; random_deviation float 偏移量分数,如果设置为 <= 0 的值,则视为 0
; iaaa_client_timeout float IAAA 客户端最长请求超时
; elective_client_timeout float elective 客户端最长请求超时
; elective_client_pool_size int 最多同时保持几个 elective 的有效会话(同一 IP 下最多为 5)
; login_loop_interval float IAAA 登录线程每回合结束后的等待时间
; debug_print_request boolean 是否打印请求细节
; debug_dump_request boolean 是否将重要接口的请求以日志的形式记录到本地(包括补退选页、提交选课等接口)
;
; 关于刷新间隔的配置示例:
;
; refresh_interval = 8
; random_deviation = 0.2
;
; 则每两个循环的间隔时间为 8 * (1.0 ± 0.2) s

supply_cancel_page = 1
refresh_interval = 7
random_deviation = 0.2
iaaa_client_timeout = 30
elective_client_timeout = 60
elective_client_pool_size = 4
login_loop_interval = 2
debug_print_request = false
debug_dump_request = false

[monitor]

; host str
; port int

host = 127.0.0.1
port = 7074

;---------------- course ----------------;
;
; 课程结构定义:
;
; [course:${id}] ; 用户为该课程定义的 id
;
; name = ${name} ; elective 中的 课程名
; class = ${class} ; elective 中的 课号
; school = ${school} ; elective 中的 开课单位
;
;
; 例如:
;
; [course:math_3]
;
; name = 集合论与图论
; class = 3
; school = 信息科学技术学院
;
; 可以解析出:
;
; id = "math_3"
; name = "集合论与图论"
; class = 3
; school = "信息科学技术学院"
;
;
; 更多例子:
;
; [course:db]
;
; name = 数据库概论
; class = 1
; school = 信息科学技术学院
;
; [course:0]
;
; name = 概率统计 (A)
; class = 1
; school = 信息科学技术学院
;
;
; 注意:
;
; 1. [course:${id}] 中可以带空格,但是不推荐
; 例如 [course: 1], [course:math 1] [ course : hello world ]
; 可以解析出: "1", "math 1", "hello world"
; 2. [course:${id}] 中不要带有 ',' 否则会在后续规则定义中引入混乱! 不接受 ',' 转义
; 例如 [course:Hai,Alice] 是非法的,在解析时会被忽略
; 3. [course:${id}] 中可以带有 ':',但是不推荐
;
;----------------------------------------;

; [course:sample]
;
; name = class_name_here
; class = class_no_here
; school = class_school_here

;---------------- mutex ----------------;
;
; 互斥规则结构定义:
;
; [mutex:${id}] ; 用户为该互斥规则定义的 id
;
; courses = ${cid1},${cid2},... ; 用户定义的多个课程的 id,以 ',' 分隔
;
;
; 例如:
;
; [course:math_1]
; ...
;
; [course:math_2]
; ...
;
; [course:math_3]
; ...
;
;
; [mutex:0]
;
; courses = math_1,math_2,math_3
;
; 可以解析出
;
; id = "0"
; courses = ["math_1", "math_2", "math_3"]
;
;
; 解释:
;
; 同一个互斥规则内的课程一旦有一门课已经被选上,其他课程将会被自动忽略。
; 例如,对于上述例子,如果 math_1, math_2, math_3 有任何一门课已经被选上,其它两门课将会被自动忽略
; 例如,当 math_1 被选上时,math_2, math_3 会被自动忽略
;
;
; 注意:
;
; 1. [mutex:${id}] 的命名注意事项同 course
; 2. courses 中可以有空格,但是不推荐
; 例如 courses = math_1, math_2 , math_3
; 仍可以解析出 ["math_1", "math_2", "math_3"]
;
;---------------------------------------;

; [mutex:sample]
;
; courses = course_id_1,course_id_2

[course:GENERAL]

name = 人类发展与环境变迁
class = 1
school = 历史学系

[course:DS]

name = 数据结构与算法 (B)
class = 1
school = 地球与空间科学学院

Issue Description

What

loop, 10:26:27,
Exception in thread Elective:
Traceback (most recent call last):
File "xxx\Python\Python37\lib\threading.py", line 926, in _bootstrap_inner
self.run()
File "xxx\Python\Python37\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "xxx\PKUAutoElective-master\autoelective\loop.py", line 527, in run_elective_loop
raise e
File "xxx\PKUAutoElective-master\autoelective\loop.py", line 352, in run_elective_loop
elif c in plans and c.is_available():
File "xxx\PKUAutoElective-master\autoelective\course.py", line 39, in is_available
assert self._status is not None
AssertionError

Console Log

See above

Reproduce

似乎是检测课程是否有名额时出现的问题
"人类发展与环境变迁"课程当时已经满员

验证码变为GIF后如何识别

Check List

Version / Environment

System infomation: [ ] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [ ] ( run python3 --version )
AutoElective version: [ ] ( run python3 main.py --version )

Config

除了学号/密码外的其他配置

Issue Description

What

遇到的问题

Console Log

必要的终端输出信息

Reproduce

如有必要,提供复现的步骤

[ERROR] loop.error, 09:20:52, [310] 您尚未登录或者会话超时,请重新登录。

显示“您尚未登录或者会话超时,请重新登录。”应该是选课网api更新的结果,请问如何解决?

Check List

Version / Environment

System infomation: [ ] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [ ] ( run python3 --version )
AutoElective version: [ ] ( run python3 main.py --version )

Config

除了学号/密码外的其他配置

Issue Description

What

遇到的问题

Console Log

必要的终端输出信息

Reproduce

如有必要,提供复现的步骤

选课失败后会自动结束运行

发现该问题的版本:2.1
具体状况:今天两次遇到2.1版本运行时未选到课却自动退出的问题。检查log发现可能由于选课网自身的问题,有时候某一门课程返回的选课人数是错误的,出现问题的课实际上是180/180,当时记录的html中却显示180/0,然后补选程序(获取到180/0后可能试图进行了补选操作)就自动退出了。

请问能增加“退选”功能吗?

比如我想选课号为12的毛概课,但是由于这个课非常火爆,只能先选上课号13的毛概(免得最后没有毛概上),这两门课的时间是一模一样的。能否增加一个“推选”功能,在检测到A课程有空位时,自动退掉设置好的B课程,并选上A课程?
非常感谢!

关于Ignored Tasks中可能存在的逻辑问题

两个现象:1、按照学校规定,在2/21,15:00时会开放跨院系选课
2、您的程序会把没到跨院系选课时间的课程扔进Ignored Tasks里
一个假设:如果有人在2/21,14:59开启了刷课机,但是程序检测到没到跨院系选课的时间,把这门课扔进了Ignored Tasks里,这会不会导致错过课程的空缺名额呢

AssertionError: assert self._status is not None

Version / Environment

System infomation: [ OS/X 10.15]
Python version: [ 3.7.3]
AutoElective version: [ 3.0.2] \

Config

除courses外未更改其他配置

Issue Description

What

Assertion Fail: assert self._status is not None

Console Log

Exception in thread Elective:
Traceback (most recent call last):
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/threading.py", line 917, in _bootstrap_inner
self.run()
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "/PKUAutoElective/autoelective/loop.py", line 527, in run_elective_loop
raise e
File "/PKUAutoElective/autoelective/loop.py", line 352, in run_elective_loop
elif c in plans and c.is_available():
File "/PKUAutoElective/autoelective/course.py", line 39, in is_available
assert self._status is not None
AssertionError

Reproduce

每次运行时,似乎是账号登陆成功后的第一次loop就会出现。可能是什么原因呢?谢谢qwq(基本确定环境已经满足要求)

由于目标计算机积极拒绝,无法连接IAAA

Check List

Version / Environment

System infomation: [ ] ( Windows10 64bit )
Python version: [ ] ( 3.7.3 )
AutoElective version: [ ] ( 2.0.6 )

Config

supply_cancel_page = 1
refresh_interval = 2
random_deviation = 0.2
iaaa_client_timeout = 30
elective_client_timeout = 60
elective_client_pool_size = 2
login_loop_interval = 2
debug_print_request = false
debug_dump_request = false

Issue Description

What

无法登录IAAA
虽然现在不是补退选时间,但是我好奇为什么IAAA也无法登录呢?

更新:现在是补退选时间,仍然无法连接IAAA,而网页端正常

Console Log

[ERROR] loop.error, 16:44:50, HTTPSConnectionPool(host='iaaa.pku.edu.cn', port=443): Max retries exceeded with url: /iaaa/oauthlogin.do (Caused by ProxyError('Cannot connect to proxy.', NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x0000016EF1270A90>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。')))

求问有没有哪位好心的大佬可以分享一下新验证码的训练集?方便大佬们各显神通训练模型^_^

Check List

Version / Environment

System infomation: [ ] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [ ] ( run python3 --version )
AutoElective version: [ ] ( run python3 main.py --version )

Config

除了学号/密码外的其他配置

Issue Description

What

遇到的问题

Console Log

必要的终端输出信息

Reproduce

如有必要,提供复现的步骤

对二次验证OTP的支持

Check List

Version / Environment

System infomation: [macOS 10.15.6 ] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [Python 3.8.5] ( run python3 --version )
AutoElective version: [ ] ( run python3 main.py --version )

Config

除了学号/密码外的其他配置

Issue Description

What

在portal打开了需要OTP才能登入,就会丢出下面的错误。把OTP关了,就没这个问题了。

Console Log

[ERROR] loop.error, 10:00:40, [210] 210. response JSON: {'success': False, 'errors': {'code': 'E99', 'msg': 'Service with exception.'}, 'message': 'Operation FAIL.', 'rows': []}

Reproduce

如有必要,提供复现的步骤

无法登陆IAAA

Check List

Version / Environment

System infomation: [MacOS 10.15.5 ] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [ 3.7.6] ( run python3 --version )
AutoElective version: [ 3.0.9] ( run python3 main.py --version )

Config

除了学号/密码外的其他配置

dual_degree = false
identity = bzx

supply_cancel_page = 1
refresh_interval = 5
random_deviation = 0.1786
iaaa_client_timeout = 30
elective_client_timeout = 60
elective_client_pool_size = 3
login_loop_interval = 1
debug_print_request = false
debug_dump_request = false

host = 127.0.0.1
port = 7074

name = 马克思主义基本原理概论
class = 1
school = 马克思主义学院

Issue Description

What

遇到的问题

无法登陆IAAA

Console Log

必要的终端输出信息

~/PKUAutoElective$ python main.py
[INFO] loop, 09:05:18, #--------------------------------------------#
[INFO] loop, 09:05:18, # PKU Auto-Elective Tool v3.0.9 (2020.02.20) #
[INFO] loop, 09:05:18, #--------------------------------------------#
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18, ======== Loop 1 ========
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18, > Current tasks
[INFO] loop, 09:05:18, ------------------------------
[INFO] loop, 09:05:18, 01. Course(马克思主义基本原理概论, 1, 马克思主义学院)
[INFO] loop, 09:05:18, ------------------------------
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18, > Current client: 1, (qsize: 3)
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18, client: 1 needs Login
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18, Try to login IAAA (client: 1)
[INFO] loop, 09:05:18, ======== END Loop 1 ========
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18, ======== Loop 2 ========
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18, > Current tasks
[INFO] loop, 09:05:18, ------------------------------
[INFO] loop, 09:05:18, 01. Course(马克思主义基本原理概论, 1, 马克思主义学院)
[INFO] loop, 09:05:18, ------------------------------
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18, > Current client: 2, (qsize: 2)
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18, client: 2 needs Login
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18, ======== END Loop 2 ========
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18, ======== Loop 3 ========
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18, > Current tasks
[INFO] loop, 09:05:18, ------------------------------
[INFO] loop, 09:05:18, 01. Course(马克思主义基本原理概论, 1, 马克思主义学院)
[INFO] loop, 09:05:18, ------------------------------
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18, > Current client: 3, (qsize: 1)
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18, client: 3 needs Login
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18, ======== END Loop 3 ========
[INFO] loop, 09:05:18,
[ERROR] loop.error, 09:05:18, [102] 102. response status_code: 500
[WARNING] loop, 09:05:18, ServerError/StatusCodeError encountered
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:18, IAAA login loop sleep 1.0 s
[INFO] loop, 09:05:18,
[INFO] loop, 09:05:19, Try to login IAAA (client: 1)
[ERROR] loop.error, 09:05:20, [102] 102. response status_code: 500
[WARNING] loop, 09:05:20, ServerError/StatusCodeError encountered
[INFO] loop, 09:05:20,
[INFO] loop, 09:05:20, IAAA login loop sleep 1.0 s
[INFO] loop, 09:05:20,
[INFO] loop, 09:05:21, Try to login IAAA (client: 1)
[ERROR] loop.error, 09:05:21, [102] 102. response status_code: 500
[WARNING] loop, 09:05:21, ServerError/StatusCodeError encountered
[INFO] loop, 09:05:21,
[INFO] loop, 09:05:21, IAAA login loop sleep 1.0 s
[INFO] loop, 09:05:21,
[INFO] loop, 09:05:22, Try to login IAAA (client: 1)
[ERROR] loop.error, 09:05:22, [102] 102. response status_code: 500
[WARNING] loop, 09:05:22, ServerError/StatusCodeError encountered
[INFO] loop, 09:05:22,
[INFO] loop, 09:05:22, IAAA login loop sleep 1.0 s
[INFO] loop, 09:05:22,
^Z
[3]+ Stopped python main.py

Reproduce

如有必要,提供复现的步骤

elective可能会返回奇怪的结果导致re以及现在的反刷课机政策

现在只要将刷新时长设置1秒以内就会在数分钟内被禁止访问elective, 更换ip后会恢复
同时大约几万个循环会出现elective返回奇怪页面导致异常结束
这是一个异常报告

[INFO] loop, 20:21:14, ======== END Loop 66760 ========
[INFO] loop, 20:21:14, Main loop sleep 1.061373699131935 s
[INFO] loop, 20:21:14,
Exception in thread Elective:
Traceback (most recent call last):
File "C:\Anaconda\lib\threading.py", line 917, in _bootstrap_inner
self.run()
File "C:\Anaconda\lib\threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\user\Desktop\PKUAutoElective-master\autoelective\loop.py", line 621, in run_elective_loop
raise e
File "C:\Users\user\Desktop\PKUAutoElective-master\autoelective\loop.py", line 325, in run_elective_loop
r = page_r = elective.get_SupplyCancel()
File "C:\Users\user\Desktop\PKUAutoElective-master\autoelective\elective.py", line 143, in get_SupplyCancel
**kwargs,
File "C:\Users\user\Desktop\PKUAutoElective-master\autoelective\client.py", line 62, in _get
return self._request('GET', url, params=params, **kwargs)
File "C:\Users\user\Desktop\PKUAutoElective-master\autoelective\client.py", line 57, in _request
resp = self._session.send(prep, **send_kwargs)
File "C:\Anaconda\lib\site-packages\requests\sessions.py", line 629, in send
r = dispatch_hook('response', hooks, r, **kwargs)
File "C:\Anaconda\lib\site-packages\requests\hooks.py", line 31, in dispatch_hook
_hook_data = hook(hook_data, **kwargs)
File "C:\Users\user\Desktop\PKUAutoElective-master\autoelective\hook.py", line 47, in with_etree
r._tree = get_tree_from_response(r)
File "C:\Users\user\Desktop\PKUAutoElective-master\autoelective\parser.py", line 14, in get_tree_from_response
return etree.HTML(r.text) # 不要用 r.content, 否则可能会以 latin-1 编码
File "C:\Anaconda\lib\site-packages\requests\models.py", line 851, in text
if not self.content:
File "C:\Anaconda\lib\site-packages\requests\models.py", line 827, in content
self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b''
File "C:\Anaconda\lib\site-packages\requests\models.py", line 749, in generate
for chunk in self.raw.stream(chunk_size, decode_content=True):
File "C:\Anaconda\lib\site-packages\urllib3\response.py", line 461, in stream
for line in self.read_chunked(amt, decode_content=decode_content):
File "C:\Anaconda\lib\site-packages\urllib3\response.py", line 640, in read_chunked
chunk = self._handle_chunk(amt)
File "C:\Anaconda\lib\site-packages\urllib3\response.py", line 595, in _handle_chunk
returned_chunk = self._fp._safe_read(self.chunk_left)
File "C:\Anaconda\lib\http\client.py", line 610, in _safe_read
chunk = self.fp.read(min(amt, MAXAMOUNT))
File "C:\Anaconda\lib\socket.py", line 589, in readinto
return self._sock.recv_into(b)
File "C:\Anaconda\lib\ssl.py", line 1049, in recv_into
return self.read(nbytes, buffer)
File "C:\Anaconda\lib\ssl.py", line 908, in read
return self._sslobj.read(len, buffer)
ssl.SSLWantReadError: The operation did not complete (read) (_ssl.c:2460)

选课时遇到错误

Check List

Version / Environment

System infomation: [Ubuntu 16.04 ] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [python 3.5.2 ] ( run python3 --version )
AutoElective version: [2.0.4 ] ( run python3 main.py --version )

Config

# filename: config.ini
# coding: utf-8

[coding]

# csv_coding   str   course.csv 的编码,可选 ("utf-8","gbk")

csv_coding = utf-8

[user]

# student_ID    string    学号
# password      string    密码
# dual_degree   boolean   是否为双学位账号,可选 (true, false, True, False, 1, 0)
# identity      string    双学位账号登录身份,可选 ("bzx","bfx") 对应于 “主修/辅双”

student_ID = xxxxxxxxxxxxxxxx
password = xxxxxxxxxxxxxxxx
dual_degree = false
identity = bzx


[client]

# supply_cancel_page           int       待刷课程处在选课计划的第几页
# refresh_interval             float     每次循环后的暂停时间,单位 s
# random_deviation             float     偏移量分数,如果设置为 <= 0 的值,则视为 0
# iaaa_client_timeout          float     IAAA 客户端最长请求超时
# elective_client_timeout      float     elective 客户端最长请求超时
# elective_client_pool_size    int       最多同时保持几个 elective 的有效会话
# login_loop_interval          float     IAAA 登录线程每回合结束后的等待时间
# debug_print_request          boolean   是否打印请求细节
# debug_dump_request           boolean   是否将重要接口的请求以日志的形式记录到本地(包括补退选页、提交选课等接口)
#
# 关于刷新间隔的配置示例:
#
# refresh_interval = 8
# random_deviation = 0.2
#
# 则每两个循环的间隔时间为 8 * (1.0 ± 0.2) s

supply_cancel_page = 1
refresh_interval = 5
random_deviation = 0.2
iaaa_client_timeout = 30
elective_client_timeout = 60
elective_client_pool_size = 4
login_loop_interval = 2
debug_print_request = false
debug_dump_request = false


[monitor]

host = 127.0.0.1
port = 7074

Issue Description

What

我遇到这样的问题,
在要刷的课有名额的时候,验证码识别错误
终端输出如下

Console Log

[INFO] loop, 15:29:36, 
[INFO] loop, 15:29:36, Get SupplyCancel page 1
[INFO] loop, 15:29:36, Get available courses
[INFO] loop, 15:29:36, Course(操作系统A, 1, 信息科学技术学院, 180 / 0) is AVAILABLE now !
[INFO] loop, 15:29:36, Course(数理逻辑, 1, 信息科学技术学院, 260 / 0) is AVAILABLE now !
[INFO] loop, 15:29:36, Try to elect Course(操作系统A, 1, 信息科学技术学院, 180 / 0)
[INFO] loop, 15:29:36, Fetch a captcha
[INFO] loop, 15:29:36, Recognition result: jjjj
[INFO] loop, 15:29:36, Validation failed, try again
[INFO] loop, 15:29:36, Fetch a captcha
[INFO] loop, 15:29:36, Recognition result: jjjj
[INFO] loop, 15:29:36, Validation failed, try again
[INFO] loop, 15:29:36, Fetch a captcha
[INFO] loop, 15:29:36, Recognition result: jjjj
[INFO] loop, 15:29:36, Validation failed, try again
[INFO] loop, 15:29:36, Fetch a captcha
...
[ERROR] loop.error, 15:29:37, Expecting value: line 5 column 1 (char 8)
[ERROR] loop.error, 15:29:37, OperationFailedError does not take keyword arguments
Traceback (most recent call last):
  File "/media/bob-lytton/MyData/repos/PKUAutoElective/autoelective/loop.py", line 151, in _task_validate_captcha
    res = r.json()["valid"]  # 可能会返回一个错误网页 ...
  File "/usr/lib/python3/dist-packages/requests/models.py", line 808, in json
    return complexjson.loads(self.text, **kwargs)
  File "/home/bob-lytton/.local/lib/python3.5/site-packages/simplejson/__init__.py", line 518, in loads
    return _default_decoder.decode(s)
  File "/home/bob-lytton/.local/lib/python3.5/site-packages/simplejson/decoder.py", line 370, in decode
    obj, end = self.raw_decode(s)
  File "/home/bob-lytton/.local/lib/python3.5/site-packages/simplejson/decoder.py", line 400, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 5 column 1 (char 8)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/media/bob-lytton/MyData/repos/PKUAutoElective/autoelective/loop.py", line 374, in _thread_main_loop
    _task_validate_captcha(elective)
  File "/media/bob-lytton/MyData/repos/PKUAutoElective/autoelective/loop.py", line 154, in _task_validate_captcha
    raise OperationFailedError(msg="Unable to validate captcha")
TypeError: OperationFailedError does not take keyword arguments

Reproduce

如有必要,提供复现的步骤

assert self._status is not None

Version / Environment

System infomation: [win10 64bit ] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [3.6 ] ( run python3 --version )
AutoElective version: [3.0.2 ] ( run python3 main.py --version )

Config

默认

What

错误信息:
File "C:\Users\80431\Desktop\PKUAutoElective-master\PKUAutoElective-master\autoelective\loop.py", line 352, in run_elective_loop
elif c in plans and c.is_available():
File "C:\Users\80431\Desktop\PKUAutoElective-master\PKUAutoElective-master\autoelective\course.py", line 39, in is_available
assert self._status is not None
AssertionError

建议增加一个符合条件自动退课的功能

有时候已选上的课是备选方案,需要选同名其他班课程或者退掉某门课程才能符合学分限制,因此建议增加一个某课程班级可选时先退掉某门课程再选该门课程的功能

此外,有时同时要选多门同名课,可能也需要一个课程组选课功能,选上该组任意课程即视为完成该组的选课

验证码

Check List

Version / Environment

System infomation: [ win 10] ( Windows10 64bit)
Python version: [ 3.7.0] ( run python3 --version )
AutoElective version: [ 最新的] ( run python3 main.py --version )

Config

其余一律默认
[course:gsm_1]

name = 互联网与商业模式创新
class = 1
school = 光华管理学院

[course:test_1]

name = 名家专题讲座
class = 1
school = 经济学院

Issue Description

What

Autoelective 报错:
AssertionError: unexpected number of captcha blocks: 0
[INFO] loop, Fetch a captcha
[ERROR] loop.error, unexpected number of captcha blocks: 0

Console Log

必要的终端输出信息

Reproduce

课程名中有必要包括「(重修)」字样吗?

Check List

Version / Environment

System infomation: [Ubuntu 18.04.4 amd64] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [3.7.5] ( run python3 --version )
AutoElective version: [3.0.5] ( run python3 main.py --version )

Issue Description

What

课程名中有必要包括「(重修)」字样吗?

请问关于IAAA的登录问题

请教一下,曾经刷上过一次课,是在login IAAA后发现course available。因此怀疑可能需要一定时间内登录一次IAAA否则刷新得到的信息是无用的,不知道这个想法对不对,或者可能仅仅是巧合?顺便请问一下新版本是不是不能修改登录间隔了呢?谢谢!

可以使用商业验证码识别接口,如http://www.ttshitu.com/docs/python.html#pageTitle 费用1元250次gif验证码识别可以接受

Check List

Version / Environment

System infomation: [ ] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [ ] ( run python3 --version )
AutoElective version: [ ] ( run python3 main.py --version )

Config

除了学号/密码外的其他配置

Issue Description

What

遇到的问题

Console Log

必要的终端输出信息

Reproduce

如有必要,提供复现的步骤

刷课机退掉了我一半的课??太可怕了!

我已经哭死了。。。
逻辑导论本身都刷上了,又给退了...真的太可怕了
麻烦作者好好检查一下有没有bug...

Check List

Version / Environment

System infomation: [Windows10 64bit] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [Python 3.7.4 ] ( run python3 --version )
AutoElective version: [3.0.8] ( run python3 main.py --version )

Config

除了学号/密码外的其他配置
supply_cancel_page = 1
refresh_interval = 0.1
random_deviation = 0.2
iaaa_client_timeout = 20
elective_client_timeout = 20
elective_client_pool_size = 1
login_loop_interval = 1
debug_print_request = false
debug_dump_request = false
[monitor]
; host str
; port int
host = 127.0.0.1
port = 7074

[course:bug_1]

name = 数据结构与算法 (B)
class = 1
school = 地球与空间科学学院

Issue Description

不知道为什么,开启刷课机过了一段时间之后,就把我一半的课退掉了。

What

不知道为什么,开启刷课机过了一段时间之后,就把我一半的课退掉了。

Console Log

由于Windows终端行数限制,Log被刷上去之后丢失了

Reproduce

如有必要,提供复现的步骤

网页版式错误

Check List

Version / Environment

System infomation: [ ] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [ ] ( run python3 --version )
AutoElective version: [ ] ( run python3 main.py --version )

Config

[course:general2]

name = **近现代史纲要
class = 5
school = 马克思主义学院

[course:general3]

name = 社会性别研究
class = 1
school = 社会学系

Issue Description

What

在使用过程中会有UnexceptedHTMLFormat encountered

Console Log

[INFO] loop, 15:23:18,
[INFO] loop, 15:23:18, > Current client: 1 (qsize: 2)
[INFO] loop, 15:23:18, > Client expired time: 2021-03-07 15:26:30
[INFO] loop, 15:23:18, User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36
[INFO] loop, 15:23:18,
[INFO] loop, 15:23:18, Get SupplyCancel page 1
[INFO] loop, 15:23:19, Page dump to elective.get_SupplyCancel_1615101799306.html
[ERROR] loop.error, 15:23:19, [104] unable to parse HTML content
[WARNING] loop, 15:23:19, UnexceptedHTMLFormat encountered

Reproduce

如有必要,提供复现的步骤

无法选取有空位的课

Check List

Version / Environment

System infomation: [Ubuntu 18 ]
Python version: [python3.6]
AutoElective version: [ 3.0.3] ( run python3 main.py --version )

Config

supply_cancel_page = 1
refresh_interval = 2
random_deviation = 0.2
iaaa_client_timeout = 30
elective_client_timeout = 60
elective_client_pool_size = 3
login_loop_interval = 2
debug_print_request = false
debug_dump_request = false

[monitor]

; host str
; port int

host = 127.0.0.1
port = 7074

Issue Description

What

无法选取有空位的课

Console Log

[INFO] loop, 10:59:11, Try to elect Course(JavaScript语言Web程序设计, 1, 信息科学技术学院, 90 / 58)
[INFO] loop, 10:59:11, Fetch a captcha
[ERROR] loop.error, 10:59:11, argmax() got an unexpected keyword argument 'axis'
Traceback (most recent call last):
File "/home/poi/Software/PKUAutoElective/autoelective/loop.py", line 380, in run_elective_loop
captcha = recognizer.recognize(r.content)
File "/home/poi/Software/PKUAutoElective/autoelective/captcha/recognizer.py", line 101, in recognize
code = ''.join( self._model.LABELS[ix] for ix in ylist.argmax(axis=1) )
TypeError: argmax() got an unexpected keyword argument 'axis'

Reproduce

elective.get_SupplyCancel()中抛出SystemException

在elective.get_SupplyCancel()中总是抛出SystemException异常

配置信息:
csv_coding = gbk
refresh_interval = 8
random_deviation = 0.2
iaaa_relogin_interval = 7200
iaaa_client_timeout = 30
elective_client_timeout = 60
debug_print_request = false
debug_dump_request = false

终端输出:
...
[INFO] loop, 13:51:10, Get SupplyCancel page
[ERROR] loop.error, 13:51:36, [310] 您尚未登录或者会话超时,请重新登录。
[WARNING] loop, 13:52:44, SystemException encountered
[INFO] loop, 13:53:58,
[INFO] loop, 13:53:58, ======== END Loop 3 ========
...

新验证码是gif(动态验证码)了,请问程序如何识别?谢谢!!

Check List

Version / Environment

System infomation: [ ] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [ ] ( run python3 --version )
AutoElective version: [ ] ( run python3 main.py --version )

Config

除了学号/密码外的其他配置

Issue Description

What

遇到的问题

Console Log

必要的终端输出信息

Reproduce

如有必要,提供复现的步骤

新版本什么时候公布呀?

Check List

Version / Environment

System infomation: [ ] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [ ] ( run python3 --version )
AutoElective version: [ ] ( run python3 main.py --version )

Config

除了学号/密码外的其他配置

Issue Description

What

遇到的问题

Console Log

必要的终端输出信息

Reproduce

如有必要,提供复现的步骤

运行一定几率抛出异常终止

昨晚和今天白天两次出现这种情况,运行到一半出现以下异常信息:
[INFO] loop, 09:30:11,
[INFO] loop, 09:30:11, ======== Loop 719 ========
[INFO] loop, 09:30:11,
[INFO] loop, 09:30:11, > Current tasks
[INFO] loop, 09:30:11, ------------------------------
[INFO] loop, 09:30:11, 01. Course(数据可视化, 0, 信息科学技术学院)
[INFO] loop, 09:30:11, 02. Course(凸优化, 0, 数学科学学院)
[INFO] loop, 09:30:11, ------------------------------
[INFO] loop, 09:30:11,
[INFO] loop, 09:30:11, > Current client: 1, (qsize: 3)
[INFO] loop, 09:30:11,
[INFO] loop, 09:30:11, Get SupplyCancel page 1
[ERROR] loop.error, 09:30:11, list index out of range
Exception in thread Elective:
Traceback (most recent call last):
File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner
self.run()
File "/usr/lib/python3.8/threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "/home/username/PKUAutoElective/autoelective/loop.py", line 621, in run_elective_loop
raise e
File "/home/username/PKUAutoElective/autoelective/loop.py", line 328, in run_elective_loop
plans = get_courses_with_detail(tables[0])
File "/home/username/PKUAutoElective/autoelective/parser.py", line 71, in get_courses_with_detail
name, class_no, school, status, _ = map(lambda ix: t[ix].xpath('.//text()')[0], ixs)
File "/home/username/PKUAutoElective/autoelective/parser.py", line 71, in
name, class_no, school, status, _ = map(lambda ix: t[ix].xpath('.//text()')[0], ixs)
IndexError: list index out of range

多门课可选时似乎不检查mutex

Check List

Version / Environment

System infomation: Ubuntu 18.04.4 LTS
Python version: Python 3.8.1
AutoElective version: 3.0.6

Config

已经修改过, 无法复原.
大体上是备选项中有很多体育课, 并将它们添加到同一mutex下, 而且只有这一mutex下有这些课.

Issue Description

What

在同时发现有多门体育课可选时, 在一个选课成功后仍继续试图选择其余课程.

Console Log

这是这一周期的输出.
全部输出我有存log, 如果需要可以提供, 但有971M大小.

Reproduce

config.ini中添加多个course, 并将它们添加到同一mutex下, 若它们同时可选, 则可能同时选上.

项目搬上服务器

兔佬详细指导步骤

准备工作

1.首先你得有个服务器,阿里云学生机就行

2.确保服务器的python版本为3以上

python --version  #查看版本

3.建议使用虚拟环境,使用教程 详细见 venv 模块

4.进行虚拟环境 详见教程的激活小章节

配置环境

5.一切和往常一样操作(只不过开发环境就局限于你之后部署的环境,非系统环境)

6.安转pytorch(见兔佬的readme)、安装依赖包、下载项目

7.编写config文件,见兔佬readme,这里有个注意点,选择班级的时候只需要输入1位,别输入两位
比如你的选课单上显示班级为00,你写0就能刷课,写00就刷不了课
给个课程模板:
[course: demo]
name = 自然辩证法概论
class = 0
school = 工学院

不停机刷课

8.这里就是关键,脱离shell,保证程序24小时不停刷课,具体命令nohup为:

#创建log文件夹,为了之后看脚本运行情况
mkdir log/
# 进行后台刷课,
nohup    python3 ./main.py   >./log/console.log 2>&1 &   # 这是针对个人刷课,帮他人刷课命令见下
nohup python3 ./main.py -c config/config.alice.ini  > ./log/console.alice.log 2>&1 &  # 配置文件为config.alice.ini 这个配置文件是alice的

查看项目运行情况

9.查看log文件

tail -f log/console.log

10.退出进程

# 首先查找
ps -ef | grep main

# 退出进程
kill -pid   (进程id)

感谢兔佬的悉心指导,刷课不易,且刷且珍惜

OperationFailedError encountered 疑似验证码出现错误?

Check List

Version / Environment

System infomation: [ MacOS 10.14.6]
Python version: [ 3.7.4] ( run python3 --version )
AutoElective version: [2.11 ] ( run python3 main.py --version )

Config

除了学号/密码外的其他配置
dual_degree = false
identity = bzx

supply_cancel_page = 1
refresh_interval = 3
random_deviation = 0.2
iaaa_client_timeout = 30
elective_client_timeout = 60
elective_client_pool_size = 5
login_loop_interval = 2
debug_print_request = false
debug_dump_request = false

Issue Description

What

遇到的问题
[WARNING] loop, 22:22:44, Unknown validation result: 1
[INFO] loop, 22:22:44, Fetch a captcha
[INFO] loop, 22:22:44, Recognition result: GMNp

必要的终端输出信息

Console Log[ERROR] loop.error, 22:22:53, Expecting value: line 5 column 1 (char 8)

[ERROR] loop.error, 22:22:53, [103] Unable to validate captcha
[WARNING] loop, 22:22:53, OperationFailedError encountered

Reproduce

如有必要,提供复现的步骤

最后一步运行时出现故障

Check List

Version / Environment

System infomation: [ MacOS 10.13.6] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [ python3 --version] ( run python3 --version )
AutoElective version: [ run main.py --version] ( run python3 main.py --version )

Config

除了学号/密码外的其他配置

Issue Description

What

遇到的问题

Console Log

Python 3.8.1 (v3.8.1:1b293b6006, Dec 18 2019, 14:08:53)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license()" for more information.

= RESTART: /Users/paul/Desktop/PKUAutoElective-ff035f740fe33859882d42857bca79dc5f595e70/main.py
Traceback (most recent call last):
File "/Users/paul/Desktop/PKUAutoElective-ff035f740fe33859882d42857bca79dc5f595e70/main.py", line 10, in
from autoelective.environ import Environ
File "/Users/paul/Desktop/PKUAutoElective-ff035f740fe33859882d42857bca79dc5f595e70/autoelective/environ.py", line 6, in
from .utils import Singleton
File "/Users/paul/Desktop/PKUAutoElective-ff035f740fe33859882d42857bca79dc5f595e70/autoelective/utils.py", line 10, in
from requests.compat import json
ModuleNotFoundError: No module named 'requests'
在这一步停止了,计算机小白求问解决方案……

必要的终端输出信息

Reproduce

如有必要,提供复现的步骤

只有在`补退选`标签下`选课计划中本学期可选列表`第一页的课程可以被选到,在第二页及以后页的课程` not in your course plan`

Check List

Version / Environment

System infomation: [ ] (Windows10 64bit)
Python version: [ ] (3.6.6)
AutoElective version: [ ] (4.0.1 )

Config

[course:1]

name=社会心理学
class=2
school=光华管理学院

Issue Description

What

只有在补退选标签下选课计划中本学期可选列表第一页的课程可以被选到,在第二页及以后页的课程 not in your course plan
这个课程在选课计划标签的第一页。

Console Log

必要的终端输出信息

Reproduce

File "C:\Users\me\Downloads\PKUAutoElective-master\autoelective\loop.py", line 393, in run_elective_loop raise UserInputException("%s is not in your course plan, please check your config." % c) autoelective.exceptions.UserInputException: Course(社会心理学, 2, 光华管理学院) is not in your course plan, please check your config.

如有必要,提供复现的步骤

【fork宣传】针对2021年秋季学期选课网API的升级 (beta)

2021年秋季学期选课网修改了SupplyCancel.do的逻辑,必须以SupplyCancel.do?xh=的形式进行请求。
除此之外,在补退选第一阶段的候补选课中试了一下,没有发现别的改动。
这一变化非常小,以至于我这种代码水平都可以撸出来,就几行的变动,没啥技术含量,但为了方便还是fork了,把自己的改动传了上来。
按照Rabbit的要求,并没有进行clone,直接搜搜不到,因此就来Issues里面宣传一下。
算是个beta版,不确定补退选第二阶段能不能完全work,到时候再看着改吧。
https://github.com/Chiyun-CHU/PKUAutoElective_updated

听树洞说不少刷课机把自己的课退了,想问频率控制在多少比较合适呢

听树洞说不少刷课机把自己的课退了,想问频率控制在多少比较合适呢……

Check List

Version / Environment

System infomation: [ ] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [ ] ( run python3 --version )
AutoElective version: [ ] ( run python3 main.py --version )

Config

除了学号/密码外的其他配置

Issue Description

What

遇到的问题

Console Log

必要的终端输出信息

Reproduce

如有必要,提供复现的步骤

'SVC' object has no attribute 'break_ties'

如果你仍然在使用 2.0.x 刷课机,并且使用了最新版的 sklearn ,那么你会遇到 sklearn 的版本错误。老版的 requirements.txt 中 sklearn 的版本未标示清楚,请你使用下述命令回滚 sklearn 版本

$ pip3 install -U scikit-learn==0.19.2

提示课程不在选课计划中

Check List

Version / Environment

System infomation: [ Windows10 64bit ]
Python version: [ python 3.8 ]
AutoElective version: [ v4.0.1 ]

Config

[client]

supply_cancel_page = 1
refresh_interval = 8
random_deviation = 0.2
iaaa_client_timeout = 30
elective_client_timeout = 60
elective_client_pool_size = 3
login_loop_interval = 2
debug_print_request = false
debug_dump_request = false

[monitor]

[course:lxxt]

name = 力学B类习题补充
class = 3
school = 信息科学技术学院

[course:dbq1]

name = 地板球
class = 1
school = 体育教研部

[course:dbq2]

name = 地板球
class = 2
school = 体育教研部

[course:tjq1]

name = 太极拳
class = 4
school = 体育教研部

[course:tjq2]

name = 太极拳
class = 3
school = 体育教研部

[course:tjq3]

name = 太极拳
class = 16
school = 体育教研部

[course:tjq4]

name = 太极拳
class = 2
school = 体育教研部

[course:tjq5]

name = 太极拳
class = 19
school = 体育教研部

[course:tjq6]

name = 太极拳
class = 20
school = 体育教研部

[course:tjq7]

name = 太极拳
class = 21
school = 体育教研部

[course:dyyys]

name = 导引与养生
class = 1
school = 体育教研部

Issue Description

What

地板球、太极拳、导引与养生这三门课程都在我的选课计划的第一页,但程序提示 "Course(XXX, X, XXXXX) is not in your course plan, please check your config." 我的 config 中的其他体育课都能正常刷课(如棒、垒球、汉字太极与养生课、体适能),但这三门课程不行,要把它们注释掉才能正常刷别的课。
image

Console Log

[INFO] loop, 19:54:23, #--------------------------------------------#
[INFO] loop, 19:54:23, # PKU Auto-Elective Tool v4.0.1 (2020.05.30) #
[INFO] loop, 19:54:23, #--------------------------------------------#
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23, ======== Loop 1 ========
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23, > Current tasks
[INFO] loop, 19:54:23, ------------------------------
[INFO] loop, 19:54:23, 01. Course(力学B类习题补充, 3, 信息科学技术学院)
[INFO] loop, 19:54:23, 02. Course(地板球, 1, 体育教研部)
[INFO] loop, 19:54:23, ------------------------------
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23, > Current client: 1, (qsize: 3)
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23, client: 1 needs Login
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23, Try to login IAAA (client: 1)
[INFO] loop, 19:54:23, ======== END Loop 1 ========
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23, ======== Loop 2 ========
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23, > Current tasks
[INFO] loop, 19:54:23, ------------------------------
[INFO] loop, 19:54:23, 01. Course(力学B类习题补充, 3, 信息科学技术学院)
[INFO] loop, 19:54:23, 02. Course(地板球, 1, 体育教研部)
[INFO] loop, 19:54:23, ------------------------------
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23, > Current client: 2, (qsize: 2)
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23, client: 2 needs Login
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23, ======== END Loop 2 ========
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23, ======== Loop 3 ========
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23, > Current tasks
[INFO] loop, 19:54:23, ------------------------------
[INFO] loop, 19:54:23, 01. Course(力学B类习题补充, 3, 信息科学技术学院)
[INFO] loop, 19:54:23, 02. Course(地板球, 1, 体育教研部)
[INFO] loop, 19:54:23, ------------------------------
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23, > Current client: 3, (qsize: 1)
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23, client: 3 needs Login
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:23, ======== END Loop 3 ========
[INFO] loop, 19:54:23,
[INFO] loop, 19:54:24, Login success (client: 1)
[INFO] loop, 19:54:24,
[INFO] loop, 19:54:24,
[INFO] loop, 19:54:24, IAAA login loop sleep 2.0 s
[INFO] loop, 19:54:24, ======== Loop 4 ========
[INFO] loop, 19:54:24,
[INFO] loop, 19:54:24,
[INFO] loop, 19:54:24, > Current tasks
[INFO] loop, 19:54:24, ------------------------------
[INFO] loop, 19:54:24, 01. Course(力学B类习题补充, 3, 信息科学技术学院)
[INFO] loop, 19:54:24, 02. Course(地板球, 1, 体育教研部)
[INFO] loop, 19:54:24, ------------------------------
[INFO] loop, 19:54:24,
[INFO] loop, 19:54:24, > Current client: 1, (qsize: 1)
[INFO] loop, 19:54:24,
[INFO] loop, 19:54:24, Get SupplyCancel page 1
[INFO] loop, 19:54:24, Get available courses
[ERROR] loop, 19:54:24, Course(地板球, 1, 体育教研部) is not in your course plan, please check your config.
[INFO] loop, 19:54:24,
[INFO] loop, 19:54:24, ======== END Loop 4 ========
[INFO] loop, 19:54:24, Main loop sleep 7.667335315068462 s
[INFO] loop, 19:54:24,
[INFO] loop, 19:54:26, Try to login IAAA (client: 2)
[INFO] loop, 19:54:26, Login success (client: 2)
[INFO] loop, 19:54:26,
[INFO] loop, 19:54:26, IAAA login loop sleep 2.0 s
[INFO] loop, 19:54:26,
[INFO] loop, 19:54:28, Try to login IAAA (client: 3)
[INFO] loop, 19:54:29, Login success (client: 3)
[INFO] loop, 19:54:29,
[INFO] loop, 19:54:29, IAAA login loop sleep 2.0 s
[INFO] loop, 19:54:29,
Exception in thread Elective:
Traceback (most recent call last):
File "C:\Users\George M\AppData\Local\Programs\Python\Python38\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "C:\Users\George M\AppData\Local\Programs\Python\Python38\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\George M\PKUAutoElective-master\autoelective\loop.py", line 554, in run_elective_loop
raise e
File "C:\Users\George M\PKUAutoElective-master\autoelective\loop.py", line 393, in run_elective_loop
raise UserInputException("%s is not in your course plan, please check your config." % c)
autoelective.exceptions.UserInputException: Course(地板球, 1, 体育教研部) is not in your course plan, please check your config.

Reproduce

如有必要,提供复现的步骤

当补选不在第一页的课时会出现bug

Check List

Version / Environment

System infomation: [ ] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [ ] ( run python3 --version )
AutoElective version: [ ] ( run python3 main.py --version )

Config

dual_degree = false
identity = bzx

supply_cancel_page = 4
refresh_interval = 5
random_deviation = 0.2
iaaa_client_timeout = 30
elective_client_timeout = 60
elective_client_pool_size = 2
elective_client_max_life = 600
login_loop_interval = 2
print_mutex_rules = true
debug_print_request = false
debug_dump_request = false

[course:ty]

name = 高尔夫
class = 1
school = 体育教研部

[course:ty2]

name = 体适能
class = 9
school = 体育教研部

[mutex:0]

courses = ty,ty2

[course:ss]

name = 死亡的社会学思考
class = 1
school = 社会学系

Issue Description

What

当补选不在第一页的课时会出现bug,而这些课确实是在相应的页数

Console Log

[INFO] loop, 11:17:33, #--------------------------------------------#
[INFO] loop, 11:17:33, # PKU Auto-Elective Tool v5.0.1 (2020.09.25) #
[INFO] loop, 11:17:33, #--------------------------------------------#
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, > User Agent
[INFO] loop, 11:17:33, ------------------------------
[INFO] loop, 11:17:33, pool_size: 6402
[INFO] loop, 11:17:33, ------------------------------
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, > Config
[INFO] loop, 11:17:33, ------------------------------
[INFO] loop, 11:17:33, is_dual_degree: False
[INFO] loop, 11:17:33, identity: bzx
[INFO] loop, 11:17:33, refresh_interval: 5.0
[INFO] loop, 11:17:33, refresh_random_deviation: 0.2
[INFO] loop, 11:17:33, supply_cancel_page: 4
[INFO] loop, 11:17:33, iaaa_client_timeout: 30.0
[INFO] loop, 11:17:33, elective_client_timeout: 60.0
[INFO] loop, 11:17:33, login_loop_interval: 2.0
[INFO] loop, 11:17:33, elective_client_pool_size: 2
[INFO] loop, 11:17:33, elective_client_max_life: 600
[INFO] loop, 11:17:33, is_print_mutex_rules: True
[INFO] loop, 11:17:33, ------------------------------
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, ======== Loop 1 ========
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, > Current tasks
[INFO] loop, 11:17:33, ------------------------------
[INFO] loop, 11:17:33, 01. Course(高尔夫, 1, 体育教研部)
[INFO] loop, 11:17:33, 02. Course(体适能, 9, 体育教研部)
[INFO] loop, 11:17:33, 03. Course(死亡的社会学思考, 1, 社会学系)
[INFO] loop, 11:17:33, ------------------------------
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, > Mutex rules
[INFO] loop, 11:17:33, ------------------------------
[INFO] loop, 11:17:33, 01. Course(高尔夫, 1, 体育教研部) --x-- Course(体适能, 9, 体育教研部)
[INFO] loop, 11:17:33, ------------------------------
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, > Current client: 1 (qsize: 2)
[INFO] loop, 11:17:33, > Client expired time: -1
[INFO] loop, 11:17:33, User-Agent: Mozilla/5.0 (Linux; Android 9; MI 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.81 Mobile Safari/537.36
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, client: 1 needs Login
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, Try to login IAAA (client: 1)
[INFO] loop, 11:17:33, ======== END Loop 1 ========
[INFO] loop, 11:17:33, User-Agent: Mozilla/5.0 (Linux; Android 10; VOG-AL10 Build/HUAWEIVOG-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2691 MMWEBSDK/200801 Mobile Safari/537.36
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, ======== Loop 2 ========
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, > Current tasks
[INFO] loop, 11:17:33, ------------------------------
[INFO] loop, 11:17:33, 01. Course(高尔夫, 1, 体育教研部)
[INFO] loop, 11:17:33, 02. Course(体适能, 9, 体育教研部)
[INFO] loop, 11:17:33, 03. Course(死亡的社会学思考, 1, 社会学系)
[INFO] loop, 11:17:33, ------------------------------
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, > Mutex rules
[INFO] loop, 11:17:33, ------------------------------
[INFO] loop, 11:17:33, 01. Course(高尔夫, 1, 体育教研部) --x-- Course(体适能, 9, 体育教研部)
[INFO] loop, 11:17:33, ------------------------------
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, > Current client: 2 (qsize: 1)
[INFO] loop, 11:17:33, > Client expired time: -1
[INFO] loop, 11:17:33, User-Agent: Mozilla/5.0 (Linux; Android 10; YAL-AL10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.101 Mobile Safari/537.36
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, client: 2 needs Login
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, ======== END Loop 2 ========
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, Login success (client: 1, expired_time: 2021-03-07 11:27:33)
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, IAAA login loop sleep 2.0 s
[INFO] loop, 11:17:33, ======== Loop 3 ========
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, > Current tasks
[INFO] loop, 11:17:33, ------------------------------
[INFO] loop, 11:17:33, 01. Course(高尔夫, 1, 体育教研部)
[INFO] loop, 11:17:33, 02. Course(体适能, 9, 体育教研部)
[INFO] loop, 11:17:33, 03. Course(死亡的社会学思考, 1, 社会学系)
[INFO] loop, 11:17:33, ------------------------------
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, > Mutex rules
[INFO] loop, 11:17:33, ------------------------------
[INFO] loop, 11:17:33, 01. Course(高尔夫, 1, 体育教研部) --x-- Course(体适能, 9, 体育教研部)
[INFO] loop, 11:17:33, ------------------------------
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, > Current client: 1 (qsize: 1)
[INFO] loop, 11:17:33, > Client expired time: 2021-03-07 11:27:33
[INFO] loop, 11:17:33, User-Agent: Mozilla/5.0 (Linux; Android 10; VOG-AL10 Build/HUAWEIVOG-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2691 MMWEBSDK/200801 Mobile Safari/537.36
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, Get Supplement page 4
[WARNING] loop, 11:17:33, IndexError encountered
[INFO] loop, 11:17:33, Get SupplyCancel first to prevent empty table returned
[INFO] loop, 11:17:33, Get Supplement page 4
[INFO] loop, 11:17:33, Get available courses
[ERROR] loop, 11:17:33, Course(高尔夫, 1, 体育教研部) is not in your course plan, please check your config.
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:33, ======== END Loop 3 ========
[INFO] loop, 11:17:33, Main loop sleep 4.011535216972663 s
[INFO] loop, 11:17:33,
[INFO] loop, 11:17:35, Try to login IAAA (client: 2)
[INFO] loop, 11:17:35, User-Agent: Mozilla/5.0 (Linux; Android 10; EML-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.81 Mobile Safari/537.36
[INFO] loop, 11:17:35, Login success (client: 2, expired_time: 2021-03-07 11:27:35)
[INFO] loop, 11:17:35,
[INFO] loop, 11:17:35,
[INFO] loop, 11:17:35, IAAA login loop sleep 2.0 s
[INFO] loop, 11:17:35,
Exception in thread Elective:
Traceback (most recent call last):
File "D:\python\lib\threading.py", line 954, in _bootstrap_inner
self.run()
File "D:\python\lib\threading.py", line 892, in run
self._target(*self._args, **self._kwargs)
File "D:\skj\autoelective\loop.py", line 631, in run_elective_loop
raise e
File "D:\skj\autoelective\loop.py", line 470, in run_elective_loop
raise UserInputException("%s is not in your course plan, please check your config." % c)
autoelective.exceptions.UserInputException: Course(高尔夫, 1, 体育教研部) is not in your course plan, please check your config.

Reproduce

如有必要,提供复现的步骤

NO TASKS

Check List

Version / Environment

System infomation: [ ] ( Windows10 64bit, MacOS 10.13.6, Ubuntu 18.04.3 amd64, ... )
Python version: [ ] ( run python3 --version )
AutoElective version: [ ] ( run python3 main.py --version )

Config

除了学号/密码外的其他配置

Issue Description

没有任务列表

What

[INFO] loop, 12:14:52, #--------------------------------------------#
[INFO] loop, 12:14:52, # PKU Auto-Elective Tool v3.0.4 (2020.02.17) #
[INFO] loop, 12:14:52, #--------------------------------------------#
[INFO] loop, 12:14:52,
[INFO] loop, 12:14:52,
[INFO] loop, 12:14:52, ======== Loop 1 ========
[INFO] loop, 12:14:52,
[INFO] loop, 12:14:52, No tasks
[INFO] loop, 12:14:52, Quit elective loop
[INFO] loop, 12:14:52, Quit IAAA loop

CONFIG 设置

filename: config.ini

coding: utf-8

[user]

; student_id string 学号
; password string 密码
; dual_degree boolean 是否为双学位账号,可选 (true, false, True, False, 1, 0)
; 住:只要你的账号在登录时需要选择 "主修/辅双" 身份,此处就需要设为 true
; identity string 双学位账号登录身份,可选 ("bzx","bfx") 对应于 "主修/辅双"

student_id = XXXXXXXXX
password = XXXXXXXXX
dual_degree = false
identity = bzx

[client]

; supply_cancel_page int 待刷课程处在选课计划的第几页
; refresh_interval float 每次循环后的暂停时间,单位 s
; random_deviation float 偏移量分数,如果设置为 <= 0 的值,则视为 0
; iaaa_client_timeout float IAAA 客户端最长请求超时
; elective_client_timeout float elective 客户端最长请求超时
; elective_client_pool_size int 最多同时保持几个 elective 的有效会话(同一 IP 下最多为 5)
; login_loop_interval float IAAA 登录线程每回合结束后的等待时间
; debug_print_request boolean 是否打印请求细节
; debug_dump_request boolean 是否将重要接口的请求以日志的形式记录到本地(包括补退选页、提交选课等接口)
;
; 关于刷新间隔的配置示例:
;
; refresh_interval = 8
; random_deviation = 0.2
;
; 则每两个循环的间隔时间为 8 * (1.0 ± 0.2) s

supply_cancel_page = 1
refresh_interval = 8
random_deviation = 0.2
iaaa_client_timeout = 30
elective_client_timeout = 60
elective_client_pool_size = 3
login_loop_interval = 2
debug_print_request = false
debug_dump_request = false

[monitor]

; host str
; port int

host = 127.0.0.1
port = 7074

;---------------- course ----------------;
;
; 课程结构定义:
;
; [course:${id}] ; 用户为该课程定义的 id
;
; name = ${name} ; elective 中的 课程名
; class = ${class} ; elective 中的 课号
; school = ${school} ; elective 中的 开课单位
;
;
; 例如:
;
; [course:math_3]
;
; name = 集合论与图论
; class = 3
; school = 信息科学技术学院
;
; 可以解析出:
;
; id = "math_3"
; name = "集合论与图论"
; class = 3
; school = "信息科学技术学院"
;
;
; 更多例子:
;
; [course:db]
;
; name = 数据库概论
; class = 1
; school = 信息科学技术学院
;
; [course:0]
;
; name = 概率统计 (A)
; class = 1
; school = 信息科学技术学院
;
;
; 注意:
;
; 1. [course:${id}] 中可以带空格,但是不推荐
; 例如 [course: 1], [course:math 1] [ course : hello world ]
; 可以解析出: "1", "math 1", "hello world"
; 2. [course:${id}] 中不要带有 ',' 否则会在后续规则定义中引入混乱! 不接受 ',' 转义
; 例如 [course:Hai,Alice] 是非法的,在解析时会被忽略
; 3. [course:${id}] 中可以带有 ':',但是不推荐
;
;----------------------------------------;

; [course:sb]
;
; name = 机器学习概论
; class = 1
; school = 信息科学技术学院

;---------------- mutex ----------------;
;
; 互斥规则结构定义:
;
; [mutex:${id}] ; 用户为该互斥规则定义的 id
;
; courses = ${cid1},${cid2},... ; 用户定义的多个课程的 id,以 ',' 分隔
;
;
; 例如:
;
; [course:math_1]
; ...
;
; [course:math_2]
; ...
;
; [course:math_3]
; ...
;
;
; [mutex:0]
;
; courses = math_1,math_2,math_3
;
; 可以解析出
;
; id = "0"
; courses = ["math_1", "math_2", "math_3"]
;
;
; 解释:
;
; 同一个互斥规则内的课程一旦有一门课已经被选上,其他课程将会被自动忽略。
; 例如,对于上述例子,如果 math_1, math_2, math_3 有任何一门课已经被选上,其它两门课将会被自动忽略
; 例如,当 math_1 被选上时,math_2, math_3 会被自动忽略
;
;
; 注意:
;
; 1. [mutex:${id}] 的命名注意事项同 course
; 2. courses 中可以有空格,但是不推荐
; 例如 courses = math_1, math_2 , math_3
; 仍可以解析出 ["math_1", "math_2", "math_3"]
;
;---------------------------------------;

; [mutex:sample]
;
; courses = course_id_1,course_id_2

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.