Skip to content

Instantly share code, notes, and snippets.

@oxyflour
Created September 25, 2015 06:05
Show Gist options
  • Save oxyflour/82f01511c802daff4247 to your computer and use it in GitHub Desktop.
Save oxyflour/82f01511c802daff4247 to your computer and use it in GitHub Desktop.
some auto booking scripts (of course no longer working)
# -*- 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&currentDate=%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&currentDate=%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&currentDate=%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