During the execution of the order for the development of the telegram bot I had the need to get a screenshot of the web page with its delivery to the user. Why think about solving a problem when you can find it? As it turned out, not to pay! More sweat cut.
So, fate pushed me to the service url2png . It seems to be cool: you register, you get an API token and make yourself requests. But no matter how.
No, well, seriously, VDS for a few telegrams bots is cheaper! And then it became clear to me that I would have to get out with all available means. It did not take long to wrestle, since such a thing as Selenium was found . Selenium requires the installation of a special driver in accordance with the browser used. I warn you that PhantomJS is no longer supported by Selenium, so google chrome will be used to work in headless mode (when the webdriver starts up, the browser window does not open). How to configure for this vds? First of all, you need to install the browser itself. In the console you need to enter the following commands.
sudo apt update sudo apt install -y chromium-browser
After this link you need to find out the latest version of chromedriver (2.41 at the moment). You need to install it with the following commands.
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
I would also like to note that to debug the telegram bot on your machine will have to install a VPN if you are in Russia. Now you can start developing the bot. Libraries will be needed:
pytelegrambotapi selenium validators
You can install them safely using pip. The beginning of the script looks like this.
# -*- coding: utf-8 -*- import telebot import os import validators from selenium import webdriver
First, I created a bot and set up a browser to work in headless mode.
# 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')
Then he released a greeting and user assistance.
# /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')
The most important thing is to get a screenshot. Using the validators library, the validation (sorry for the tautology) of the link entered by the user is performed. Also, using the os module, the screenshot is deleted from the server after sending, in order not to take up space.
# 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)
Run the bot and check its work!
# if __name__ == '__main__': bot.infinity_polling()
As you can see, everything works great. Of course, all sorts of buns can be improved, but I set a goal to build a foundation and reached it. Actually, the link to the bot for those who wish and to the githab repository for those interested. In the meantime, all good, see you in the following publications!
Source: https://habr.com/ru/post/420513/
All Articles