Привет!

В моем колледже есть обычный студент - вход в систему, где студенты могут просматривать свой профиль, загружать задания, узнавать сроки выполнения, загружать материалы курса и т. Д.

Но навигация по сайту довольно утомительна, и поэтому я решил использовать python для автоматизации этого скучного материала. Одна из них - служба напоминаний о назначении.

Что касается этой статьи, вам нужно немного узнать о том, как работает модель веб-запрос - ответ, и простые знания Python. Он будет разделен на две части.
Начинаем!

Служба напоминаний

Поскольку я был в целом ленивым человеком, были определенные досадные случаи, когда я пропускал загрузку заданий. Чтобы противостоять этому, я изучил веб-парсинг с помощью Python.

Это ресурс, который я нашел полезным:
https://www.dataquest.io/blog/web-scraping-tutorial-python/

Когда я узнал, как использовать библиотеки BeautifulSoup и Requests, стало совершенно ясно, что если мы последовательно имитируем то, что делает браузер, мы можем работать с получаемыми нами ответами HTML / JSON.

Я также хотел бы, чтобы вы знали, что в качестве проекта на первом курсе я разработал взломщик для Captcha, который присутствует в учетной записи студента. Капча выглядит так:

Я написал простую статью, объясняющую, как я это сделал, здесь на 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 Calendar API. Документация актуальна, ее довольно легко понять и реализовать. Краткого руководства более чем достаточно, чтобы начать работу.
  • Написал несколько строк кода, которые проверяют работоспособность и, наконец, запрашивают API календаря Google, создавая событие, и код выглядит так.
# 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, которое автоматически взламывает капчу и заполняет текстовое поле. Он также управлял загрузками с веб-сайта университета, классифицируя их на основе кода курса и названия факультета и распределяя по соответствующим папкам. Как выглядит страница ресурсов курса:

  • Как загрузки сохраняются без расширения:

  • Как загрузки сохраняются, когда я загружаю их через расширение:

  • Вы можете просмотреть страницу расширений, у нее более 3000 пользователей, которые учатся в моем колледже. Было очень весело учиться строить с использованием JavaScript!

Бонус!

Это частичная автоматизация, но вы все равно можете прочитать! Практично.

Чтобы быть более продуктивным, я планировал использовать шаблон ежедневного расписания Google Таблицы. По сути, это недельная диаграмма активности, в которой есть дни для столбцов и время для строк. Моя текущая неделя выглядит так:

Области красного цвета означают, что я не буду в это время.

Прелесть этого заключалась в том, что, поскольку мое расписание всегда оставалось неизменным в течение всего семестра, все, что мне нужно было делать, это сидеть около 15 минут каждое воскресенье вечером и планировать всю неделю.
Теперь я хотел, чтобы синхронизировать его с календарем Google, чтобы я мог видеть, что запланировал, на своем телефоне. Я использовал следующий метод:

  • Заполните график. Пока вы занимаетесь этим, соответствующим образом отрегулируйте время. На верхней панели перейдите в Инструменты - ›Редактор скриптов.

  • Редактор скриптов предназначен для скриптов Google и позволяет создавать функции JavaScript для выполнения при использовании API приложений Google. Вот пример фрагмента кода, который вы можете использовать. Обратите внимание, что мы будем использовать индексы для того же шаблона.
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 дня = час.

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);
    }
  }
}

Я запустил этот скрипт, и все события синхронизировались с моим календарем Google.

Вот как я автоматизировал некоторые вещи в моем колледже. Дайте мне знать, если я могу вам чем-то помочь, или если у вас есть предложения, в комментариях!

Первоначально опубликовано на dev.to.

Приянш Джайн

LinkedIn | GitHub