Не так давно в личку на Хабре мне написал «junior python backand» с предложением поработать над автоматизацией процесса накопления призовых баллов в программе Microsoft Rewards.

Если кратко, Microsoft отсыпает пользователям своих продуктов вознаграждения в виде баллов, которые можно монетизировать. Например, каждый день пользуешься поисковиком Bing, копишь баллы, покупаешь на них ключи Xbox...

Автор сообщения, по его словам, уже сделал часть работы, но его не устраивает, что всё работает на Selenium, что достаточно ресурсозатратно. А хотелось бы, чтобы всё крутилось на запросах.

В этом месте я должен предупредить, что в отличие от автора сообщения, я даже не джун. Я всего лишь начинающий разработчик, которому нравится автоматизировать работу с веб-сервисами. И надеюсь, что мои рассуждения, как начинающего, могут пригодиться в процессе обучения других начинающих.

Так вот, беря во внимание ограничения, что программа должна быть легковесной, нежадной на ресурсы, и вообще работать на одних реквестах, вчера я приступил к написанию кода. И оказалось всё не так просто, как казалось.

Первая сложность: процесс прохождения авторизации в Microsoft Rewards невозможен простыми запросами, так как Microsoft требует выполнения JavaScript для процесса входа, что библиотека requests не поддерживает. Поэтому капельку Selenium всё же пришлось добавить, но только для получения cookies.

class CookieMaker:
    
    def get_cookies_with_selenium(url: str, user_profile: str, pause: int = 5):
        """
        Получение cookies с помощью Selenium.
        """

        # Настройка параметров Chrome
        options = Options()
        options.add_argument(f"user-data-dir={user_profile}")

        # Инициализация WebDriver с профилем пользователя
        driver = webdriver.Chrome(options=options)
        
        driver.get(url)
        
        time.sleep(pause)
        
        cookies = driver.get_cookies()
        driver.quit()
        logger.info('Куки получены.')
        return cookies


    def save_cookies_to_file(cookies, filename: str) -> None:
        """
        Сохранеие cookies в файл.
        """
        with open(filename, 'w') as file:
            json.dump(cookies, file)
            logger.info('Куки сохранены.')

Для удобства я соединил две функции по извлечению и сохранению cookies в отдельный класс. Первый метод просто открывает Chrome из-под существующего профиля пользователя установленного на машине браузера, заходит на сайт платформы, и возвращает полученные куки. Предполагается, что перед этим мы уже авторизовались на платформе руками. Второй метод сохраняет полученные куки в json-файл для последующего использования в http-запросах. В примере я так же использую объект logger из встроенного модуля logging, для вывода информации в консоль и записи логов в файл. Это в разы удобнее, чем print.

Получив cookies мы уже может слать get-запросы в поисковик Bing и получать за это немного баллов.

class CookieRequests:

    def load_cookies_from_file(filename):
        """
        Загрузка куки из файла.
        """
        with open(filename, 'r') as file:
            cookies = json.load(file)
        return cookies

    def cookies_to_requests_format(cookies):
        """
        Перевод куки в формат под requests.
        """
        session_cookies = {}
        for cookie in cookies:
            session_cookies[cookie['name']] = cookie['value']
        return session_cookies

    def make_request_with_cookies(url: str, cookies, prox: bool):
        """
        Запрос с куки.
        """
        session = requests.Session()
        session.cookies.update(cookies)
        if prox:
            response = session.get(url, proxies=proxies)
            return response
        response = session.get(url)
        return response

Для этого нужно лишь извлекать куки из записанного ранее файла, переводить в формат под библиотеку requests, и использовать в сессии для отправки get-запросов. Метод make_request_with_cookies из примера выше так же принимает аргумент «prox», в виде булевого значения, и если он True, использует в get-запросе proxies из отдельного файла конфигурации, так как из России программа Rewards недоступна. Можно назвать это второй небольшой трудностью.

А самая большая трудность для меня, это автоматизация оставшейся части заданий на платформе. Вознаграждают Microsoft не только за использование поисковика, но и за чтение статей, участие в простых викторинах. И размер вознаграждения за эти действия значительно выше. Всё тоже очень просто, все ссылки, которые нужно открыть, находятся на главной странице платформы. Вот только подгружаются эти ссылки динамически и в загруженном изначально HTML их просто нет. Поэтому преодолеть этот этап, не воспользовавшись Selenium, я увы не смог.

А автоматизированную работу с поисковиком Bing я оформил в виде небольшого проекта MS-R-farmer, дописав еще несколько модулей с логикой работы бота. При первом запуске он получает куки, а далее в бесконечном цикле, через определенные промежутки времени, просто отслылает рандомные get-запросы, используя ресурсов не больше калькулятора. Никто не мешает масштабироваться и запустить ферму для прокачки N-ного числа аккаунтов, но мне это не интересно. А вот ваши замечания, пулл-реквесты и звезды на GitHub приветствуются.

Комментарии (5)


  1. Spiritschaser
    11.07.2024 13:01
    +1

    Простите, современные chrome под selenium передают "Chrome is being controlled by automated test software" -причём, из командной строки/настроек это не убирается. Неужели майки не следят за "чистотой" клиента?


    1. it_police Автор
      11.07.2024 13:01

      Наверняка следят и за роботность наверняка могут забанить. Но в этом случае селениум вообще никаких автоматизированных действий не воспроизводит с контентом, он лишь единоразово посещает ресурс.


  1. Andrey_Solomatin
    11.07.2024 13:01
    +1

    А вот ваши замечания, пулл-реквесты и звезды на GitHub приветствуются.

    Дерзко, инструкция как надрать микрософт выложенная на его собственном сервисе :)


    1. it_police Автор
      11.07.2024 13:01

      Это же просто эксперимент исключительно в научных целях :) Кроме того, по сравнению с другими инструкциями на гитхабе, тут просто детская шалость.


  1. Spiritschaser
    11.07.2024 13:01

    Спасибо. Так-то даже в гугл нельзя залогиниться - я, чтобы не пересобирать, использовал старую версию - она ещё не "светилась".