Думаю многие любят знакомиться в соц. сетях и пользуются приложениями (например 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.
Вам остается только зайти в приложение через пару часов и начать общаться с уже взаимными
симпатиями.
Автоматизация — это старания мужчин упростить работу настолько, чтобы её могли делать женщины.В следующей статье реализуем возможность отправлять сообщения для взаимных лайков.
tushev
Вот бы еще ИИ подключить, который бы сам отбирал фотографии по красоте. Вроде были какие то нейронные сети которые определяют красоту человека.
sparhawk
Уже было в интернете: blog.skillfactory.ru/nauka-o-dannyh-data-science/haknut-tinder-kak-nauchit-ii-svajpat-za-vas
Кстати, там более «красивый» способ управления: через вызовы API, а не через Selenium
svetlogor Автор
Предлагаю реализацию через Selenium, ибо не повторяться, ибо вариация реализации.