Это может показаться забавным, но да, я создал бота, чтобы использовать свой Tinder. Вы можете подумать, что было главной мотивацией. На самом деле я просто хотел смягчить свой следующий матч, сказав "Да, мой бот совпал с нами, хочу увидеть моего бота" * подмигнуть.
Примечание. Используйте эту строку на свой страх и риск. Если вы хотите, чтобы вас называли мерзавцем, вы в правильном месте. Эй, эй, никто не называл меня ползучей, хорошо. Это был мой друг, ладно, лол
* В драматической сцене
Дамы и господа, обратите внимание на будущее свиданий, T-Man, ваш помощник в Tinder.
* Более интенсивно
Использование тиндера — это не весело!!!!!, хочу оживить вашу жизнь на свиданиях!!!. Используйте T-Man, чтобы выбрать партнеров для вас. Позвольте боту делать все свайпы, когда вы отдыхаете. Вы один из тех занятых руководителей, у которых нет времени листать вправо и влево. T-Man — это именно то, что вам нужно.
Ладно, давайте сейчас перейдем к техническим аспектам. В этой статье я объясню все биты и байты бота.
Как и в любой другой статье, я буду следовать принципу «разделяй и властвуй» для разделения и решения проблем.
Проблемы
- Общение с Android
- Программное управление устройством
- Захват изображений
- Обнаружение человека на этом изображении
- Классификация изображения
- Принимая решения
Общение с Android
У меня есть только одно слово, т.е. ADB. Для всех, кто задается вопросом, что, черт возьми, такое adb, расслабьтесь, я прикрою вашу спину. ADB означает Android Debug Bridge, который в основном используется (как вы уже догадались, ДА!) программистами или разработчиками. Он позволяет установить TCP-соединение через USB или удаленно (в зависимости от ваших устройств). Он состоит из клиента и сервера на хост-компьютере, где сервер подключается к демону на устройстве Android.
Программное управление устройством
ADB — это просто механизм для связи, но основная проблема заключается в программном управлении устройством Android. Поскольку python — мой хлеб с маслом, мне просто нужна клиентская библиотека ADB. Итак, я наткнулся на хорошо документированную библиотеку, а именно pure-python-adb, к которой мы и будем обращаться для общения.
Захват изображений
Теперь у нас есть возможность управлять устройством. Мы можем просто сделать снимок экрана после того, как заставим устройство открывать Tinder при запуске скрипта. После того, как снимок экрана сделан на устройстве, он загружается через adb на наше локальное устройство (ПК).
Обнаружение человека на этом изображении
Обнаружение человека на изображении — довольно простая задача, так как мы будем использовать haarcascade OpenCv для обнаружения лиц спереди.
Классификация изображения
В этом проекте мы будем просто классифицировать пол человека и возраст. Уловка состоит в том, чтобы провести пальцем вправо для всех женщин, обнаруженных в пределах возрастного ограничения. Вы же не хотите свайпать вправо ко всем изображениям, не так ли? *подмигивание . Здесь мы будем использовать модель небольшого кафе.
Принятие решений
После того, как мы классифицировали изображения, нам нужен механизм для смахивания вправо или влево. Опять же adb пригодится.
Код
Всю реализацию вы можете найти на моем личном GitHub. Т-Мэн
Требования
- питон 3.9
2. адб
Для системы Debian выполните
sudo apt install adb -y
Настройка проекта
- клонировать репозиторий
git clone https://github.com/dcostersabin/T-Man.git
2. войти внутрь T-Man
cd T-Man
3. Требования к установке
pip install -r requirements.txt
Выполняется
python main.py --PIN ****<your phones pin code>
Пояснение
Я не буду рассматривать каждый файл построчно, потому что многие из них не требуют пояснений, но я дам ссылку на то, где находится код для частей, которые я буду объяснять.
Инициализация клиента ADB
TClient.py -> TClient
class TClient(Client):
Мы создаем класс, наследуя все свойства класса Client. Поскольку конфигурация по умолчанию — это все, что нам нужно.
Client.py (предоставляется установленной библиотекой)
class Client(Host): def __init__(self, host='127.0.0.1', port=5037): self.host = host self.port = port .....
TClient.py -> TClient
def __show_connected_devices(self): print(f'Total Connected Devices {len(self.devices())}\n') for idx, device in enumerate(self.devices()): print(f'Device #{idx + 1}\'s Serial: {device.serial}') def __select_main_device(self): self.main_device = self.devices()[0] if len(self.devices()) > 0 else self.__close() print(f'\nSelecting Main Device as {self.main_device.serial}')
__show_connected_devices перечисляет все устройства, подключенные к ПК через adb
__select_main_device устанавливает первое устройство в качестве нашего основного устройства, которое будет использоваться
Итак, после того, как мы инициализировали наше рабочее устройство, теперь нам нужно разблокировать телефон. Код для разблокировки телефона можно найти в Unlocker.py.
class Unlock: def __init__(self, device: Device, passwd: str): self.main_device = device self.passwd = passwd self.status = True self.__check_status() self.__unlock() def __check_status(self): _command = "dumpsys power | grep 'mWakefulness='" status = str(self.main_device.shell(_command).split('=')[1].strip()) self.status = True if status == "Asleep" or status == "Dozing" else False def __unlock(self): _command = f'input keyevent POWER && input swipe 600 600 0 0 ' \ f'&& input text {self.passwd} && input keyevent 66' if self.status: self.main_device.shell(_command)
Unlocker.py содержит простой класс Unlock, который принимает в качестве параметра устройство и пароль. Во-первых, он проверяет, бодрствует ли телефон или спит.
Если телефон находится в спящем режиме, он пробуждается, имитируя ключевое событие для разблокировки телефона. Затем он проводит пальцем вверх, вводит пароль для нас и программно нажимает ввод.
После того, как мы разблокировали устройство, нам нужно проверить, присутствует ли Tinder или нет. Если он присутствует, нам нужно дать команду нашему устройству открыть приложение, иначе перенаправить устройство в игровой магазин, где они могут установить Tinder.
Check.py –> TinderCheck
class TinderCheck: def __init__(self, device: Device): self.main_device = device self.exists = False self.__check_tinder() def __check_tinder(self): if self.main_device.is_installed('com.tinder'): print('*********** Opening Tinder ***********') self.__open_tinder()note: Please don’t try this at home or anywhere , get a life and make a real girlfriend. else: print('************ Tinder Not Found ************ \n') self.__install_tinder() def __install_tinder(self): _command = "am start -a android.intent.action.VIEW -d 'market://details?id=com.tinder'" self.main_device.shell(_command) print("___________ Redirecting To Tinder On Play Store ___________") def __open_tinder(self): _command = "monkey -p com.tinder -c android.intent.category.LAUNCHER 1" self.main_device.shell(_command) self.exists = True
Как упоминалось ранее, он открывает приложение Tinder, если оно присутствует на устройстве.
Теперь предположим, что мы находимся внутри приложения и нам нужно захватить изображение того, что на экране. Это делается с помощью отдельного класса Capture.
class Capture: def __init__(self, device: Device): self.main_device = device self.base_dir = Path(__file__).resolve().parent.parent self.__create_dir() def __create_dir(self): if os.path.exists(f'{self.base_dir}/temp'): return print(f'Creating temp Directory In {self.base_dir}') os.mkdir(f'{self.base_dir}/temp') def capture(self): _command = "screencap -p sdcard/tinder_check.png" self.main_device.shell(_command) self.__save() def __save(self): self.main_device.pull('/sdcard/tinder_check.png', f'{self.base_dir}/temp/temp.png') self.__resize() def __resize(self): img = cv2.imread(f'{self.base_dir}/temp/temp.png') height, width = img.shape[0], img.shape[1] height_cutoff = height // 6 crop_image = img[height_cutoff: height - height_cutoff, :] cv2.imwrite(f'{self.base_dir}/temp/temp.png', crop_image)
В этом классе сначала мы создаем временный каталог для сохранения захваченного изображения, если оно отсутствует. Затем мы приказываем устройству сделать снимок экрана и сохранить его как tinder_check.png. После того, как он захватил изображение, мы загружаем это изображение, а именно tinder_check.png, на наше локальное устройство (ПК) с помощью метода pull adb. После того, как мы вытащили изображение, хранящееся на устройстве Android, на наше локальное устройство, мы затем выполняем некоторую предварительную обработку, то есть мы обрезаем изображение, чтобы исключить верхнюю часть, чтобы наше лицо в приложении Tinder не было обнаружено.
Мы уже на полпути, все, что нам нужно сделать, это классифицировать изображение и принять решение. Часть обнаружения и классификации можно найти в файле AI.py.
AI.py -> Модель
def __predict(self, image, rectangles): for (x, y, w, h) in rectangles: w = w + 100 h = h + 100 face_img = image[y:y + h, x:x + w].copy() cv2.imwrite(f'{self.base_dir}/temp/a.png', face_img) blob = cv2.dnn.blobFromImage(face_img, 1, (227, 227), MODEL_MEAN_VALUES, swapRB=False) self.gender_net.setInput(blob) gender_preds = self.gender_net.forward() gender = gender_list[gender_preds[0].argmax()] self.detected_genders.append(gender) self.age_net.setInput(blob) age_predict = self.age_net.forward() age = age_list[age_predict[0].argmax()] self.detected_ages.append(age)
Я не буду вдаваться в подробности каждой строки этого файла, потому что все, что мы делаем, это загружаем предварительно обученную модель и прогнозируем. Здесь мы добавляем все обнаруженные полы на изображении и их возраст соответственно.
Теперь наступает процесс принятия решений, который можно найти в Inputs.py. В этом файле есть логика для свайпов вправо и влево через adb. Принятие решения выглядит примерно так
if len(genders) == 0 and len(ages) == 0: self.__swipe_left() return if genders.count('Male') > 0: self.__swipe_left() return
Мы не хотим проводить пальцем вправо, если пол или возраст не обнаружены. В случае обнаружения это должны быть только самки, а не самцы. (ржу не могу)
if age > 18: self.__swipe_right() return
Здесь мы смахиваем вправо всех женщин, чей возраст больше 18 (* должно быть законным правом, лол)
Итак, ребята, теперь у вас есть бот, который подберет вам матч.
Примечание: пожалуйста, не пытайтесь делать это дома или где бы то ни было, живите жизнью, заводите друзей и, пожалуйста, найдите настоящую девушку. В реальной жизни это не сработает, поверьте мне, лол.
Кто такой Сабин Шарма?
Если вас интересуют алгоритмы, вам следует ознакомиться с другими моими статьями: AsleepМолекулярно-динамическое моделирование твердых сфер — приоритетная очередь в действии с Java, Создайте свою собственную игру с искусственным интеллектом, NVIDIA Fan Controller для Linux (DIY ).
А если вас интересует кибербезопасность, прочтите мою недавнюю статью Запачкать руки: использование уязвимости переполнения буфера в C