Статья Делаем скрипт для создания обучающего видео по Python, с помощью Python

Иногда, смотря видео на YouTube в которых учат как писать скрипты на Python я задавался вопросом, что едят данные люди? Ведь это надо как-то умудриться набирать код с приличной скоростью, да еще при этом не сделать ни одной ошибки. Но, впоследствии я понял, что все намного проще и прозаичнее, а питание у них, скорее всего, не отличается от нашего с вами. А дело в том, что для создания обучающих видео по Python, можно использовать скрипт на нем же, для того, чтобы набирать текст в, к примеру, PyCharm. Я не собираюсь делать обучающих видео, но скрипт, который делает что-то подобное написал.

000.png



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


Что понадобится?

Для того, чтобы написать данный код, понадобится установить библиотеку pyautogui. Для ее установки пишем в терминале команду:

pip install pyautogui

Больше, из нестандартного, устанавливать ничего не нужно. После установки библиотеки импортируем все необходимое в код:

Python:
import subprocess
import time

import pyautogui


Определение языка и переключение на английскую раскладку

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

Создадим функцию lang_key_switch(). С ее помощью мы будем определять код текущей раскладки и, если он не соответствует коду раскладки английского языка, будем ее переключать.

Чтобы получить код раскладки, с помощью subprocess.check_output, выполним команду «xset -q | grep -A 0 'LED' | cut -c59-67» и заберем из нее вывод. Затем, сравним вывод с кодом английской раскладки. Если он не соответствует, переключаем с помощью pyautogui.

Python:
def lang_key_switch():
    """
    Функция определяет текущую раскладку в Linux.
    Если она не соответствует коду английской раскладки,
    автоматически ее переключает.
    """
    k_lay = subprocess.check_output("xset -q | grep -A 0 'LED' | cut -c59-67", shell=True).decode().strip()
    if k_lay == '00001006':
        pyautogui.hotkey('alt', 'shift')


Транслитерация русского текста в соответствующие английские символы клавиатуры

Для того, чтобы pyautogui корректно ввел русский текст, его надо преобразовать в английские символы. Выглядеть это должно так, как если бы вы не переключили раскладку на русский язык и стали набирать текст. То есть, слово "привет", для примера, должно выглядеть примерно так — "ghbdtn".

Создадим функцию translit(text). На вход она принимает текст на русском языке, переводит в другую раскладку и тут же печатает его с помощью pyautogui, перед этим переключив раскладку на русский, а затем вернув ее обратно.
Объявим кортеж из символов русской клавиатуры и соответствующих им символов английской.

Python:
    symbols = ("абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ",
               "f,dult`;pbqrkvyjghcnea[wxio]sm'.zF,DULT`;PBQRKVYJGHCNEA[WXIO]SM'.Z")

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

tr = {ord(a): ord(b) for a, b in zip(*symbols)}

Переключаем раскладку на русскую и печатаем переведенный текст с заданной скоростью, которая определяется параметром interval. Затем возвращаем раскладку в исходное положение.

Python:
    pyautogui.hotkey('alt', 'shift')
    pyautogui.write(text.translate(tr), interval=0.1)
    pyautogui.hotkey('alt', 'shift')

Python:
def translit(text: str):
    """
    Функция выполняет замену русских букв эквивалентом
    латинских букв и символов в английской раскладке.
    В итоге получается текст в латинской раскладке,
    как если бы вы забыли ее переключить на русский.
    Это необходимо для того, чтобы pyautogui
    корректно печатал русские буквы, так как по умолчанию
    он не поддрерживает кириллицу.
    Также в функции переключается раскладка, выполняется
    транслитерация и печатается текст. Затем раскладка снова возвращается
    в прежнее состояние, то есть на английскую раскладку.
    :param text: текст для замены.
    """
    symbols = ("абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ",
               "f,dult`;pbqrkvyjghcnea[wxio]sm'.zF,DULT`;PBQRKVYJGHCNEA[WXIO]SM'.Z")

    tr = {ord(a): ord(b) for a, b in zip(*symbols)}
    pyautogui.hotkey('alt', 'shift')
    pyautogui.write(text.translate(tr), interval=0.1)
    pyautogui.hotkey('alt', 'shift')


Печать текста

Особо в этой функции выделять нечего. Здесь используются несколько основных функций pyautogui, такие как write и press. Создадим функцию print_word(). Для начала определим текущую раскладку и переключим по мере необходимости:

lang_key_switch()

А после начинаем печатать текст с заданной скоростью, которая регулируется параметром interval:

pyautogui.write("from pytube import YouTube", interval=0.1)

Затем отправляем команду Enter, для того, чтобы выполнить перевод каретки на другую строку.

pyautogui.press('enter')

