Skip to content

Commit

Permalink
v0.4.0
Browse files Browse the repository at this point in the history
  • Loading branch information
MXWXZ committed Feb 28, 2020
1 parent d810054 commit e26a855
Show file tree
Hide file tree
Showing 9 changed files with 58 additions and 38 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
v0.4.0 2020-02-28
1. 教务系统更新修复

v0.3.2 2019-06-12
1. 教务系统更新修复

Expand Down
18 changes: 10 additions & 8 deletions Protocol analysis v2.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,12 @@ Jaccount 登陆&选课协议分析 V2
- **V2版选课系统很不错,不像V1版的反人类,可以直接向系统提交选课了,且容错性挺强,妈妈再也不用担心我一步一步模拟人类操作啦~**

### 登陆
地址:`http://i.sjtu.edu.cn/jaccountlogin`\
地址:`https://i.sjtu.edu.cn/jaccountlogin`\
返回:302重定向
- 多次302跳转到Jaccount认证

### 主界面
地址:`http://i.sjtu.edu.cn/xtgl/index_initMenu.html?jsdm=&_t=xxx`\
地址:`https://i.sjtu.edu.cn/xtgl/index_initMenu.html?jsdm=&_t=xxx`\
参数:
- `jsdm`:未知参数,不加似乎无影响
- `_t`:应该是时间戳,不加似乎无影响
Expand All @@ -63,26 +63,28 @@ Jaccount 登陆&选课协议分析 V2
V2版采用AJAX无刷新技术,比之前不知道高到哪里去了,因此除了汉语拼音命名让人不知所云外分析较为方便。

#### 无关紧要的界面元素
- 主界面:`http://i.sjtu.edu.cn/xsxk/zzxkyzb_cxZzxkYzbIndex.html?gnmkdm=N253512&layout=default&su=xxx`
- 课程显示:`http://i.sjtu.edu.cn/xsxk/zzxkyzb_cxZzxkYzbDisplay.html?gnmkdm=N253512&su=xxx`
- 已选信息:`http://i.sjtu.edu.cn/xsxk/zzxkyzb_cxZzxkYzbChoosed.html?gnmkdm=N253512&su=xxx`
- 主界面:`https://i.sjtu.edu.cn/xsxk/zzxkyzb_cxZzxkYzbIndex.html?gnmkdm=N253512&layout=default&su=xxx`
- 课程显示:`https://i.sjtu.edu.cn/xsxk/zzxkyzb_cxZzxkYzbDisplay.html?gnmkdm=N253512&su=xxx`
- 已选信息:`https://i.sjtu.edu.cn/xsxk/zzxkyzb_cxZzxkYzbChoosed.html?gnmkdm=N253512&su=xxx`

GET参数:
- `gnmkdm`:菜单栏选项,`N253512`即为选课。
- `su`:学号

#### 搜索接口
地址:`http://i.sjtu.edu.cn/xsxk/zzxkyzb_cxZzxkYzbPartDisplay.html?gnmkdm=N253512&su=xxx`
地址:`https://i.sjtu.edu.cn/xsxk/zzxkyzb_cxZzxkYzbPartDisplay.html?gnmkdm=N253512&su=xxx`

POST参数:\
太多了不想列举了,没啥卵用。

#### 选课接口
地址:`http://i.sjtu.edu.cn/xsxk/zzxkyzb_xkBcZyZzxkYzb.html?gnmkdm=N253512&su=xxx`\
地址:`https://i.sjtu.edu.cn/xsxk/zzxkyzb_xkBcZyZzxkYzb.html?gnmkdm=N253512&su=xxx`\
必须参数(经过测试可以省略的就不写了):
- `jxb_ids`:32位课号ID
- `kch_id`:课程号ID
- `jxb_ids`:256位课号ID,似乎是实时获取的
- `xkkz_id`:未知ID,和选课轮数有关,同一轮,同一课程类型为定值。
- `sxbj`:未知定值1(是否已选上?)
- `qz`:未知定值0
- `njdm_id`:年级级数。
- `zyh_id`:专业号ID。

