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

 

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

Автор: admin от 22-08-2018, 22:30, посмотрело: 137

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

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

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



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



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



sudo apt update
sudo apt install -y chromium-browser


После, по этой ссылке необходимо узнать последнюю версию 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, так как сразу после регистрации можно получить халявные 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()


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



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



Источник: Хабр / Интересные публикации

Категория: Game Development

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

Добавление комментария

Имя:*
E-Mail:
Комментарий:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
Введите два слова, показанных на изображении: *