Всем привет, я - Денис, Product Manager в банке, а до этого перезапускал вебинарную платформу VirtualRoom.

Сегодня я расскажу про свой скрипт, который отмечал меня на лекциях в аспирантуре мехмата МГУ.

Полную версию можно посмотреть на youtube

А тут вкратце пройдемся по коду.

Нафига?

Лень ходить на пары, встречи в Zoom и отмечаться.
Удивительно, но это применимо не только для университетов, но и для больших компаний, где надо отмечаться на встречах. Прикиньте такие есть...

Что делает код?

  • входит в указанное мероприятие

  • ждет сигнала, что надо отметиться

  • отправляет сообщение в чат

Код

Как всегда начинаем с загрузки библиотек

import subprocess
import pyautogui
import time
import pandas as pd
from datetime import datetime

В основном такие скрипты я пишу с помощью библиотеки selenium.
Почему selenium делает вас всемогущим и полностью окупает трудозатраты, я расскажу в следующий раз.

Так вот, когда я начал писать код, я думал, что сделаю всё через любимый selenium.
Но верстка Zoom никак не хотела открывать мне панель чата. Даже используя библиотеку, имитирующую наведение мыши, у меня ничего не вышло.

Поэтому после стадии принятия, в 2 часа ночи я наткнулся на видео одного индуса, где он с помощью библиотеки pyautogui успешно входит в зум.

Вход в мероприятие

def sign_in(meetingid, pswd):
    subprocess.call('C:\\Users\Daria\AppData\Roaming\Zoom\bin\Zoom.exe')
    #здесь мы просто открыли зум

    time.sleep(10)
    #ждем пока откроется
    
    #нажатие на кнопку Присоединиться к мероприятию
    join_btn = pyautogui.locateCenterOnScreen('join_button.png')
    pyautogui.moveTo(join_btn)
    pyautogui.click()
    
    # вводим номер мероприятия
    meeting_id_btn =  pyautogui.locateCenterOnScreen('meeting_id_button.png')
    pyautogui.moveTo(meeting_id_btn)
    pyautogui.click()
    pyautogui.write(meetingid)

    #тыкаем на чекбоксы выключить камеру и микрофон
    media_btn = pyautogui.locateAllOnScreen('media_btn.png')
    for btn in media_btn:
        pyautogui.moveTo(btn)
        pyautogui.click()
        time.sleep(2)

    #нажимаем на кноку Войти
    join_btn = pyautogui.locateCenterOnScreen('join_btn.png')
    pyautogui.moveTo(join_btn)
    pyautogui.click()
    
    time.sleep(5)
    #вводим пароль мероприятия
    meeting_pswd_btn = pyautogui.locateCenterOnScreen('meeting_pswd.png')
    pyautogui.moveTo(meeting_pswd_btn)
    pyautogui.click()
    pyautogui.write(pswd)
    pyautogui.press('enter')

Что тут произошло? или как работает библиотека pyautogui

    meeting_pswd_btn = pyautogui.locateCenterOnScreen('meeting_pswd.png')
    pyautogui.moveTo(meeting_pswd_btn)
    pyautogui.click()
    pyautogui.write(pswd)
    pyautogui.press('enter')
  1. Говорим питону: "слышь, найди мне на экране картинку как ту, что я тебе передал, и скажи мне координаты её центра"

    join_button.png
    join_button.png
  2. "перенеси мышь в координаты, которые я просил выше"

  3. "кликни"

  4. "введи текстовое значение, которое я тебе передал"

  5. "жмякни клавишу Enter, большую такую"

Афигенная библиотека, не правда ли?

time.sleep(18)
#ждем пока мы войдем в мероприятие

#дальше будет примитивная проверка, что отобразилось окно для Присоединиться с камепрй
f=2
while f==2:
    join_with_micro = pyautogui.locateCenterOnScreen('join_with_micro.png')
    if wind_micro==join_with_micro:
        f=3

pyautogui.moveTo(join_with_micro)
pyautogui.click()

time.sleep(3)

#разворачиваем окно зума на весь экран и выключаем микрофон
pyautogui.hotkey('alt','f')
time.sleep(3)
pyautogui.hotkey('alt','a')

Отлично, мы успешно вошли в мероприятие.

Ждем сигнала и отмечаемся

В моем случае сигналом к тому, что сейчас надо отмечаться на лекции, было резкое увеличение количества сообщений в чате.

Каждому аспиранту надо было написать в чат ФИО и факультет, из-за чего количество непрочитанных сообщений быстро росло.

Как только оно достигало 23 ИЛИ 24 ИЛИ 33 шт, то запускалась часть для отправки сообщения в чат.

time.sleep(10)
#примитивный бесконечный цикл
h=1
while h==1:
  	#проверяем есть ли на экране картинка кнопки чата с 23 напрочитанными сообщениями
    chat4=pyautogui.locateCenterOnScreen('chat23.png')
    chat5=pyautogui.locateCenterOnScreen('chat24.png')
    chat6=pyautogui.locateCenterOnScreen('chat33.png')
    if(chat4==chat23):
        pyautogui.moveTo(chat4)
        pyautogui.click()
        h=2
    elif(chat5==chat24):
        pyautogui.moveTo(chat5)
        pyautogui.click()
        h=2        
    elif(chat6==chat33):
        pyautogui.moveTo(chat6)
        pyautogui.click()
        h=2        