Ну и, если требуется ввести русский текст, используем ранее созданную функцию:

translit('Введите ссылку на видео')

Python:
def print_word():
    """
    Печатается текст в любом поле ввода с помощью функции
    write. После ввода каждой строки нажимается Enter.
    Функция сделана под PyCharm, хотя может работать в
    любой IDE, которая автоматически ставит пробелы после
    нажатия Enter. Текст печатается с заданной скорость, которая
    определяется параметром interval.
    """
    lang_key_switch()
    pyautogui.write("from pytube import YouTube", interval=0.1)
    pyautogui.press('enter')
    pyautogui.press('enter')
    pyautogui.press('enter')
    pyautogui.write("def get_keywords(url: str) -> list:", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("yt = YouTube(url)", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("return yt.keywords", interval=0.1)
    pyautogui.press('enter')
    pyautogui.press("backspace")
    pyautogui.press('enter')
    pyautogui.press('enter')
    pyautogui.press('enter')
    pyautogui.write("def main():", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("url = input('", interval=0.1)
    translit('Введите ссылку на видео')
    pyautogui.write(": ')", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("if 'youtube.com' not in url or 'playlists' in url:", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("print('")
    translit('Введите правильную ссылку')
    pyautogui.write("')", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("return ", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("kw = get_keywords(url)", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("if not kw:", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("print('\\n", interval=0.1)
    translit('В данном видео нет ключевых слов')
    pyautogui.write(":\\n')", interval=0.1)
    pyautogui.press('enter')
    pyautogui.press("backspace")
    pyautogui.write("else:")
    pyautogui.press('enter')
    pyautogui.write("print('\\n", interval=0.1)
    translit('Найдены ключевые слова')
    pyautogui.write(":\\n')", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("print('-'*23)", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("print(kw)", interval=0.1)
    pyautogui.press('enter')
    pyautogui.press('enter')
    pyautogui.press('enter')
    pyautogui.press('backspace')
    pyautogui.press('backspace')
    pyautogui.write("if __name__ == '__main__':", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("main()", interval=0.1)
    pyautogui.press('enter')


Ожидание появления окна с нужным заголовком

Ну и теперь нужно создать функцию, которая будет ждать, пока появится окно с нужным заголовком, чтобы не печатать где попало. А именно так и произойдет, если запускать без ожидания окна. Ну, или очень быстро переключаться на нужное поле ввода. Или установить задержку. Тут уж как вам лучше. Я выбрал такой вариант, так как он гарантирует, что печать не начнется, пока не появится нужное окно. Но, надо учесть, что она не прекратится, если вы переключитесь на другое.

Создадим функцию waiter(). Можно сказать, что в вольном переводе это означает «ждун». Запускаем бесконечный цикл, в котором для начала с помощью команд Linux получаем код окна.

Python:
        command = "xprop -root _NET_ACTIVE_WINDOW | sed 's/.* //'"
        frontmost = subprocess.check_output(command, shell=True).decode("utf-8").strip()

Затем получаем его заголовок:

Python:
        com_title = f'xwininfo -root -tree | grep {frontmost}'
        title = subprocess.check_output(com_title, shell=True).decode().strip().split('"')[1]

Сравниваем полученный заголовок с нужным нам, в котором будет происходить печать. И если заголовки окна совпадают, то ждем секунду, запускаем функцию печати текста и прерываем выполнение цикла.

Python:
        if title == "temp – youtube_keyword.py":
            time.sleep(1)
            print_word()
            break

Python:
def waiter():
    """
    Запускается бесконечный цикл, в котором получаем список заголовков открытых окон.
    Сравниваем с заголовком нужного окна. Если заголовок совпадает с текстом,
    спим одну секунду и запускаем функцию печати, после чего прерываем цикл.
    """
    while True:
        command = "xprop -root _NET_ACTIVE_WINDOW | sed 's/.* //'"
        frontmost = subprocess.check_output(command, shell=True).decode("utf-8").strip()

        com_title = f'xwininfo -root -tree | grep {frontmost}'
        title = subprocess.check_output(com_title, shell=True).decode().strip().split('"')[1]
        if title == "temp – youtube_keyword.py":
            time.sleep(1)
            print_word()
            break


Ну и еще одна функция, в которой запускается «ждун», функция main().

Python:
def main():
    """
    Запуск функции ожидания появления окна
    с определенным заголовком.
    """
    waiter()

А на этом все. Теперь, если вы, к примеру, в PyCharm, а я оптимизировал печать под него, создадите питоновский файл с названием youtube_keyword, запустите скрипт, а после переключитесь на данное окно, скрипт начнет печатать текст, который уже можно записывать на видео.

Вот небольшая демонстрация работы:


Python:
"""
Скрипт для автоматической печати текста
в определенном окне.
Для его работы необходимо установить библиотеку pyautogui:
pip install pyautogui
"""

import subprocess
import time

import pyautogui


def lang_key_switch():
    """
    Функция определяет текущую раскладку в Linux.
    Если она не соответствует коду английской раскладки,
    автоматически ее переключает.
    """
    k_lay = subprocess.check_output("xset -q | grep -A 0 'LED' | cut -c59-67", shell=True).decode().strip()
    if k_lay == '00001006':
        pyautogui.hotkey('alt', 'shift')


def translit(text: str):
    """
    Функция выполняет замену русских букв эквивалентом
    латинских букв и символов в английской раскладке.
    В итоге получается текст в латинской раскладке,
    как если бы вы забыли ее переключить на русский.
    Это необходимо для того, чтобы pyautogui
    корректно печатал русские буквы, так как по умолчанию
    он не поддрерживает кириллицу.
    Также в функции переключается раскладка, выполняется
    транслитерация и печатается текст. Затем раскладка снова возвращается
    в прежнее состояние, то есть на английскую раскладку.
    :param text: текст для замены.
    """
    symbols = ("абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ",
               "f,dult`;pbqrkvyjghcnea[wxio]sm'.zF,DULT`;PBQRKVYJGHCNEA[WXIO]SM'.Z")

    tr = {ord(a): ord(b) for a, b in zip(*symbols)}
    pyautogui.hotkey('alt', 'shift')
    pyautogui.write(text.translate(tr), interval=0.1)
    pyautogui.hotkey('alt', 'shift')


def print_word():
    """
    Печатается текст в любом поле ввода с помощью функции
    write. После ввода каждой строки нажимается Enter.
    Функция сделана под PyCharm, хотя может работать в
    любой IDE, которая автоматически ставит пробелы после
    нажатия Enter. Текст печатается с заданной скорость, которая
    определяется параметром interval.
    """
    lang_key_switch()
    pyautogui.write("from pytube import YouTube", interval=0.1)
    pyautogui.press('enter')
    pyautogui.press('enter')
    pyautogui.press('enter')
    pyautogui.write("def get_keywords(url: str) -> list:", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("yt = YouTube(url)", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("return yt.keywords", interval=0.1)
    pyautogui.press('enter')
    pyautogui.press("backspace")
    pyautogui.press('enter')
    pyautogui.press('enter')
    pyautogui.press('enter')
    pyautogui.write("def main():", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("url = input('", interval=0.1)
    translit('Введите ссылку на видео')
    pyautogui.write(": ')", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("if 'youtube.com' not in url or 'playlists' in url:", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("print('")
    translit('Введите правильную ссылку')
    pyautogui.write("')", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("return ", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("kw = get_keywords(url)", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("if not kw:", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("print('\\n", interval=0.1)
    translit('В данном видео нет ключевых слов')
    pyautogui.write(":\\n')", interval=0.1)
    pyautogui.press('enter')
    pyautogui.press("backspace")
    pyautogui.write("else:")
    pyautogui.press('enter')
    pyautogui.write("print('\\n", interval=0.1)
    translit('Найдены ключевые слова')
    pyautogui.write(":\\n')", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("print('-'*23)", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("print(kw)", interval=0.1)
    pyautogui.press('enter')
    pyautogui.press('enter')
    pyautogui.press('enter')
    pyautogui.press('backspace')
    pyautogui.press('backspace')
    pyautogui.write("if __name__ == '__main__':", interval=0.1)
    pyautogui.press('enter')
    pyautogui.write("main()", interval=0.1)
    pyautogui.press('enter')


def waiter():
    """
    Запускается бесконечный цикл, в котором получаем список заголовков открытых окон.
    Сравниваем с заголовком нужного окна. Если заголовок совпадает с текстом,
    спим одну секунду и запускаем функцию печати, после чего прерываем цикл.
    """
    while True:
        command = "xprop -root _NET_ACTIVE_WINDOW | sed 's/.* //'"
        frontmost = subprocess.check_output(command, shell=True).decode("utf-8").strip()

        com_title = f'xwininfo -root -tree | grep {frontmost}'
        title = subprocess.check_output(com_title, shell=True).decode().strip().split('"')[1]
        if title == "temp – youtube_keyword.py":
            time.sleep(1)
            print_word()
            break


def main():
    """
    Запуск функции ожидания появления окна
    с определенным заголовком.
    """
    waiter()


if __name__ == "__main__":
    main()

А на этом, пожалуй, все.

Спасибо за внимание. Надеюсь, данная информация была вам полезна
 

Вложения

  • print_code.zip
    2,4 КБ · Просмотры: 119
Последнее редактирование модератором:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!