亲自动手,用Python刷雅思考位

872 查看

一个月前开始准备雅思考试,计划等题刷得差不多了之后,挑一场时间合适离家近的考试报名。前几天去了趟外地忘了报名的事儿,结果今天打开报名网站一看才发现已经过了八月份前三场的报名deadline,只剩29号一场。更头疼的是29号的所有考场都写着名额暂满,没有考位了。

果断百度一下,有人说每天早上六点早起开刷,怕一直刷下去键盘上花键+R两个键受不了。亲自动手不行就把这个任务outsource出去吧,结果淘宝了一下代刷考位报价几百块外加上交用户名密码,为了考个试把用户名密码身份证住址全泄漏出去,成本恐怕太高。如此只好撸撸袖子,亲自动手丰衣足食~

首先去雅思报名的网站上看了一眼。登陆http://ielts.etest.edu.cn/,点左侧的考位查询,打开Chrome的开发者工具箱,随便查了一下下个月北京的考位,在Network里抓到了JSON的URL:

http://ielts.etest.edu.cn/myHome/<UID>/queryTestSeats?queryMonths=2015-08&queryProvinces=11&neeaAppId=&productId=IELTSPBT

心乐之,于是在JS Console里调戏了半天,但总在JS刷新过后遇到瓶颈。果断换Python,世界清爽,代码如下:

#coding=utf-8

#编码字符集

Month='2015-08'

# 11: Beijing

# 44: Guangdong

Province='11' 

UID='12345678'

#配置月份、城市和账号的UID,依照JSON URL的格式。

#月份可以查询一个月的比如 2015-08 或两个月的如 2015-08%2C2015-09

#城市代码 11是北京,44是广东

sessiondict={}

sessiondict['BIGipServerhw_ielts_internal_pool']='<...>'

sessiondict['JSESSIONID']='<...>'

sessiondict['_ga']='<...>'

# Configure your cookie here

#因为JSON的调用需要浏览器预先登陆验证,所以这里需要配置好Cookie伪装成用户浏览器中的点击。具体的Cookie键值登录后在开发者工具里找

sessiondict['domain_name_edu']='ielts.etest.edu.cn'

sessiondict['domain_name_net']='ielts.etest.net.cn'

sessiondict['domain_port_http']='80'

sessiondict['domain_port_https']='443'

sessiondict['locale']='zh_CN'

#无需配置的Cookie键

import requests

#依赖包

def getHtml(url):

user_agent = ( 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko/20100101 Firefox/22.0' )

global sessiondict

session = requests.session()

session.headers['User-Agent'] = user_agent

session.headers["Connection"] ="close"

session.cookies.update(sessiondict)

r=session.get(url)

return r.content

#function getHtml 抓取JSON

def main():

global Month

global UID

global Province

html = getHtml("http://ielts.etest.edu.cn/myHome/%s/queryTestSeats?queryMonths=%s&queryProvinces=%s&neeaAppId=&productId=IELTSPBT"%(UID,Month,Province))

html=html.replace('null','None')

a=eval(html)

for each in a:

for i in a[each]:

if i['optStatusEn']=="No Seat":

print '\033[1;37;41m ',i['optStatusEn'],' \033[0m-',i['adminDate'],'-',i['centerNameEn']

else:

print '\033[1;37;42m',i['optStatusEn'],'\033[0m-',i['adminDate'],'-',i['centerNameEn']

# function main 主函数,把结果打印在屏幕上,\033[... 用到Console里的颜色和字体属性

main()

#程序入口,到此代码完毕


按需修改开头标志的参数之后,在终端运行python main.py即可,程序会自动返回查询的考位状态。至此还需按照自己的需求添加循环和提醒功能。循环非常简单,提醒的机制包括Sina App Engine的短信提醒、连接Weibo API发微博之类,一旦发现有考场从 No Seat 变成 Book Seat 就及时发出提醒,赶快去交钱报名。

BTW,简书吃掉Python的缩进,从这里复制的代码还需自己理清下逻辑打打Tab。

源代码已送上GitHub,在这里也可找到:

https://github.com/DuPupu/Get-IELTS-Seat-CN


最后祝大家早日抢到考位,烤鸭愉快~