Untitled

 avatar
unknown
python
2 years ago
22 kB
3
Indexable
def register(proxy):
    url = f"https://reddit.com/register"
    release_ip(proxy=proxy)

    proxy = proxy['proxy']
    password = passgen.passgen()


    # try:
    #     data = kopeechka_body.mailbox_get_email(site="reddit.com",
    #                                                  mail_type="hotmail.com",
    #                                                  sender="noreply@reddit.com")
    #     email_address = data.mail
    #     task_id = data.id
    #     print(email_address)
    # except Exception as e:
    #     print(e)
    #     return False

    random_string = ''.join(random.choices(string.ascii_letters, k=random.randint(4, 6)))
    random_string += ''.join(random.choices(string.digits, k=random.randint(3, 5)))
    email_address = f"{random_string}@gmail.com"

    # while True:
    #     username = f"{random.choice(adjectives).capitalize()}_{random.choice(nouns).capitalize()}_{int(random.randint(20, 700))}"
    #     if 7 < len(username) < 20:
    #         break

    # print(username)
    # print(f"Email address is: {email_address}")

    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"
    }

    release_ip(proxy={"proxy": proxy})

    session = requests.Session()
    session.headers = headers
    # session.verify = False

    session.proxies = {
        "http": f"http://{proxy}",
        "https": f"https://{proxy}"
    }

    try:
        for _ in range(3):
            try:
                response = session.get(url, follow_redirects=True)
                break
            except Exception as e:
                pass

        print(f"Getting registration page: {response.status_code}")

        soup = bs(response.content, "lxml")
        token = soup.findAll('input')[1]['value']
        # print(f"My first token is: {token}")

        # GETTING USERNAMES
        for _ in range(3):
            try:
                response = session.get('https://www.reddit.com/api/v1/generate_username.json', follow_redirects=True)
                break
            except Exception as e:
                pass

        username = random.choice(response.json()['usernames'])
        print(f"Username is: {username}")

        # captcha
        captcha_key = ""
        site_key = "6LeTnxkTAAAAAN9QEuDZRpn90WwKk_R1TRW_g-JC"
        site_url = "https://reddit.com/register"
        send_captcha = "https://ocr.captchaai.com/in.php"
        get_captcha = "https://ocr.captchaai.com/res.php"

        params = {
            "key": captcha_key,
            "method": "userrecaptcha",
            "googlekey": site_key,
            "pageurl": site_url
        }
        g_response = None
        try:

            response = requests.get(send_captcha, params=params)

            task_id = response.content.decode().split("|")[1]

            # print(task_id)

            params = {
                "key": captcha_key,
                "action": "get",
                "id": task_id,
            }

            captcha_fails = 0
            while True:
                if captcha_fails >= 8:
                    print(f"We could not solve captcha.")
                    break
                try:
                    res = requests.get(get_captcha, params=params, timeout=22)
                    g_response = res.content.decode().split("|")[1]
                    # print(g_response)
                    break
                except IndexError:
                    # print(f"Captcha still processing.")
                    captcha_fails += 1
                    time.sleep(10)
                    continue
        except Exception as e:
            # print(e)
            session.close()
            return False

        if token is None:
            session.close()
            print(f"Failed to get token.")
            return False

        if g_response:

            session.headers.update({
                'authority': 'www.reddit.com',
                'accept': '*/*',
                'accept-language': 'en-US,en;q=0.9',
                'content-type': 'application/x-www-form-urlencoded',
                'origin': 'https://www.reddit.com',
                'referer': 'https://www.reddit.com/register/',
                'sec-ch-ua': '"Google Chrome";v="113", "Chromium";v="113", "Not-A.Brand";v="24"',
                'sec-ch-ua-mobile': '?0',
                'sec-ch-ua-platform': '"Windows"',
                'sec-fetch-dest': 'empty',
                'sec-fetch-mode': 'cors',
                'sec-fetch-site': 'same-origin',
                'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',
            })

            data = {
                'csrf_token': f'{token}',
                'g-recaptcha-response': f'{g_response}',
                'password': f'{password}',
                'dest': 'https://www.reddit.com',
                'email_permission': 'false',
                'lang': 'en-US',
                'username': f'{username}',
                'email': f'{email_address}',
            }

            # registering
            for _ in range(4):
                try:
                    response = session.post('https://www.reddit.com/register', data=data, follow_redirects=True)
                    break
                except Exception as e:
                    pass

            # session.close()

            # print(f"Registering response: {response.status_code}")

            if response.status_code != 200:
                print(response.content)

            if response.status_code == 200:
                today = datetime.strftime(datetime.today(), "%Y-%m-%d")
                created_accounts.insert_one({
                    'username': username,
                    'password': password,
                    'email': email_address,
                    'age': today,
                    'verified': False,
                    'requests': True
                })

                session, loid, bearer = get_loid_and_bearer_from_url(url="https://reddit.com", session=session)

                session.headers = {}

                session.headers = {
                    'authority': 'gql.reddit.com',
                    'accept': '*/*',
                    'accept-language': 'en-US,en;q=0.9',
                    'content-type': 'application/json',
                    'authorization': f'Bearer {bearer}',
                    'origin': 'https://www.reddit.com',
                    'referer': 'https://www.reddit.com/',
                    'sec-ch-ua': '"Google Chrome";v="113", "Chromium";v="113", "Not-A.Brand";v="24"',
                    'sec-ch-ua-mobile': '?0',
                    'sec-ch-ua-platform': '"Windows"',
                    'sec-fetch-dest': 'empty',
                    'sec-fetch-mode': 'cors',
                    'sec-fetch-site': 'same-site',
                    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',
                    'x-reddit-compression': '1',
                    'x-reddit-loid': f'{loid}',
                }

                json_data = {
                    'id': '670e8e8d3018',
                    'variables': {
                        'input': {
                            'customGender': None,
                            'genderEnum': 'FEMALE',
                        },
                    },
                }

                for _ in range(4):
                    try:
                        response = session.post('https://gql.reddit.com/', json=json_data, follow_redirects=True)
                        break
                    except Exception as e:
                        pass

                # print(f"Sending gender response: {response.status_code}")

                if response.status_code != 200:
                    print(response.content)
                    session.close()
                    quit(0)

                # GETTING THE INTERESTS
                json_data = {
                    'id': '7637265b3b63',
                    'variables': {
                        'first': 500,
                        'maxChildren': 500,
                        'maxDepth': 2,
                        'schemeName': 'topic_chaining_icons',
                        'onboardingFlow': 'ONBOARDING',
                    },
                }

                for _ in range(4):
                    try:
                        response = session.post('https://gql.reddit.com/', json=json_data, follow_redirects=True)
                        break
                    except Exception as e:
                        pass

                # print(f"Getting interests response: {response.status_code}")

                session.headers = {}

                session.headers = {
                    'authority': 'gql.reddit.com',
                    'accept': '*/*',
                    'accept-language': 'en-US,en;q=0.9',
                    'authorization': f'Bearer {bearer}',
                    'content-type': 'application/json',
                    'origin': 'https://www.reddit.com',
                    'referer': 'https://www.reddit.com/',
                    'sec-ch-ua': '"Google Chrome";v="113", "Chromium";v="113", "Not-A.Brand";v="24"',
                    'sec-ch-ua-mobile': '?0',
                    'sec-ch-ua-platform': '"Windows"',
                    'sec-fetch-dest': 'empty',
                    'sec-fetch-mode': 'cors',
                    'sec-fetch-site': 'same-site',
                    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',
                    'x-reddit-compression': '1',
                    'x-reddit-loid': f'{loid}',
                }

                # TODO: parse the interests and pick randomly.
                response_str = response.content.decode('utf-8')
                json_data = json.loads(response_str)

                edges = json_data['data']['interestTopics']['edges']
                random.shuffle(edges)
                interest_blocks = edges[:5]
                random_interests = []
                for one in interest_blocks:
                    interest = one['node']['id']
                    random_interests.append(interest)

                # print(f"My interests: {random_interests}")

                json_data = {
                    'id': 'c79807b42f04',
                    'variables': {
                        'topicIds': random_interests,
                        'schemeName': 'topic_chaining_icons',
                        'maxSubreddits': 10,
                        'onboardingFlow': 'ONBOARDING',
                    },
                }

                for _ in range(4):
                    try:
                        response = session.post('https://gql.reddit.com/', json=json_data, follow_redirects=True)
                        break
                    except Exception as e:
                        pass

                print(f"Sending interests response: {response.status_code}")

                # if response.status_code != 200:
                #     # print(response.content)

                # print(f"interests response: {response.content}")

                # TODO: the content of the response here has the subreddits.
                # TODO: get the subreddits after sending the interests.
                response_str = response.content.decode('utf-8')
                json_data = json.loads(response_str)

                topics = json_data['data']['interestTopicsByIds']['edges']
                random.shuffle(edges)
                random_subs = []
                for one in topics:
                    subreddits = one['node']['topic']['subreddits']['edges']
                    random.shuffle(subreddits)
                    random_sub = subreddits[0]['node']['id']
                    random_subs.append(random_sub)

                my_chosen_subs = ",".join(random_subs)
                # print(my_chosen_subs)

                sleep(random.randint(2, 4))

                session.headers = {}

                session.headers = {
                    'authority': 'oauth.reddit.com',
                    'accept': '*/*',
                    'accept-language': 'en-US,en;q=0.9',
                    'authorization': f'Bearer {bearer}',
                    'content-type': 'application/x-www-form-urlencoded',
                    'origin': 'https://www.reddit.com',
                    'referer': 'https://www.reddit.com/',
                    'sec-ch-ua': '"Google Chrome";v="113", "Chromium";v="113", "Not-A.Brand";v="24"',
                    'sec-ch-ua-mobile': '?0',
                    'sec-ch-ua-platform': '"Windows"',
                    'sec-fetch-dest': 'empty',
                    'sec-fetch-mode': 'cors',
                    'sec-fetch-site': 'same-site',
                    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',
                    'x-reddit-loid': f'{loid}'
                }

                params = {
                    'redditWebClient': 'desktop2x',
                    'app': 'desktop2x-client-production',
                    'raw_json': '1',
                    'gilding_detail': '1',
                }

                data = {
                    'action': 'sub',
                    'sr': f'{my_chosen_subs}',
                    'api_type': 'json',
                }

                for _ in range(4):
                    try:
                        response = session.post('https://oauth.reddit.com/api/subscribe',
                                                params=params,
                                                data=data, follow_redirects=True)
                        break
                    except Exception as e:
                        pass

                # print(f"Sending subreddits response: {response.status_code}")

                print(f"Username: {username} - Password: {password}")

                sleep(random.randint(4, 8))

                # getting the csrf token we need
                session.headers = {}

                # GETTING A RANDOM AVATAR
                session.headers = {
                    'authority': 'snoovatar.reddit.com',
                    'accept': '*/*',
                    'accept-language': 'en-US,en;q=0.9',
                    'authorization': f'Bearer {bearer}',
                    'content-type': 'application/x-www-form-urlencoded',
                    'origin': 'https://www.reddit.com',
                    'referer': 'https://www.reddit.com/',
                    'sec-ch-ua': '"Google Chrome";v="113", "Chromium";v="113", "Not-A.Brand";v="24"',
                    'sec-ch-ua-mobile': '?0',
                    'sec-ch-ua-platform': '"Windows"',
                    'sec-fetch-dest': 'empty',
                    'sec-fetch-mode': 'cors',
                    'sec-fetch-site': 'same-site',
                    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',
                    'x-reddit-loid': f'{loid}'
                }

                for _ in range(4):
                    try:
                        response = session.get('https://snoovatar.reddit.com/api/account',
                                               headers=headers,
                                               follow_redirects=True)
                    except Exception as e:
                        print(e)

                # print(f"Getting second token response: {response.status_code}")
                # print(response.content)
                content = response.json()
                csrf_token = content['csrf_token']
                # print(csrf_token)

                session.headers = {}

                # GETTING A RANDOM AVATAR
                session.headers = {
                    'authority': 'snoovatar.reddit.com',
                    'accept': '*/*',
                    'accept-language': 'en-US,en;q=0.9',
                    'authorization': f'Bearer {bearer}',
                    'content-type': 'application/x-www-form-urlencoded',
                    'origin': 'https://www.reddit.com',
                    'referer': 'https://www.reddit.com/',
                    'sec-ch-ua': '"Google Chrome";v="113", "Chromium";v="113", "Not-A.Brand";v="24"',
                    'sec-ch-ua-mobile': '?0',
                    'sec-ch-ua-platform': '"Windows"',
                    'sec-fetch-dest': 'empty',
                    'sec-fetch-mode': 'cors',
                    'sec-fetch-site': 'same-site',
                    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',
                    'x-reddit-loid': f'{loid}'
                }

                response = session.get('https://snoovatar.reddit.com/api/snoovatars/random:byId', follow_redirects=True)

                # print(f"Getting a random avatar response: {response.status_code}")
                # print(f"avatar response: {response.content}")

                sleep(random.randint(4, 7))

                content = response.json()
                items = content['accessory_ids']
                # print(f"Avatar Items: {items}")

                session.headers = {}
                session.headers = {
                    'authority': 'snoovatar.reddit.com',
                    'accept': '*/*',
                    'accept-language': 'en-US,en;q=0.9',
                    'access-control-request-headers': 'authorization,content-type,x-csrf-token,x-reddit-loid,x-reddit-session',
                    'access-control-request-method': 'POST',
                    'origin': 'https://www.reddit.com',
                    'referer': 'https://www.reddit.com/',
                    'sec-fetch-dest': 'empty',
                    'sec-fetch-mode': 'cors',
                    'sec-fetch-site': 'same-site',
                    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',
                }

                params = {
                    'skip_telemetry': 'true',
                }

                response = session.options('https://snoovatar.reddit.com/api/snoovatar',
                                           params=params,
                                           follow_redirects=True)

                # print(f"Sending avatar options response: {response.status_code}")

                # session_tracker = ""
                #
                # for one in session.cookies.items():
                #     name = one[0].lower()
                #     value = one[1]
                #
                #     if name == "session_tracker":
                #         session_tracker = value
                #
                # print(f"My session tracker is: {session_tracker}")

                session.headers = {}
                session.headers = {
                    'authority': 'snoovatar.reddit.com',
                    'accept': '*/*',
                    'accept-language': 'en-US,en;q=0.9',
                    'authorization': f'Bearer {bearer}',
                    'content-type': 'application/json',
                    'origin': 'https://www.reddit.com',
                    'referer': 'https://www.reddit.com/',
                    'sec-ch-ua': '"Google Chrome";v="113", "Chromium";v="113", "Not-A.Brand";v="24"',
                    'sec-ch-ua-mobile': '?0',
                    'sec-ch-ua-platform': '"Windows"',
                    'sec-fetch-dest': 'empty',
                    'sec-fetch-mode': 'cors',
                    'sec-fetch-site': 'same-site',
                    'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36",
                    'x-csrf-token': f'{csrf_token}',
                    'x-reddit-loid': f'{loid}'
                }

                params = {
                    'skip_telemetry': 'true',
                }

                json_data = OrderedDict([
                    ('accessory_ids', items),
                    ('styles', {}),
                    ('set_avatar_to_profile', True),
                    ('source', 'web_onboarding')
                ])

                # print(json_data)

                response = session.post('https://snoovatar.reddit.com/api/snoovatar',
                                        params=params,
                                        json=json_data,
                                        follow_redirects=True)

                print(f"Choosing avatar response: {response.status_code}")
                # print(f"{response.content}")

                # verify_with_kopeechka(
                #                 username=username,
                #                 session=session,
                #                 task_id=task_id,
                #                 proxy_address=proxy)

                session.close()

                return True
        else:
            # print(response.content)
            session.close()
            return False

    except Exception as e:
        print(e)
        session.close()
Editor is loading...