Expand Down
20 changes: 12 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
# sjtu-automata
![Version](https://img.shields.io/badge/Version-0.3.2-blue.svg) ![Language](https://img.shields.io/badge/Language-Python3-red.svg) ![License](https://img.shields.io/badge/License-GPL--3.0-yellow.svg)
![Version](https://img.shields.io/badge/Version-0.4.0-blue.svg) ![Language](https://img.shields.io/badge/Language-Python3-red.svg) ![License](https://img.shields.io/badge/License-GPL--3.0-yellow.svg)

**注意!此版本为BETA版,未经过严格测试,可能存在BUG,如有问题请提交[issue](https://github.com/MXWXZ/AutoElect/issues)**

**由于教务系统更新,v0.4.0为临时解决版本,周末会优化用户体验**
**v0.4.0更新:教务系统限制大约在30-60分钟左右可能需要重新登陆,暂时未解决,待周末重构。**

上海交通大学抢课脚本\
V2协议分析:<https://github.com/MXWXZ/sjtu-automata/blob/master/Protocol%20analysis%20v2.md>

Expand Down Expand Up @@ -45,13 +48,13 @@ Ubuntu 18.04:
- 插件安装完成后点击这里进入脚本安装页面:https://github.com/MXWXZ/sjtu-automata/raw/master/sjtu-automata.user.js
- 下面的教程以安装插件之后为准,如果不安装油猴脚本也可以自行查看网页源码提取相关ID

1. 查看课号:想选的课“教学班”第二行的32位字符串即为唯一课号
1. 查看课程号和教学班:想选的课“教学班”第二行点击复制ID即可复制课号+教学班号
2. 查看课程类型:标签页第二行的字符串即为课程类型
3. 使用命令选课,格式为`autoelect [课程类型ID] [32位课号ID]`
3. 使用命令选课,格式为`autoelect [课程类型ID] [课程号ID] [256位教学班ID]`

autoelect 01 BCDEFGHIJKLMNOPQRSTUVWXYZ1234567 10 DEFGHIJKLMNOPQRSTUVWXYZ123456789
autoelect 01 AAAA... aaaa... 10 BBBB bbbb...

上述命令将会选`01`课程类型下的`BCDEFGHIJKLMNOPQRSTUVWXYZ1234567`课和`10`课程类型下的`DEFGHIJKLMNOPQRSTUVWXYZ123456789`课,如果需要更多可以在后面继续添加。
上述命令将会选`01`课程类型下的`AAAA`课的`aaaa`(省略256位)教学班和`10`课程类型下的`BBBB`课的`bbbb`(省略256位)课,如果需要更多可以在后面继续添加。

注:程序运行过程中输入`s`可以查看选课状态

Expand All @@ -63,7 +66,7 @@ Ubuntu 18.04:

## 参数说明
### CLI
使用:`autoelect [OPTIONS] [CLASSTYPE-CLASSID]`
使用:`autoelect [OPTIONS] [CLASSTYPE-CLASSID-JXBID]`

| 参数 | 长参数形式 | 说明 |
| :---: | :------------: | :----------------------------: |
Expand All @@ -76,6 +79,7 @@ Ubuntu 18.04:
| -n | --number | 每个课程的线程数(默认为1) |
| -h | --help | 显示帮助 |

- `CLASSTYPE``CLASSID`成对出现,可以出现多对同步进行,但至少有一对
- `CLASSTYPE`32位课程类型ID
- `CLASSTYPE`、``CLASSID``JXBID`成组出现,可以出现多组同步进行,但至少有一组
- `CLASSTYPE`2位课程类型
- `CLASSID`:课号ID
- `JXBID`:256位教学班ID
16 changes: 12 additions & 4 deletions sjtu-automata.user.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// ==UserScript==
// @name sjtu-automata
// @namespace http://tampermonkey.net/
// @version 1.2
// @version 1.3
// @description show classid under classname.
// @author MXWXZ
// @match *://i.sjtu.edu.cn/xsxk/zzxkyzb_cxZzxkYzbIndex.html*
Expand Down Expand Up @@ -64,8 +64,7 @@ function waitForKeyElements(selectorTxt, actionFunction, bWaitOnce, iframeSelect
}

function showid(node) {
let id = node.children().children()[0].innerHTML;
node.children('.jxbmc').append('<p>' + id + '</p>');
node.children('.jxbmc').append('<br><button type="button" class="btn btn-primary btn-sm" onclick="copyid(this)">复制ID</button>');
}

function showid2(node) {
Expand All @@ -76,6 +75,11 @@ function showid2(node) {
'use strict';

if (location.href.indexOf("zzxkyzb_cxZzxkYzbIndex") > -1) {
var script = document.createElement("script");
script.type = "text/javascript";
script.appendChild(document.createTextNode("function copyid(t) {const el = document.createElement('textarea');el.value =t.parentNode.parentNode.childNodes[2].innerHTML+' '+t.parentNode.parentNode.childNodes[1].innerHTML;document.body.appendChild(el);el.select();document.execCommand('copy');document.body.removeChild(el);alert(\"copy ok\");}"));
document.body.appendChild(script);

let node = $('.nav.nav-tabs.sl_nav_tabs li');
node.each(function () {
let str = $(this).children('a')[0].getAttribute("onclick");
Expand All @@ -84,12 +88,16 @@ function showid2(node) {
$(this).append('<p>' + str.substr(str.indexOf("this,'") + 6, pos2 - pos1 - 6) + ' &nbsp;</p>');
});
waitForKeyElements('.body_tr', showid, false);
} else if(location.href.indexOf("viewFunc_cxDesignFuncPageIndex") > -1) {
}
/*
To be fix
else if(location.href.indexOf("viewFunc_cxDesignFuncPageIndex") > -1) {
$('[id$=_jxb_id]').show();
$('[id$=_jxb_id]').css('width','270px');
let row=$('.jqgfirstrow').children('td:eq(1)');
row.show();
row.css('width','270px');
waitForKeyElements("[aria-describedby$='_jxb_id']", showid2, false);
}
*/
})();
2 changes: 1 addition & 1 deletion sjtu_automata/__version__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
__description__ = 'Auto elect script for SJTUer.'
__url__ = 'https://github.com/MXWXZ/sjtu-automata'
__update_url__ = 'https://raw.githubusercontent.com/MXWXZ/sjtu-automata/master/version'
__version__ = '0.3.2'
__version__ = '0.4.0'
__author__ = 'MXWXZ'
__author_email__ = '[email protected]'
__license__ = 'GNU General Public License v3 (GPLv3)'
Expand Down
18 changes: 10 additions & 8 deletions sjtu_automata/autoelect.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def login(self, ocr, delay):
"""
echoinfo('Login to your JAccount:')
self.session = login(
'http://i.sjtu.edu.cn/jaccountlogin', ocr)
'https://i.sjtu.edu.cn/jaccountlogin', ocr)

self.studentid = get_studentid(self.session)
if not self.studentid:
Expand All @@ -62,10 +62,10 @@ def login(self, ocr, delay):
echoinfo('Login successful!')
return True

def __elect_thread(self, tid, classtype, classid, delay):
def __elect_thread(self, tid, classtype, classid, jxbid, delay):
while self.status[tid] == 2 or self.status[tid] == 4 or self.status[tid] == -1:
ret = elect_class(self.session, self.studentid,
self.params, classtype, classid)
self.params, classtype, classid, jxbid)
with self.tl[tid]:
if self.status[tid] != 0 and self.status[tid] != 1 and self.status[tid] != 3:
self.status[tid] = ret
Expand All @@ -74,10 +74,10 @@ def __elect_thread(self, tid, classtype, classid, delay):
break
sleep(delay)

def add_elect(self, number, classtype, classid, delay):
def add_elect(self, number, classtype, classid, jxbid, delay):
for i in range(number):
self.tp.append(threading.Thread(
target=self.__elect_thread, args=(self.id, classtype, classid, delay,)))
target=self.__elect_thread, args=(self.id, classtype, classid, jxbid, delay,)))
self.tl.append(threading.Lock())
self.tclass.append(classid)
self.status.append(-1)
Expand All @@ -88,6 +88,7 @@ def start_elect(self):
for i in self.tp:
i.daemon = True
i.start()
echoinfo('Task running! Input "s" to view status.')

def __parse_status(self, tid, status):
with self.glock:
Expand Down Expand Up @@ -166,7 +167,7 @@ def cli(no_update, ocr, print_cookie, delay, check_delay, number, classtypeid):
exit()

# check argument
if len(classtypeid) % 2 != 0:
if len(classtypeid) % 3 != 0:
echoerror('CLASSTYPE and CLASSID should in pair!')
exit()

Expand All @@ -175,8 +176,9 @@ def cli(no_update, ocr, print_cookie, delay, check_delay, number, classtypeid):
exit()
if print_cookie:
ui.print_cookie()
for i in range(0, len(classtypeid), 2):
ui.add_elect(number, classtypeid[i], classtypeid[i + 1], delay)
for i in range(0, len(classtypeid), 3):
ui.add_elect(
number, classtypeid[i], classtypeid[i + 1], classtypeid[i + 2], delay)
ui.start_elect()
cmd = threading.Thread(target=ui.get_input)
cmd.daemon = True
Expand Down
2 changes: 1 addition & 1 deletion sjtu_automata/credential.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ def login(url, useocr=False):
sleep(3)
continue
captcha_id += get_timestamp()
captcha_url = 'https://jaccount.sjtu.edu.cn/jaccount/captcha?'+captcha_id
captcha_url = 'https://jaccount.sjtu.edu.cn/jaccount/captcha?' + captcha_id
code = _bypass_captcha(session, captcha_url, useocr)

sid = re_search(r'sid" value="(.*?)"', req)
Expand Down
15 changes: 8 additions & 7 deletions sjtu_automata/electsys/automata.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def get_studentid(session):
"""
params = {'jsdm': '', '_t': get_timestamp()}
req = _request(
session, 'GET', 'http://i.sjtu.edu.cn/xtgl/index_initMenu.html', params=params)
session, 'GET', 'https://i.sjtu.edu.cn/xtgl/index_initMenu.html', params=params)
return re_search(r'sessionUserKey" value="(.*?)"', req)


Expand All @@ -69,10 +69,10 @@ def get_params(session, studentid):
"""
params = {'gnmkdm': 'N253512', 'layout': 'default', 'su': studentid}
req = _request(
session, 'GET', 'http://i.sjtu.edu.cn/xsxk/zzxkyzb_cxZzxkYzbIndex.html', params=params)
session, 'GET', 'https://i.sjtu.edu.cn/xsxk/zzxkyzb_cxZzxkYzbIndex.html', params=params)
xkkz_id = {}
xkkz = re.findall(
r'\'(.*?)\',\'(.*?)\'\)" role="tab" data-toggle="tab">', req)
r'\'(.*?)\',\'(.*?)\',\'.*?\',\'.*?\'\)" role="tab" data-toggle="tab">', req)
for i in xkkz:
xkkz_id[i[0]] = i[1]

Expand All @@ -81,7 +81,7 @@ def get_params(session, studentid):
return {'xkkz_id': xkkz_id, 'njdm_id': njdm_id, 'zyh_id': zyh_id}


def elect_class(session, studentid, params, classtype, classid):
def elect_class(session, studentid, params, classtype, classid, jxbid):
"""Elect class.
Directly elect class.
Expand All @@ -93,18 +93,19 @@ def elect_class(session, studentid, params, classtype, classid):
params: dict, get_params returned
classtype: str, class type
classid: str, class id
jxbid: str, jxb id
Returns:
int, 0 for success, 1 for time conflict, 2 for full, 3 for param error, 4 for other.
"""
if classtype not in params['xkkz_id']:
return 3
post_params = {'gnmkdm': 'N253512', 'su': studentid}
data = {'jxb_ids': classid, 'xkkz_id': params['xkkz_id'][classtype],
'njdm_id': params['njdm_id'], 'zyh_id': params['zyh_id'], 'sxbj': 1}
data = {'kch_id': classid, 'jxb_ids': jxbid, 'xkkz_id': params['xkkz_id'][classtype],
'njdm_id': params['njdm_id'], 'zyh_id': params['zyh_id'], 'sxbj': 1, 'qz': 0}

req = _request(
session, 'POST', 'http://i.sjtu.edu.cn/xsxk/zzxkyzb_xkBcZyZzxkYzb.html', params=post_params, data=data)
session, 'POST', 'https://i.sjtu.edu.cn/xsxk/zzxkyzb_xkBcZyZzxkYzb.html', params=post_params, data=data)

if '{"flag":"1"}' in req:
return 0
Expand Down
2 changes: 1 addition & 1 deletion version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.3.2
0.4.0

0 comments on commit e26a855

Please sign in to comment.