- PVSM.RU - https://www.pvsm.ru -
Во время выполнения заказа по разработке telegram бота у меня возникла необходимость получения скриншота веб-страницы с его доставкой пользователю. Зачем задумываться над решением проблемы, когда его можно найти? Как оказалось, чтобы не платить! Подробнее пот катом.
Так вот, судьба натолкнула меня на сервис url2png [1]. Вроде бы всё круто: регистрируешься, получаешь API токен и делаешь себе запросы. Но как бы не так.
Нет, ну серьёзно,
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()
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
Нажмите здесь для печати.