• 写了一个预约东南大学体育场馆的python脚本,目前刚刚实现功能,后续会继续完善


    看到git上有人写了一个自动预约的脚本,正好前段时间在学python爬虫和脚本,索性也写了一个,大佬直接略过。

    目前没有做图形化,账号和预约信息也是手动输入的,我也只写了羽毛球和乒乓球,其实就是一个属性的值。嫌麻烦的同学可以写一个文本文件,保存这些信息,然后倒入到脚本里,每次稍作修改就可以了。如果基友固定的话,也可以写死在脚本里。

    本篇博客只说下博主写脚本的时候遇到的问题和心路历程,只是想要代码的可以直接忽略下文,代码已经上传github:https://github.com/CooperXxx/seuScript。

    本脚本需要urllib、PIL、pytesseract等模块,没有的同学先安装一下。

    第一步:登陆个人信息门户 

    首先是登陆个人门户,一般是从和这个接口登陆,https://newids.seu.edu.cn/authserver/login?goto=http://my.seu.edu.cn/index.portal,但是发现这个登陆接口的表单密码是加密处理的,还有一些属性不知道是什么,也猜测不出来。

    所以博主找到了另一个预约场馆的登陆接口:http://ids1.seu.edu.cn/amserver/UI/Login,这个表单就非常简单了,每个key也都可以猜测到是什么意思。

    使用urllib构建POST请求,并模拟浏览器登陆:

    //构建POST请求中的提交信息和URL

    url='http://ids1.seu.edu.cn/amserver/UI/Login'

    userid = input("输入学号:")
    password = input("输入密码:")

    postdata1 = urllib.parse.urlencode({
    'IDToken1':userid, 
    'IDToken2':password,
    'IDButton':'Submit',
    'goto':'http://yuyue.seu.edu.cn/eduplus/order/initOrderIndex.do?sclId=1',
    'gx_charset':'utf-8'
    }).encode('utf-8')

    //构建Request,模拟浏览器请求,登陆

    req = urllib.request.Request(url,postdata1)

    req.add_header("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36")

    cjar = http.cookiejar.CookieJar()
    opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
    urllib.request.install_opener(opener)

    data = opener.open(req).read()

    注意:登陆需要验证证书,不然会出错,所以之前加上:

    ssl._create_default_https_context = ssl._create_unverified_context

    且ssl需要引用。

    第二步:识别验证码和构建预约表单

    使用google浏览器的开发者工具寻找表单页面: 

    这里发现了可以直接打开的预约表单页面:

    http://yuyue.seu.edu.cn/eduplus/order/order/initEditOrder.do?sclId=1&dayInfo=2018-11-23&itemId=7&time=12:00-13:00

    和验证码的URL:

    http://yuyue.seu.edu.cn/eduplus/control/validateimage

    验证码获取和识别:

    urllib.request.urlretrieve('http://yuyue.seu.edu.cn:80/eduplus/control/validateimage', 'validateimage.jpg') 
    img = Image.open('validateimage.jpg')
    s = pytesseract.image_to_string(img)

    使用urllib获取到了验证码图片,再用pytesseract识别。因为验证码实在是太简单了,所以直接就能识别。(不知道pytesseract是什么的童鞋,自行百度)

    才发现自己吧验证码down到本地了,不过懒得改了,嘻嘻。下次再说。

    还是用开发者工具寻找处理表单请求的URL:

    judgeUseUser.do:这个请求是用来判断表单信息是否合法的,其实在脚本里可以跳过。

    insertOrder.do:这才是真正的处理表单信息的请求,URL:http://yuyue.seu.edu.cn/eduplus/order/order/order/insertOredr.do?sclId=1

    表单里面的属性,大家自己去看吧,注意其中有个邀请人ID和学号是不一样的,比如我的室友的ID是120542,但是这个属性又是必须有的,所以你要自己用谷歌开发者工具或者抓包软件自己去找一下。

    下面构建表单请求并且执行:

    reservetime = input("输入想要预约的时间(格式:2018-11-25 09:00-10:00):")

    item = input("输入数字7或者9(7代表乒乓球,10代表羽毛球):")
    inuserid = input("输入被邀请人ID(不是学号,需要自己去查,例如120542代表谢龙龙):")
    phone = input("输入手机号:")

    postdata2 = urllib.parse.urlencode({
    'orderVO.useTime':reservetime,
    'orderVO.itemId':item,
    'orderVO.useMode':'2',
    'useUserIds':inuserid,
    'orderVO.phone':phone,
    'validateCode':s,
    }).encode('utf-8')

    url2="http://yuyue.seu.edu.cn/eduplus/order/order/order/insertOredr.do?sclId=1"
    req2 = urllib.request.Request(url2,postdata2)
    req2.add_header("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36")
    data = opener.open(req2).read()

    print(data)

    最后如果打印出没有空余场地就是没场地了,

    print出success就是成功预约啦,拿来玩的童鞋记得去系统里取消预约哦,

    print其他东西就是出错了哦。

    最后的最后,有问题的可以给博主留言,

    有问题的妹子,可以加博主的微信(xwd2363)哦。嘻嘻。

    本脚本只作为学习练习的试手,不做任何其他目的。

  • 相关阅读:
    配置samba
    extern c
    剑指offer 孩子们的游戏
    剑指offer 扑克牌顺子
    剑指offer 翻转单词顺序列
    剑指offer 左旋转字符串
    mysql查看或显示当前存在多少数据库
    vim替换
    平衡二叉树
    将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
  • 原文地址:https://www.cnblogs.com/CooperXia-847550730/p/10006205.html
Copyright © 2020-2023  润新知