一個月前開始準備雅思考試司光,計劃等題刷得差不多了之后悉患,挑一場時間合適離家近的考試報名。前幾天去了趟外地忘了報名的事兒售躁,結果今天打開報名網(wǎng)站一看才發(fā)現(xiàn)已經(jīng)過了八月份前三場的報名deadline,只剩29號一場。更頭疼的是29號的所有考場都寫著名額暫滿揩局,沒有考位了掀虎。
果斷百度一下,有人說每天早上六點早起開刷烹玉,怕一直刷下去鍵盤上花鍵+R兩個鍵受不了驰怎。親自動手不行就把這個任務outsource出去吧,結果淘寶了一下代刷考位報價幾百塊外加上交用戶名密碼县忌,為了考個試把用戶名密碼身份證住址全泄漏出去,成本恐怕太高症杏。如此只好擼擼袖子瑞信,親自動手豐衣足食~
首先去雅思報名的網(wǎng)站上看了一眼。登陸http://ielts.etest.edu.cn/逼友,點左側的考位查詢,打開Chrome的開發(fā)者工具箱帜乞,隨便查了一下下個月北京的考位,在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鍵值登錄后在開發(fā)者工具里找
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 主函數(shù)蛉加,把結果打印在屏幕上,\033[... 用到Console里的顏色和字體屬性
main()
#程序入口针饥,到此代碼完畢
按需修改開頭標志的參數(shù)之后,在終端運行python main.py即可修肠,程序會自動返回查詢的考位狀態(tài)户盯。至此還需按照自己的需求添加循環(huán)和提醒功能饲化。循環(huán)非常簡單吗伤,提醒的機制包括Sina App Engine的短信提醒、連接Weibo API發(fā)微博之類巢块,一旦發(fā)現(xiàn)有考場從 No Seat 變成 Book Seat 就及時發(fā)出提醒巧号,趕快去交錢報名。
BTW丹鸿,簡書吃掉Python的縮進,從這里復制的代碼還需自己理清下邏輯打打Tab廊敌。
https://github.com/DuPupu/Get-IELTS-Seat-CN
最后祝大家早日搶到考位,烤鴨愉快~