- PVSM.RU - https://www.pvsm.ru -

Пиратская копия платного сервиса в 39 строчек Python кода

image
Во время выполнения заказа по разработке telegram бота у меня возникла необходимость получения скриншота веб-страницы с его доставкой пользователю. Зачем задумываться над решением проблемы, когда его можно найти? Как оказалось, чтобы не платить! Подробнее пот катом.

Так вот, судьба натолкнула меня на сервис url2png [1]. Вроде бы всё круто: регистрируешься, получаешь API токен и делаешь себе запросы. Но как бы не так.

image

Нет, ну серьёзно, VDS [2] под несколько телеграм ботов дешевле стоит! И тут мне стало ясно, что придётся выкручиваться всеми доступными способами. Долго ломать голову не пришлось, благо нашлась такая вещь как Selenium [3]. Selenium требует для работы установки специального драйвера в соответствии с используемым браузером. Предупреждаю, что PhantomJS больше не поддерживается Selenium'ом, поэтому для работы в headless режиме(при запуске webdriver окно браузера не открывается) будет использоваться google chrome. Как настроить для этого VDS [2]? Перво-наперво надо установить сам браузер. В консоли нужно ввести следующие команды.

sudo apt update
sudo apt install -y chromium-browser

После, по этой ссылке [4] необходимо узнать последнюю версию chromedriver(2.41 на данный момент). Установить его нужно следующими командами.

wget https://chromedriver.storage.googleapis.com/2.41/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
sudo mv chromedriver /usr/bin/chromedriver
sudo chown root:root /usr/bin/chromedriver
sudo chmod +x /usr/bin/chromedriver

Также хочется отметить, что для отладки телеграм бота на своей машине придётся установить VPN, если вы находитесь в России. На мой взгляд одним из лучших решений будет сервис Windscribe [5], так как сразу после регистрации можно получить халявные 15 GB трафика на высокой скорости в месяц. Теперь можно приступать к разработке бота. Понадобятся библиотеки:

pytelegrambotapi
selenium
validators

Установить их можно спокойно с помощью pip. Начало скрипта выглядит так.

# -*- coding: utf-8 -*-
import telebot
import os
import validators
from selenium import webdriver

Сначала я создал бота и настроил браузер для работы в headless режиме.

#создаём бота

token = 'token of this bot'
bot = telebot.TeleBot(token, threaded = False)

#настраиваем браузер для корректной работы в headless режиме

options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--no-sandbox')

Потом релизовал приветствие и помощь пользователю.

#имплементация обязательных команд /start и /help

@bot.message_handler(commands=['start'])
def hello_user(message):
    bot.send_message(message.chat.id, 'Hello, ' + message.from_user.username + "!")

@bot.message_handler(commands=['help'])
def show_help(message):
    bot.send_message(message.chat.id, 'To get screenshot of webpage use command /getpng.nExample: /getpng https://www.google.com')

Осталось самое главное — получение скриншота. С помощью библиотеки validators осуществляется валидация(извините за тавтологию) введённой пользователем ссылки. Также с помощью модуля os скриншот удаляется с сервера после отправки, дабы не занимать место.

#получение скрина сайта с помощью selenium и headless chrome

@bot.message_handler(commands=['getpng'])
def get_screenshot(message):
    uid = message.chat.id
    url = ""
    try:
        url = message.text.split(' ')[1]
    except IndexError:
        bot.send_message(uid, 'You have not entered URL!')
        return
    if not validators.url(url):
        bot.send_message(uid, 'URL is invalid!')
    else:
        photo_path = str(uid) + '.png'
        driver = webdriver.Chrome(chrome_options = options)
        driver.set_window_size(1280, 720)
        driver.get(url)
        driver.save_screenshot(photo_path)
        bot.send_photo(uid, photo = open(photo_path, 'rb'))
        driver.quit()
        os.remove(photo_path)

Запускаем бота и проверяем его работу!

#запуск бота

if __name__ == '__main__':
    bot.infinity_polling()

image

As you can see, всё работает замечательно. Конечно, всякие плюшки можно доработать, но я поставил перед собой цель построить фундамент и достиг её. Собственно, ссылка на бота [6] для желающих и на гитхаб репозиторий [7] для интересующихся. Ну а пока всем добра, увидимся в следующих публикациях!

Автор: Stefanio

Источник [8]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/290081

Ссылки в тексте:

[1] url2png: https://www.url2png.com/

[2] VDS: https://www.reg.ru/?rlink=reflink-717

[3] Selenium: https://pypi.org/project/selenium/

[4] по этой ссылке: https://sites.google.com/a/chromium.org/chromedriver/downloads

[5] Windscribe: http://corneey.com/wKOvan

[6] ссылка на бота: http://t.me/urltopngbot

[7] гитхаб репозиторий: http://corneey.com/wKObyM

[8] Источник: https://habr.com/post/420513/?utm_campaign=420513