#указываем текст, который надо отправить в чате
#к сожалению, русский не поддерживается, поэтому пишем русский текст англиской расскадкрй
m2='Fynjy Gneirby Vt[ vfn]'
time.sleep(7)
#ищем поля для ввода сообщения в чате
to_msg = pyautogui.locateCenterOnScreen('to_msg.png')
pyautogui.moveTo(to_msg)
pyautogui.click()
#меняем раскадку, чтобы писать русский текст
pyautogui.hotkey('ctrl','shift')
#вводим ранее заданный текст
pyautogui.typewrite(m2)
time.sleep(1)
#отправляем сообщение в чат
pyautogui.press('enter')        

Поздравляю шалость удалась, не прошло и 2х ночей.

примерно так я выглядел под утро, написав за ночь этот скрипт
примерно так я выглядел под утро, написав за ночь этот скрипт

Пошаговая инструкция и код

https://dsmatveev.notion.site/13bbe3c1d5e9437f9d08c4e941d73fda

Спасибо всем, кто дочитал до конца, надеюсь, эта информация будет вам полезна.

Хотел добавить, что это мой первый пост, я далеко не программист и пишу неоптимальный код. Мне важно, чтобы время потраченное на написание кода, как можно быстрее себя окупало, как бы коряво он не был написан.

Кстати, в https://t.me/msu2product недавно был небольшой пост про мой новый скрипт Notion+VK+Speech2text

Комментарии (17)


  1. Izaron
    05.12.2021 14:24
    -1

    Скрипт хороший. Жаль только, что многие преподаватели (в основном еще видевшие живого Ленина) ОЧЕНЬ волнуются, если кто-то не слушает именно их пересказ учебника в 8:45, поэтому любят просить включать камеры, задавать рандомные вопросы рандомным людям в рандомное время, и так далее.


    1. Mohave
      05.12.2021 16:35
      +1

      У меня в университете был преподаватель который постоянно мониторил активно ли окно трансляции лекции у студентов. Если переключиться на тот же браузер — преподаватель говорил об этом, упоминая конкретно студента. Дико не удобно. Я разворачивал виртуальную машину внутри которой у меня крутилась эта программа. В силу редкости лекций и их интерактивности другие методы не выглядели эффективными решениями.


      1. Izaron
        05.12.2021 19:41
        +1

        У нас некоторые преподы сходили с ума и присылали какой-то бред

        Правила сдачи одного из экзаменов


      1. dockgtr Автор
        06.12.2021 23:51

        Хдддд, использование виртуалки в таких целях я ещё не встречал) Круто)))
        Мой скрипт крутился вообще на старом нетбуке под кроватью с 2Гб оперативки, чего железу пропадать)


  1. SergeyMax
    05.12.2021 14:55
    +1

    А есть такой же скрипт, который рассылает смски о начислении зп?


  1. GlebGleb
    05.12.2021 16:01
    +3

    Легко "спалить" такой скрипт. Если преподаватель, помимо переклички, задаст вдруг какой-то вопрос и попросит всех ответить. Скрипт явно не ответит. Точнее ответит, но не так ..


    1. Fa11en_Angel
      05.12.2021 22:38

      Так можно еще и дописать несколько условий по парсингу чата. Если начали появляться номера групп, например, то тогда отправлять.


      1. zaiats_2k
        06.12.2021 10:06
        +1

        А если голосом попросили присутствующих отправить котиков?


        1. dockgtr Автор
          06.12.2021 23:53

          кажется, для такого нужно уже подключать ИИ, но боюсь даже он не поймет логику в таких извращенных заданиях)))))


  1. pawellrus
    06.12.2021 12:13
    -1

    Немного даже жалко студентов, которым приходится исполнять все эти бредовые правила.

    Что, если у человека нет нормальной камеры, или денег на нее? Что если нет возможности ее включить, т.к. в комнате могут быть другие люди?


    1. CheGevara
      06.12.2021 18:16

      Если бы мы жили в стране честных людей, таких правил бы не было. А у нас Система и граждане бороться друг с другом


  1. CheGevara
    06.12.2021 18:17

    На месте директора банка я бы уволил такого менеджера. Но посоветовал бы его в программисты :)

    А потом мамы школьников будут жаловаться, что Учителя не учат


  1. VXP
    06.12.2021 23:07

    У меня два вопроса: почему Daria, и в какой она банке?


    1. dockgtr Автор
      06.12.2021 23:58

      потому что скрипт крутился на нетбуке 10 летней давности с 2 Гб оперативки и Intel Atom под капотом, доставшийся когда-то мне от сестры)
      Да и весь скрипт я писал тогда на нем, т.к. нормального личного ноута тогда еще не было


  1. vamotest
    07.12.2021 00:03
    +1

    Может быть лучше использовать явные ожидания Selenium и завязываться на появление заголовка или любого другого элемента на странице?

    Selenium для Python. Глава 5. Ожидания


    1. dockgtr Автор
      07.12.2021 00:09

      Хммм, прикольная функция)
      спасибо тебе большое за ссылку, буду иметь это в виду при написании следующих таких скриптов)

      Selenium в случае с отправкой сообщения в Zoom не очень мне подошла.
      Через селениум в учетку войти получилось (даже без ввода капчи)
      Войти в мероприятие получилось
      Звук выключить получилось
      А вот когда очередь дошла до открытия чата

      Верстка зума с любовью сказала, чтобы я пошел нафиг

      Там даже использование библиотеки, имитирующей наведение мыши, не помогла(


  1. Piet_Hein
    07.12.2021 00:09

    Мне важно, чтобы время потраченное на написание кода, как можно быстрее себя окупало, как бы коряво он не был написан.

    Ну такое.

    Пока пишешь для себя любимого - это имеет смысл. Но когда работаешь в команде и необходимо написать так, чтобы при поддержке кода не проклинали, то совко так себе.

    А в целом, супер! Лень двигатель прогресса. И как настоящий программист - ты автоматизировал рутинный процесс.