Created
September 25, 2015 06:05
-
-
Save oxyflour/82f01511c802daff4247 to your computer and use it in GitHub Desktop.
some auto booking scripts (of course no longer working)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: gbk -*- | |
import os, sys, urllib, urllib2, cookielib, random, re, datetime | |
# uis username, uis password, phone number | |
userinfo = [ \ | |
# [studentID, password, phoneNumber], | |
] | |
# the desired date (year, month, day) | |
reqdate = datetime.date(2015, 5, 6) | |
# the days this script should be executed before desired date, usually 7 (one week ahead) | |
reqahead = 7 | |
# select field type and begin time (if not empty strings) | |
reqtype = '标场' | |
reqbegin = [ \ | |
'19:00', \ | |
'20:00', \ | |
] | |
# view order here | |
#http://www.elife.fudan.edu.cn/pcenter/orderflow/userBoxAction.action | |
# cancel order here | |
#http://www.elife.fudan.edu.cn/pcenter/orderflow/userBoxAction!doCancel.action?orderid=%s % orderId | |
# !!!!! do not change anything below !!!!! | |
dirname = os.path.dirname(os.path.abspath(__file__)) | |
posturl = 'http://www.elife.fudan.edu.cn' | |
srvId = 'ff8080813a3f43bc013a4356fdee0015' | |
catId = 'ff8080813a3f4447013a4351c1dd000b' | |
def findone(rs, t): | |
if type(rs) == type([]): | |
t = findone(rs.pop(), t) | |
return findone(rs if len(rs) > 1 else rs[0], t) | |
else: | |
f = re.findall(rs, t) | |
return f[0] if len(f) else "" | |
def saveres(f, r): | |
fh = open(dirname+os.sep+f+".html", "w") | |
t = ''.join(r.readlines()) | |
fh.write(t) | |
fh.close() | |
return t | |
def readres(f): | |
fh = open(dirname+os.sep+f+".html", "r") | |
t = fh.read() | |
fh.close() | |
return t | |
def log(s): | |
print datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+' -- '+s | |
cj = cookielib.LWPCookieJar(dirname+os.sep+'cookie') | |
#if os.path.exists(cj.filename): | |
# log('cookie loaded') | |
# cj.load(None, True, True) | |
opener = urllib2.build_opener( | |
# this proxy handler is for test only | |
urllib2.ProxyHandler({'http':'127.0.0.1:8888'}), | |
urllib2.HTTPRedirectHandler(), | |
urllib2.HTTPHandler(debuglevel=0), | |
urllib2.HTTPSHandler(debuglevel=0), | |
urllib2.HTTPCookieProcessor(cj) | |
) | |
opener.addheaders = [ | |
# ('Proxy-Connection', 'keep-alive'), | |
('Connection', 'keep-alive'), | |
('Host', 'www.elife.fudan.edu.cn'), | |
# ('Cache-Control', 'max-age=0'), | |
# ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), | |
('Accept', 'text/html, application/xhtml+xml, */*'), | |
# ('User-Agent', 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31'), | |
('User-Agent', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)'), | |
# ('Content-Type', 'application/x-www-form-urlencoded'), | |
# ('Accept-Encoding', 'gzip,deflate,sdch'), | |
('Accept-Encoding', 'gzip,deflate'), | |
# ('Accept-Language', 'en-US,en;q=0.8'), | |
('Accept-Language', 'zh-CN'), | |
# ('Accept-Charset', 'gb18030,utf-8;q=0.7,*;q=0.3'), | |
] | |
# retrive cookie & try login | |
#def trylogin(): | |
# resp = opener.open('http://uis1.fudan.edu.cn/amserver/UI/Login') | |
# if saveres('test', resp).find('<input type="password" name="IDToken2"') >= 0: | |
# dologin(username, password) | |
# else: | |
# log('logined') | |
# | |
def dologin(username, password): | |
cj.clear() | |
# we have to login again | |
data = urllib.urlencode({'IDToken0':'', \ | |
'IDToken1':username, \ | |
'IDToken2':password, \ | |
'IDButton':'Submit', \ | |
'goto':'', \ | |
'encoded':'false', \ | |
'inputCode':'', \ | |
'gx-charset':'UTF-8'}) | |
resp = opener.open('http://uis1.fudan.edu.cn/amserver/UI/Login?goto=http://www.elife.fudan.edu.cn/', data) | |
saveres('login', resp) | |
cj.save(None, True, True) | |
log('login again as %s' % username) | |
# these are order entries | |
#resp = opener.open('http://www.portal.fudan.edu.cn/applyBaseView.do?applyId=178651') | |
#resp = opener.open('http://www.elife.fudan.edu.cn/ordinary/meta/serviceContentAction!getContentList.action?id=%s' % srvId) | |
# fetch res Id from order list | |
def list(date): | |
# resp = opener.open(posturl+'/ordinary/meta/serviceResourceAction.action?serviceContent.id=%s¤tDate=%s' % (srvId, date)) | |
# ls = re.compile(r"checkUser\('(\w+)','([\w:]+)','([\w:]+)'\)").findall(saveres('list'+date, resp)) | |
# if not len(ls): | |
# log('no appointment at this date') | |
# else: | |
# log("\n".join("%s: %s - %s" % l for l in ls)) | |
# # simply get the first one | |
# resId, beginTime, endTime = ls[0] | |
# return ls | |
def add_rs(rs, text): | |
ls = re.findall(r'<tr class="site_tr">(.*?)</tr>', text, re.S) | |
for l in ls: | |
typ = findone(r'class="site_td3" width="15%">([^<]+)<', l).decode("utf-8") | |
inf = findone(r"checkUser\('(\w+)','([\w:]+)','([\w:]+)'\)", l) | |
if inf: | |
rs.append({'type':typ, 'resId':inf[0], 'begin':inf[1], 'end':inf[2]}) | |
rs = [] | |
resp = opener.open(posturl+'/ordinary/meta/serviceResourceAction.action?serviceContent.id=%s¤tDate=%s' % (srvId, date)) | |
text = saveres('list'+date, resp); | |
pages = findone([r':1/(\d+)', r'class="t_flip"([^<]+)<'], text.decode("utf-8")) | |
pages = pages and int(pages) or 1 | |
log('got page 1/%d' % pages) | |
add_rs(rs, text) | |
for i in range(1, pages): | |
resp = opener.open(posturl+'/ordinary/meta/serviceResourceAction.action?serviceContent.id=%s¤tDate=%s&pageBean.pageNo=%d' % (srvId, date, i+1)) | |
text = saveres('list'+date+' - '+str(i+1), resp); | |
add_rs(rs, text) | |
return rs | |
# do post | |
def request(username, date, begin, end, resId, telephone): | |
# fetch order form | |
resp = opener.open(posturl+'/order/meta/porder!loadOrderForm_ordinary.action?serviceContent.id=%s&serviceCategory.id=%s&serviceResource.id=%s' % (srvId, catId, resId)) | |
text = saveres('form', resp) | |
user = findone([r'value="([^"]+)"', r'<[^>]+id="basic_user"[^>]+\/>'], text).decode("utf-8") | |
depa = findone([r'value="([^"]+)"', r'<[^>]+id="basic_department"[^>]+\/>'], text).decode("utf-8") | |
log('user: %s, depa: %s' % (user.encode('gbk'), depa.encode('gbk'))) | |
# order submit | |
data = urllib.urlencode({ | |
'serviceResource.id': resId, \ | |
'serviceOrders.appointTime': date, \ | |
'serviceContent.id': srvId, \ | |
'serviceCategory.id': catId, \ | |
'orderuser': user.encode("utf-8"), \ | |
'endTime': end, \ | |
'beginTime': begin, \ | |
'serviceOrders.mobile': telephone, \ | |
'serviceOrders.phone': '021', \ | |
'serviceOrders.department': depa.encode("utf-8"), \ | |
'serviceOrders.note': ''}) | |
resp = opener.open(posturl+'/order/meta/porder!doSave.action?op=order', data) | |
saveres('result('+username+')'+date, resp) | |
# resp = opener.open(posturl+'/pcenter/orderflow/userBoxAction!execute.action', data) | |
# saveres('resultx('+username+')'+date, resp) | |
if __name__ == '__main__': | |
if datetime.date.today() == reqdate + datetime.timedelta(-reqahead): | |
for username, password, telephone in userinfo: | |
dologin(username, password) | |
date = "%s-%s-%s" % (reqdate.year, reqdate.month, reqdate.day) | |
ids = [] | |
rs = list(date) | |
log('got %s res' % len(rs)) | |
for r in rs: | |
if reqtype and r["type"] != reqtype.decode("gbk"): | |
continue | |
if len(reqbegin) and not (r["begin"] in reqbegin): | |
continue | |
if r["resId"]: | |
ids.append(r) | |
for id in ids: | |
log('got id (%s)' % id) | |
request(username, date, id['begin'], id['end'], id['resId'], telephone) | |
else: | |
log('today free!') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment