- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python Requests模拟登录实现图书馆座位自动预约由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例为大家分享了Python实现图书馆座位自动预约的具体代码,供大家参考,具体内容如下 。
配置 。
通过公网主机定时运行脚本,并发送邮件到自己的qq邮箱,这样在微信就会有消息提示是否预约成功 。
vim /etc/crontab 。
设置每到早上7:01自动运行脚本即可 。
程序流程 。
(以yuyue.juneberry.cn网站为例) 。
要点 。
函数解释 。
代码及注释 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
# /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):
"""
拿到<input type='hidden'>的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
'<h5 id="MessageTip">已经存在有效的预约记录。</h5>'
in
text:
self
.clear_error_once(
'[done!] You already ordered a seat!'
)
elif
'<h5 id="MessageTip">选择的日期不允许预约。</h5>'
in
text:
self
.clear_error_once(
'[done!] Date is wrong!'
)
elif
'<h5 id="MessageTip">所选座位已经被预约。</h5>'
in
text:
self
.clear_error_once(
'[done!] This seat is not available, maybe taken by others!'
)
elif
'<h5 id="MessageTip">座位预约成功'
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
])
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/cd_xuyue/article/details/50996681 。
最后此篇关于Python Requests模拟登录实现图书馆座位自动预约的文章就讲到这里了,如果你想了解更多关于Python Requests模拟登录实现图书馆座位自动预约的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想做的是,如果鼠标位于“下一个”按钮上,它会以慢速向右滚动,如果鼠标没有位于“下一个”按钮上,它会停止滚动? 这是我的尝试http://jsfiddle.net/mdanz/nCCRy/14/ $(
StyleCop 是一个很棒的视觉工作室小插件。但它不会向您显示实时提示或提供任何自动修复。 随之而来的是 reSharper 和 StyleCop for reSharper,这是理想的解决方案,但
我为我的MatchQuery使用了模糊性选项,但是我想将模糊性值设置为auto。有什么办法吗? 另外,对于完成建议程序,您可以将其设置为支持unicode,对于我的MatchQuery,有什么方法可以
我想从表中获取一行[字符串名称,字符串密码,int 某些内容]并将其映射到一个 User 对象,该对象具有 3 个属性,如上面的 getter 和 setter有什么方法可以自动完成吗?我考虑过反射,
我有一个像这样的方法:void m1(string str) 并且有一个像这样的类: public class MyClass { public bool b1 { set; get; }
我正在尝试使用 $rootScope 从一个 Controller 向另一个 Controller $broadcast 一些数据。 如果我使用像 ng-click 这样的触发器来运行将广播的功能,它
我考虑了很多关于是要使用完全自动化的缓存还是手动缓存。 我们的自动方法是一种解决方案,它可以挖掘数据库、查询和格式化每个潜在和 future 的数据请求,并将其保存到适当的缓存存储(内存缓存或基于磁盘
我的 CSS 必须使用过渡来更改,直到现在我都使用 div:hover 来实现。 当您单击另一个 div 时需要激活过渡,而不是当您将鼠标悬停在必须移动/更改的 div 上时。 我该怎么做? 谢谢 永
在我的应用程序中,我需要一些动画,但如果它已经设置了动画,则不需要持续时间。但我的问题是它会自动添加持续时间。 在这里你可以看到 2 个函数,第二个没有持续时间但它确实有持续时间(可能从 1 秒开始)
两年前,我需要制作一个工具,通过 POST 自动将 txt/csv 文件上传到我的 Web 服务器,然后使用 cronjob 通过 PHP 对其进行解析。 这有两次在每天午夜自动发生。尽管这行得通,但
请阅读下面程序中的评论: #include void test(char c[]) { c=c+2; //why does this work ? c--; printf("%
也许是个幼稚的问题,但是...... 确认或拒绝: 自动和静态存储持续时间的对象/变量的内存的存在是在编译时确定的,程序运行时失败的可能性绝对为零,因为没有足够的内存用于自动对象。 自然地,当自动对象
有没有什么方法可以自动获得类中属性更改的通知,而不必在每个 setter 中都编写 OnPropertyChanged? (我有数百个属性,我想知道它们是否已更改)。 安东建议 dynamic pro
我们在使用 Azure DevOps 的项目中采用了 gitflow 流程。我有以下场景: 当功能分支合并到 Develop 时,我想在完成拉取请求的同时执行压缩合并策略 当 Release 分支定期
我的网站上有一个评论部分,我将 html 编码的评论保存在我的数据库中。所以我添加了这条评论- "testing" `quotes` \and backslashes\ and html 并将其保存在
是否存在“ checkin 前 TFS 自动 checkout ”这样的功能,以便在我说“ checkin ”之前我不会 checkout 任何文件,例如以防我只是临时更改文件 - 这一直发生。 换句
我有一个运行在 Linux/Apache/Tomcat 堆栈上的网站,它需要每隔几个月自动脱机以进行服务器维护,这将持续任意时间。有哪些选项可以让 Apache 建立和取消“服务器维护”页面? 我需要
我经常在工作中创建文档,在公司内部,由于我们使用的首字母缩写词和缩写词的数量,我们几乎拥有自己的语言。因此,我厌倦了在发布文档之前手动创建首字母缩写词和缩写表,并且快速的谷歌搜索发现了一个可以有效地为
我希望在用户或宏将计算模式从自动更改为手动或手动更改为自动时运行代码。是否有为此触发的事件? (属性是 Application.Calculation 在 Excel 互操作中。) 使用 Excel
这个问题在这里已经有了答案: Repeat command automatically in Linux (13 个回答) 6年前关闭。 我想创建一个脚本来获取另一个文件夹中的所有文件夹名称。并为这些
我是一名优秀的程序员,十分优秀!