python图书馆抢座_Python-Requests模拟登录-实现图书馆座位自动预约
# /bin/python
# -*- coding:utf-8 -*-
import time
import sys
import requests
from bs4 import BeautifulSoup
from mail import sendmail
__author__ = 'xy'
# 主类
class FUCK():
def __init__(self, username, password, seatNO, mailto):
""" 以四个参数初始化,用户名,密码,要预约的座位号,接受预约结果提醒邮件的邮箱 """
self.username = username
self.password = password
self.seatNO = seatNO
self.mailto = mailto
self.base_url = 'http://yuyue.juneberry.cn'
self.login_url = 'http://yuyue.juneberry.cn'
self.order_url = self._get_order_url()
self.login_content = ''
self.middle_content = ''
self.final_content = ''
self.s = requests.session() # 创建可传递cookies的会话
# post data for login
self.data1 = {
'subCmd': 'Login',
'txt_LoginID': self.username, # S+学号
'txt_Password': self.password, # 密码
'selSchool': 60, # 60表示北京交通大学
}
# post data for order a seat
self.data2 = {
'subCmd': 'query',
}
# 自定义http头,然而我在程序里并没有使用
self.headers = {
'Connection': 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded',
}
self.login()
self.run()
self._is_success(self.final_content)
# 怀疑程序出错时,取消下行注释,可打印一些参数
# self._debug()
def _get_date_str(self):
s = time.localtime(time.time())
########333
date_str = str(s.tm_year) + '%2f' + str(s.tm_mon) + '%2f' + str(s.tm_mday + 1)
date_str = date_str.replace('%2f1%2f32', '%2f2%2f1') \
.replace('%2f2%2f29', '%2f3%2f1') \
.replace('%2f3%2f32', '%2f4%2f1') \
.replace('%2f4%2f31', '%2f5%2f1') \
.replace('%2f5%2f32', '%2f6%2f1') \
.replace('%2f6%2f31', '%2f7%2f1') \
.replace('%2f7%2f32', '%2f8%2f1') \
.replace('%2f8%2f32', '%2f9%2f1') \
.replace('%2f9%2f31', '%2f10%2f1') \
.replace('%2f10%2f32', '%2f11%2f1') \
.replace('%2f11%2f31', '%2f12%2f1') \
.replace('%2f12%2f32', '%2f1%2f1')
return date_str
def _get_order_url(self):
return "http://yuyue.juneberry.cn/BookSeat/BookSeatMessage.aspx?seatNo=101001" + self.seatNO + "&seatShortNo=01" + self.seatNO + "&roomNo=101001&date=" + self._get_date_str()
def _get_static_post_attr(self, page_content, data_dict):
""" 拿到的post参数,并添加到post_data中 """
soup = BeautifulSoup(page_content, "html.parser")
for each in soup.find_all('input'):
if 'value' in each.attrs and 'name' in each.attrs:
data_dict[each['name']] = each['value'] # 添加到login的post_data中
# self.data2[each['name']] = each['value'] # 添加到order的post_data中
return data_dict
def _debug(self):
print self.order_url
print self.data1
print self.data2
print self.headers
print self.s.cookies
# print self.login_content
# print self.middle_content
print self.final_content
def login(self):
homepage_content = self.s.get(self.base_url).content
self.data1 = self._get_static_post_attr(homepage_content, self.data1)
r = self.s.post(self.login_url, self.data1)
self.login_content = r.content
def run(self):
# 这个get的意思是:原先的cookie没有预约权限,
# 访问这个get之后,会使cookie拥有预约权限,从而执行下一个post
self.middle_content = self.s.get('http://yuyue.juneberry.cn/BookSeat/BookSeatListForm.aspx').content
# 经测试,这个post只需要一个subCmd的参数就可以正常返回,因此不必根据get内容更新post参数
# self.data2 = self._get_static_post_attr(middle_content, self.data2)
# 这个post请求完成了预约功能!
r = self.s.post(self.order_url, self.data2)
self.final_content = r.content
def _is_success(self, text):
""" 接受最终的html内容,判断是否成功,并触发日志记录和邮件提醒 """
if '
已经存在有效的预约记录。
' in text:
self.clear_error_once('[done!] You already ordered a seat!')
elif '
选择的日期不允许预约。
' in text:
self.clear_error_once('[done!] Date is wrong!')
elif '
所选座位已经被预约。
' in text:
self.clear_error_once('[done!] This seat is not available, maybe taken by others!')
elif '
座位预约成功' in text:
self.clear_error_once('[done!] Success! An email is sending to you!')
sendmail.send_mail('BJTU Library Seat_NO:' + self.seatNO + 'ordered!',
'Sending by robot. Do not reply this mail!', self.mailto)
else:
self.error_log_once('Error! 302 to login page')
def error_log_once(self, text='default error (once)'):
try:
is_error_file = open('./isopen_xy.txt', 'r')
except:
is_error_file = open('./isopen_xy.txt', 'w')
if '1' not in is_error_file.read():
print 'writting error to log...'
self.error_log(text)
else:
print 'already written to log'
is_error_file.close()
sendmail.send_mail('BJTU_Library system error once !', 'error text!')
def error_log(self, text='default error'):
is_error_file = open('./isopen_xy.txt', 'w')
is_error_file.write('1\n')
is_error_file.close()
f = open("./log_xy.txt", 'a')
f.write(time.strftime("%Y-%m-%d %X", time.localtime()) + text + '\n')
f.close()
def clear_error_once(self, text='success'):
print text
is_error_file = open('./isopen_xy.txt', 'w')
is_error_file.write('0\n')
is_error_file.close()
if __name__ == '__main__':
if len(sys.argv) < 5:
print 'Usage: python library.py [username] [password] [seat_NO] [email]'
print 'eg. python library.py S13280001 123456 003 XXXX@qq.com\n'
print 'Any problems, mail to: i[at]cdxy.me'
print '#-*- Edit by cdxy 16.03.24 -*-'
sys.exit(0)
else:
FUCK(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])
python图书馆抢座_Python-Requests模拟登录-实现图书馆座位自动预约相关推荐
- python图书馆抢座_python模拟表单提交登录图书馆
本文实例为大家分享了python模拟登录图书馆的具体代码,供大家参考,具体内容如下 模拟表单提交的原理: 我们都知道Http是无状态的,所以当我们提交的数据和浏览器中正常提交一样,那么服务器就会返回和 ...
- python 网站发送验证码_Python爬虫模拟登录带验证码网站
爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法.python提供了强大的url库,想做到这个并不难.这里以登录学校教务系统为例,做一个简单的例子. 首先得明白cookie的作用, ...
- python京东注册账号_Python爬虫模拟登录京东获取个人信息
先上我的代码.参考了上面链接的文章# -*- coding: utf-8 -*- # !/usr/bin/python import os import urllib2 import urllib i ...
- 学校图书馆抢座 Python完成
脚本实现 使用postman对图书馆抢座系统的一个或者多个接口进行分析. 找到接口返回参数和需要参数之间的联系,实现登录与抢座的大体思路. 第二步是全部工作的重点和难点,解决了第二步,代码基本功能就能 ...
- .net session 有效时间_Python中requests模拟登录的三种方式(携带cookie/session进行请求网站)...
这篇文章主要介绍了python中requests模拟登录的三种方式(携带cookie/session进行请求网站),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋 ...
- python图书馆抢座代码_“我去图书馆”公众号代码抢座的实现
因为要考研嘛,想去图书馆.我们学校是早上六点开抢,同学们太猛,我每天5点50起床抢,都不太抢的到想要的座位,于是我就花了个两三天琢磨着怎么用代码来实现这个抢座,目前已经完成,虽然因为微信的那个sess ...
- (图书馆抢座助手)利用jsoup实现学校图书馆自习室预约系统
(图书馆抢座助手)利用jsoup实现学校图书馆自习室预约系统 写在前面 之前在图书馆约座,总是需要半夜十二点抢座,有时候还抢不到座位,带来了一些困扰,于是便萌生了写一个app可以自动约座.想到了之前学 ...
- Python爬虫 | 图书馆公众号座位自动预约【从0到1】
引言 图书馆座位太难预约了! Case 1:抢座开始时间点,网堵,页面卡顿. Case 2:疫情期间,24小时书房每天仅有50个座位可预约. Case 3:可能有其他事情耽搁了,忘记抢座,稍晚点回来, ...
- 图书馆研习室座位自动预约
图书馆研习室座位自动预约 简介 现在好多学校为学生提供了非常良好的学习环境,通常体现在自习教室的设施设备上.对此不得不提一句的就是我们学校的图书馆,随着新图书馆的修建,馆内也设置了多个功能区,每层分为 ...
- python 提交表单登录不成功_Python http requests模拟登录与提交表单的实现问题
以前写小应用只写过简单的http请求,最近有一些需要复杂的实现,遇到一些问题,还希望得到大家指点. 我的疑问点在于如何实现模拟登录,cookie应该可以实现,但是每台pc的cookie不同,我想有一个 ...
最新文章
- 记录计算顺子(12,3,4或者9,0,1,2)的方法
- 武装机器狗不会自主杀人,监管自主杀伤性武器是政府的事,机器狗公司CEO这样说...
- pythonmainoffset_python之(22)基础总结(5)
- ASP.NET Core 简单实现七牛图片上传(FormData 和 Base64)
- awk按ip统计日志数
- 慎用window.showModalDialog()
- FocusBI:租房分析可视化(PowerBI网址体验)
- python gil锁_python GIL锁
- Android8.0前后Camera架构对比(二十三)
- [zt] HTTP 协议及其POST与GET操作差异 C#中如何使用POST、GET等
- a标签的CSS伪类,点击后变色
- leetcode-120-Triangle-等腰三角形
- android获取截屏图片大小,【Android】android获取长图截屏(显示之外的也要)
- 【目标检测-YOLO】YOLO v2总结
- php strpos 编码问题,php-关于strpos的问题。 如何获得第二次出现的字符串?
- AI相关英语词汇(持续更新)
- Mac 活动监视器 闪退 打不开
- 2017第九届北京空气净化及水净化、北京国际节能减排展览会会刊
- 青柠开车Spring Cloud(七) —— 断路器 Hystrix
- 七天百度飞桨强化学习心得
热门文章
- 【优化选址】基于matlab遗传算法求解多城市多应急物流中心选址优化问题【含Matlab源码 H001期】
- 【图像去噪】基于matlab邻域的自适应小波阈值图像去噪【含Matlab源码 1188期】
- 【图像修复】基于matlab GUI空域滤波图像复原【含Matlab源码 849期】
- SPSS 项目分析(图文+数据集)【SPSS 032期】
- ai 文案_AI是UX文案的未来吗?
- 优先体验重播matlab_如何为深度Q网络实施优先体验重播
- java 反射 框架_Java——利用反射实现框架类
- python:画混淆矩阵
- figure函数--Matplotlib
- You must depend on an EXACT version of electron-prebuilt-compile not a range (got ^4.0.0)