https://habr.com/ru/post/494990/- Python
- Разработка под MacOS
- Разработка под Linux
- Разработка под Windows
- Социальные сети и сообщества

Думаю многие любят знакомиться в соц. сетях и пользуются приложениями (например Tinder),
но часто уходит много времени на то, что бы ставить лайки и отправлять первые
сообщения. Я считаю что это монотонные действия которые только отталкивают от
общения и знакомства. Если ты программист, зачем быть как все, давай вместе со
мной автоматизируем процесс монотонных действий и оставим свое внимание только
для приятного общения, но обо всём по порядку.
Подготовка
В данной статье я буду использовать браузер Chrome.
- Создадим папку с проектом bot_tinder.
- В папке bot_tinder создадим подпапки с названиямиchromedriver_for_win и chromedriver_for_mac, и chromedriver_for_lin (т.к. реализацию делаем для 3 ОС Windows, macOS, Linux).
- Скачаем webdriver под вашу версию браузера (я использую Chrome, если используете Firefox то можно скачать от сюда), для большего сходства с моей реализации можете скачать для каждой ОС.
- Скаченные файлы размещаем по папкам chromedriver_for_win, chromedriver_for_mac, chromedriver_for_lin.
Если скачали только для своей ОС, ничего страшного, т.к. в коде это предусмотрим.
- В папке bot_tinder создадим файл с названием log.txt (в него записываем номер телефона по которому будет заходить в Tinder). Формат без восьмерки: 9851234567
- В папке bot_tinder создадим файлы tinder.py, function.py.
В итоге у вас должно получиться так:
В каждой папке должен располагаться файл
webdriver скаченный ранее.
Если реализуете только под свою ОС, тогда файл webdriver должен располагаться только в одной из папок с названием вашей ОС «chromedriver_for_вашаОС».
Реализация
В файле
tinder.py импортируем библиотеку:
# -*- coding: utf-8-*-
from selenium import webdriver
В файле
function.py импортируем библиотеки:
from selenium.common.exceptions import NoSuchElementException, ElementNotInteractableException
from sys import platform
from time import sleep
import datetime
Далее в файле
function.py создаем переменные которые нам позже понадобятся:
error = ''
warning = ''
ok = ''
oc = ''
like = ''
all_sleep = 3
like_sleep = 2
Значки удалились интерпретатором Хабр, но должно быть так:
Значки можете скопировать с
сайта или использовать библиотеку
emoji.
Переменные
all_sleep,
like_sleep указывают на время задержки в секундах.
После в файле
function.py создаем функции:
-
Первая функция будет определять дату и время:
def get_data_time():
time_now = datetime.datetime.now()
return time_now.strftime("%d-%m-%Y %H:%M")
- Вторая функция будет определять Вашу ОС и обращаться к нужному webdriver:
def get_OC():
"""
Define OS.
:return: OS information and path to chromedriver.exe
"""
if platform == "linux" or platform == "linux2":
time_now = datetime.datetime.now()
information = "[" + get_data_time() + '] {} Ваша ОС Linux'.format(oc)
put = "chromedriver_for_lin/**название webdriver**"
return information, put
elif platform == "darwin":
time_now = datetime.datetime.now()
information = "[" + get_data_time() + '] {} Ваша ОС Mac'.format(oc)
put = "chromedriver_for_mac/**название webdriver**"
return information, put
elif platform == "win32":
time_now = datetime.datetime.now()
information = "[" + get_data_time() + '] {} Ваша ОС Windows'.format(oc)
put = "chromedriver_for_win/chromedriver.exe"
return information, put
Не забудьте прописать путь к webdriver в переменной put.
- Третья функция будет читать номер телефона из файла log.txt:
def information_from_txt_files():
"""
Read the .txt files
:return: Information. Login.
"""
information = ''
with open('log.txt', 'r') as file:
log = file.read()
information += "[" + get_data_time() + \
'] {} Логин для входа на сайт Tinder: {}'.format(ok, log)
return information, log
- Четвертая функция будет закрывать всплывающее окно на сайте Tinder:
def close_start_popups(browser):
"""
Close the popup.
:param browser: parameter of the running browser.
:return: information.
"""
sleep(all_sleep)
try:
browser.find_element_by_xpath('//button[@aria-label="Закрыть"]').click()
return "[" + get_data_time() + "] {} Всплывающее окно закрыто.".format(ok)
except ElementNotInteractableException as err:
return "[" + get_data_time() + '] {} ' + err + ''.format(error)
except NoSuchElementException as err:
return "[" + get_data_time() + '] {} Не нашел всплавающего окна.'.format(error)
- Пятая функция будет нажимать кнопку «Войти с помощью номера телефона»:
def log_in_using_your_phone(browser):
"""
Click the Login button using the phone number.
:param browser: parameter of the running browser.
:return: information
"""
sleep(all_sleep)
try:
browser.find_element_by_xpath('//div[@id="modal-manager"]').find_element_by_xpath('//button[@aria-label="Войти с помощью номера телефона"]').click()
return "[" + get_data_time() + "] {} Войти с помощью номера телефона.".format(ok)
except ElementNotInteractableException as err:
return "[" + get_data_time() + '] {} ' + err + ''.format(error)
except NoSuchElementException as err:
browser.find_element_by_xpath('//button[text()="Другие варианты"]').click()
return log_in_using_your_phone(browser)
- Шестая функция будет вводить номер телефона:
def input_number_phone(browser, log):
"""
Enter the phone number.
:param browser: parameter of the running browser.
:param log: phone number.
:return: information.
"""
sleep(all_sleep)
try:
browser.find_element_by_name('phone_number').send_keys(log)
return "[" + get_data_time() + '] {} Введен номер телефона {}'.format(ok, log)
except NoSuchElementException:
return "[" + get_data_time() + '] {} Не нашел окна для ввода телефона.'.format(error)
- Седьмая функция нажимает кнопку «Продолжить»:
def go_on(browser):
"""
Click the Continue button.
:param browser: parameter of the running browser.
:return: information
"""
sleep(all_sleep)
try:
browser.find_element_by_xpath('//span[text()="Продолжить"]').click()
return "[" + get_data_time() + '] {} Нажата кнопка Продолжить'.format(ok)
except NoSuchElementException:
return "[" + get_data_time() + '] {} Не нашел кнопки Продолжить.'.format(error)
- Восьмая функция запрашивает ввод кода, который придет Вам на телефон:
def code_check():
"""
Entering a code and checking the entered code.
:return: entered code
"""
kod_numbers = input("[" + get_data_time() + "] {} Введите код: ".format(warning))
if len(kod_numbers) != 6:
print("[" + get_data_time() + '] {} Код не верный.'.format(error))
return code_check()
else:
print("[" + get_data_time() + '] {} Формат кода проверен.'.format(ok))
return kod_numbers
Так же функция проверяет кол-во введенных цифр.
- Девятая функция вводит код:
def input_cod(browser):
"""
Code entry.
:param browser: parameter of the running browser.
:return: information.
"""
try:
kod_numbers = code_check()
kod = browser.find_elements_by_xpath('//input[@type="tel"]')
n = 0
for i in kod:
i.send_keys(kod_numbers[n])
n += 1
return "[" + get_data_time() + '] {} Код введен.'.format(ok)
except NoSuchElementException:
return "[" + get_data_time() + '] {} Не нашел полей для ввода кода.'.format(error)
- Десятая функция разрешает определение геолокации:
def geolocation_ok(browser):
"""
We allow geolocation.
:param browser: parameter of the running browser.
:return: information.
"""
sleep(all_sleep)
try:
browser_button = browser.find_elements_by_tag_name("button")
button_list = {i.text: i for i in browser_button}
if "РАЗРЕШИТЬ" in button_list.keys():
button = [value for key, value in button_list.items() if key == "РАЗРЕШИТЬ"]
button[0].click()
return "[" + get_data_time() + '] {} Геолокация разрешена.'.format(ok)
else:
return "[" + get_data_time() + '] {} Не нашел полей Разрешить для Геолокации.'.format(error)
except NoSuchElementException:
return "[" + get_data_time() + '] {} Не нашел полей Разрешить для Геолокации.'.format(error)
- Одиннадцатая функция отключает оповещение:
def notice_off(browser):
"""
Turn off notifications.
:param browser: parameter of the running browser.
:return: information.
"""
sleep(all_sleep)
try:
browser_button = browser.find_elements_by_tag_name("button")
button_list = {i.text: i for i in browser_button}
if "НЕИНТЕРЕСНО" in button_list.keys():
button = [value for key, value in button_list.items() if key == "НЕИНТЕРЕСНО"]
button[0].click()
return "[" + get_data_time() + '] {} Уведомления отключены.'.format(ok)
else:
return "[" + get_data_time() + '] {} Не нашел поле Неинтерсно для Уведомлений.'.format(error)
except NoSuchElementException:
return "[" + get_data_time() + '] {} Не нашел поле Неинтерсно для Уведомлений.'.format(error)
- Двенадцатая функция закрывает всплывающие окна:
def popup_windows_off(browser):
"""
Close popups.
:param browser: parameter of the running browser
:return: information
"""
sleep(like_sleep)
try:
browser_button = browser.find_elements_by_tag_name("button")
button_list = {i.text: i for i in browser_button}
if "НЕИНТЕРЕСНО" in button_list.keys():
button = [value for key, value in button_list.items() if key == "НЕИНТЕРЕСНО"]
button[0].click()
print("[" + get_data_time() + '] {} Всплавающее окно.'.format(ok))
except NoSuchElementException:
pass
- Тринадцатая функция ставит Like:
def click_like(browser):
"""
Click LIKE.
:param browser: parameter of the running browser
:return: information
"""
sum_like = 0
while True:
try:
popup_windows_off(browser)
browser.find_element_by_xpath('//button[@aria-label="Лайк"]').click()
sum_like += 1
print("[" + get_data_time() + '] {} - {}'.format(like, str(sum_like)))
except NoSuchElementException:
print("[" + get_data_time() + '] {} Не нашел поле Лайк.'.format(error))
Теперь переходим к файлу
tinder.py и прописываем импорт всех функций:
from function import get_OC, information_from_txt_files, close_start_popups, notice_off, click_like, log_in_using_your_phone, input_number_phone, go_on, input_cod, geolocation_ok
Определяем ОС:
# Определение ОС
info, put = get_OC()
print(info)
Задаем параметры браузера:
# путь к драйверу chrome
chromedriver = put
options = webdriver.ChromeOptions()
options.add_argument('--start-minimize')
browser = webdriver.Chrome(executable_path=chromedriver, chrome_options=options)
Если вы работаете с Firefox тогда, прочтите как работать с ним с помощью библиотеки selenium.webdriver.
Запускается браузер и заходит на страницу Tinder:
# После успешного входа в систему переходим на страницу
browser.get('https://tinder.com/app/recs')
Теперь начинаем использовать функции подготовленные ранее:
# Открываем txt файлы с данными
info_txt, log = information_from_txt_files()
print(info_txt)
# Закрываем в начале всплывающее окно
print(close_start_popups(browser))
# Нажимаем Вход с помощью телефона
print(log_in_using_your_phone(browser))
# Вводим номер телефона
print(input_number_phone(browser, log))
# Нажимаем кнопку Продолжить
print(go_on(browser))
# Вводим код
print(input_cod(browser))
# Нажимаем кнопку Продолжить
print(go_on(browser))
# Нажимаем кнопку Разрешить определять геолокацию
print(geolocation_ok(browser))
# Нажимаем Выключить уведомления
print(notice_off(browser))
# Нажимаем Лайк
click_like(browser)
Заключение
В итоге получите бота который заходит на сайт Tinder и нажимает на Like.
Вам остается только зайти в приложение через пару часов и начать общаться с уже взаимными
симпатиями.
Автоматизация — это старания мужчин упростить работу настолько, чтобы её могли делать женщины.
В следующей статье реализуем возможность отправлять сообщения для взаимных лайков.