我如何使用 Python 自动化枯燥的大学生活
大家好,
我是来自印度的计算机科学专业二年级本科生。我热爱 Python。这是我在 dev.to 社区发表的第一篇文章。那就开始吧!
我的大学有一个通用学生登录系统,学生可以在这里查看个人资料、上传作业、获取截止日期、下载课程资料等等。 但是这个网站浏览起来有点繁琐,所以我决定用 Python 来自动化这些枯燥的工作。其中之一就是作业提醒服务。
就本文而言,您需要了解一些 Web 请求-响应模型的工作原理以及一些简单的 Python 知识。它将分为两部分。
开始吧!
提醒服务
第一年的时候,由于我的懒惰,我经常错过一些数字作业的上传。
为了解决这个问题,我学习了用 Python 进行网页抓取。
这是我发现有用的资源:
https://www.dataquest.io/blog/web-scraping-tutorial-python/
一旦我学会了如何使用 BeautifulSoup 和 Requests 库,就很清楚了,如果我们依次模拟浏览器的操作,我们就可以处理我们得到的 HTML/JSON 响应。
我还想告诉大家,在我大一的时候,我开发了一个针对学生登录验证码的破解器。验证码如下所示:
我在 Dev.to 上写了一篇简单的文章,解释了我是如何做到的。你可以在我的 GitHub 个人资料中找到这个仓库。链接
如下。
Chrome 开发者工具非常方便,我使用了其中的网络监视器。
我的逻辑如下:
- 打开网站,并在开发者工具中打开网络监视器选项卡。
- 观察正在发送的请求及其详细信息(标题、表单数据、URL、方法)
- 例如,如果请求如下所示:
method = POST,
form-data = {'uname': "username", 'passwd' "password"},
url = "https://example.com/login",
headers = {"User-Agent":"blah blah"}
- 我使用 Python 模拟了该请求。因此,用 Python 语法编写的请求如下:
import requests
from bs4 import BeautifulSoup
response = requests.post(
"https://example.com/login", # URL
{'username': "username", 'password' "password"}, # form-data
headers = {"User-Agent":"blah blah"}, # headers
verify=False # this simply disables SSL security check
)
root = BeautifulSoup(response.text, "html.parser")
print(root.prettify()) # pretty prints the response HTML
- 这样,我就能获取 HTML 内容,然后编写几行代码导航到作业页面。完成后,我使用了BeautifulSoup,一个 Python 的解析库。
- BeautifulSoup 的作用是将 HTML 响应解析成树状结构,如果我想导航到下一级分支,可以直接跳转到下一个子节点,以此类推。文档链接在上面提到了。
- 解析每个链接后,将以字典列表格式返回所有待处理作业的列表。
- 接下来要做的就是将其与Google 日历 API同步。文档非常到位,而且非常容易理解和操作。快速入门指南足以帮助您入门。
- 编写了一些进行健全性检查的代码行,最后通过创建事件来请求谷歌日历 API,代码如下所示。
# Refer to the Python quickstart on how to setup the environment:
# https://developers.google.com/calendar/quickstart/python
# Change the scope to 'https://www.googleapis.com/auth/calendar' and delete any
# stored credentials.
event = {
'summary': 'Data Structures Assignment - 1',
'description': 'Theory Assessment',
'start': {
'dateTime': '2018-03-28T09:17:30+05:30',
'timeZone': 'Asia/Kolkata', # my timezone
},
'end': {
'dateTime': '2018-03-28T17:18:30+05:30', # 12 midnight is the deadline
'timeZone': 'Asia/Kolkata',
},
'recurrence': [
'RRULE:FREQ=DAILY;COUNT=1'
],
'reminders': {
'useDefault': False,
'overrides': [
{'method': 'email', 'minutes': 24 * 60}, # a day before start
{'method': 'popup', 'minutes': 100}, # 100 minutes before start
],
},
}
event = service.events().insert(calendarId='primary', body=event).execute()
print 'Event created: %s' % (event.get('htmlLink'))
- 我将这段代码包装成一个函数,并为每个待处理的任务调用该函数,将事件添加到我的日历中。
- 瞧!我所有的作业截止日期都显示在日历上了,我可以在手机上查看它们。我的主屏幕小部件如下所示:
-
除此之外,我还开发了一个 Chrome 扩展程序,可以自动破解验证码并填充文本框。它还可以管理从大学网站下载的内容,根据课程代码和院系名称进行分类,并整理到相应的文件夹中。
课程资源页面的外观: 不使用扩展程序时下载内容的保存方式: 使用扩展程序下载时下载内容的保存方式: -
你可以查看扩展页面,它有超过1500名用户,都是我大学的学生。学习使用JavaScript构建应用程序非常有趣!
奖金!
虽然是部分自动化的,但你还是可以看看的!非常实用。
为了提高效率,我计划使用Google Sheets 的每日计划模板。这基本上是一个为期一周的活动图表,以日期为列,以时间为行。
我当前的一周是这样的: 红色区域表示我当时没空。
这样做的好处是,由于我的时间表整个学期都保持不变,我只需要每个周日晚上花15分钟左右的时间,规划好一周的安排即可。
现在,我想要的是将它同步到谷歌日历,这样我就能在手机上看到我的安排了。我使用的方法如下:
- 填写时间表。填写时,请相应地调整时间。在顶部栏中,导航至“工具”->“脚本编辑器”。
- 脚本编辑器适用于 Google Scripts,可让您创建 JavaScript 函数,以便在使用 Google 应用 API 时执行。以下是您可以使用的示例代码片段。请注意,我们将使用同一模板的索引。
var cal = CalendarApp.getDefaultCalendar();
var dayOffset = 0; // replace this with the loop index
var currSheet = SpreadsheetApp.getActiveSheet(); // gets the currently active sheet
var startTimeString = currSheet.getRange(row, column).getValue() // replace row and column with desired values
var startTime = new Date(startTimeString);
startTime.setDate(startTime.getDate() + dayOffset);
var endTime = new Date(startTimeString);
endTime.setDate(startTime.getHour() + 1);
var title = currSheet.getRange(row, column).getValue(); // specify the row and column of the cell
cal.createEvent(title, startTime, endTime); // creates the event in calendar and syncs it
}
- 这只是一个示例代码片段,但你应该能理解。你可以根据需要进行调整,循环使用它来同步所有时间。我把它硬编码了,因为我懒得去看一些 API。
- 这是我的代码,只需稍加改动即可用于模板 - 时间行不在宏中而是字符串,因此我使用这个简单的公式将它们转换为宏:
=C2 + 0.0416666 * <hour_number>
这里,C2 是当前周的单元格。要调整单元格的属性,请点击单元格,然后转到索引单元格正上方的宏部分。 如果小时数是 8,则它将等于上午 8:00。我对所有其他时间都做了同样的更改,因为我想按小时进行拆分。这是我现在使用的脚本。“0.041666”基本上是一天的 1/24 = 1 小时。
function myFunction() {
var cal = CalendarApp.getDefaultCalendar();
var currSheet = SpreadsheetApp.getActiveSheet();
var times = currSheet.getRange("B6:B20").getValues()
var weekDate = currSheet.getRange("C2").getValue()
var columns = ["C","D","E","F","G","H","I"]
var offSet = 6;
var totalDays = 7;
var totalRows = 15;
for(var i = 0; i < totalDays ; i++) {
var column_no = columns[i] + "5:" + columns[i] + "20";
var schedule = currSheet.getRange(column_no).getValues();
for(var j = 0; j < totalRows; j++) {
var startTime = new Date(times[j]);
startTime.setDate(startTime.getDate() + i);
var title = currSheet.getRange(columns[i] + (offSet + j).toString()).getValue();
if(title === ""){
continue;
}
var startTZoffSet = 240; // adjust hour in timezone
var endTZoffSet = 180; // adjust hour in timezone
var correctedStart = new Date(startTime.getTime() + (60000*(startTime.getTimezoneOffset() - startTZoffSet)));
var correctedEnd = new Date(startTime.getTime() + (60000*(startTime.getTimezoneOffset() - endTZoffSet)));
cal.createEvent(title, correctedStart, correctedEnd);
}
}
}
我运行了这个脚本,所有事件都同步到我的谷歌日历。
这就是我在大学里实现一些自动化的方法。如果您有什么需要我帮忙的,或者您有什么建议,请在评论区告诉我!
文章来源:https://dev.to/presto412/how-i-automated-the-boring-university-stuff-with-python-5gib