· 7 years ago · Oct 19, 2018, 04:22 AM
1import json
2import os
3import sys
4import uuid
5from itertools import cycle
6
7import logging
8import random
9import string
10import time
11from faker import Faker
12import requests
13import hashlib
14
15
16# from convert_msg_access_token import convert_to_msg_token
17# from login import FBClient
18
19logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s %(module)s: %(message)s",
20 datefmt='%Y-%m-%d %H:%M:%S')
21logger = logging.getLogger(__name__)
22fake = Faker()
23
24def calculate_signatur(data, secret=None):
25 api_secret = secret
26 sig = ""
27 for key in sorted(data.keys()):
28 sig += "{0}={1}".format(key, data[key])
29 data["sig"] = hashlib.md5((sig + api_secret).encode("utf-8")).hexdigest()
30 return data["sig"]
31
32
33def renew_connection():
34 renew_ip()
35 # if CheckpointChecker.is_consecutive_checkpoint():
36 # renew_ip()
37 # else:
38 # CheckpointChecker.failed_reg()
39
40class FBRegister:
41 API_URL = "https://z-m-api.facebook.com/method/user.register"
42 HEADERS = {
43 "User-Agent": "[FBAN/FB4A;FBAV/175.0.0.40.97;]",
44 }
45
46 APP_ID = "350685531728"
47 APP_SECRET = "62f8ce9f74b12f84c123cc23437a4a32"
48
49 def __init__(self, email, password, first_name="", last_name="", gender="F", birthday="", proxy=None):
50 self.email = email
51 self.password = password
52 if first_name:
53 self.first_name = first_name
54 else:
55 self.first_name = fake.first_name()
56 if last_name:
57 self.last_name = last_name
58 else:
59 self.last_name = fake.last_name()
60 self.gender = gender
61 if birthday:
62 self.birthday = birthday
63 else:
64 self.birthday = str(fake.date_of_birth(tzinfo=None, minimum_age=19, maximum_age=60))
65 self.session = requests.Session()
66 if proxy:
67 logger.info("Use proxy {}".format(proxy))
68 self.session.proxies = {"https": proxy}
69 self.session.verify = False
70
71 @classmethod
72 def send_zeroheader(cls, proxy=None):
73 url = 'https://b-api.facebook.com/method/mobile.zeroHeaderRequest'
74 headers = {
75 'x-fb-friendly-name': 'fetchZeroHeaderRequest',
76 'authorization': 'OAuth null'
77 }
78 data = {
79 'access_token': f'{cls.APP_ID}|{cls.APP_SECRET}',
80 'carrier_mcc': '310',
81 'carrier_mnc': '260',
82 'client_country_code': 'US',
83 'machine_id': "eZKiW2cRfI3_LfPmIn6r64H0",
84 'device_id': str(uuid.uuid4()),
85 'fb_api_caller_class': 'com.facebook.zero.service.ZeroTokenHandler',
86 'fb_api_req_friendly_name': 'fetchZeroHeaderRequest',
87 'force_refresh': 'false',
88 'format': 'json',
89 'header_usage': 'headers_cache_usage',
90 'interface': 'wifi',
91 'locale': 'en_US',
92 'method': 'mobile.zeroHeaderRequest',
93 'sim_mcc': '310',
94 'sim_mnc': '270'
95 }
96 try:
97 response = requests.post(url, data=data, headers=headers, proxies={"https": proxy}, timeout=7)
98 except Exception as e:
99 print(e)
100 else:
101 response = json.loads(response.text)
102 if response.get("edid"):
103 logger.info("Sent zeroHeader request {}".format(proxy or ""))
104 return True
105 return False
106
107 def prepare_request_data(self):
108 data = {"email": self.email, "firstname": self.first_name, "lastname": self.last_name, "gender": self.gender,
109 "password": self.password, "birthday": self.birthday, "attempt_login": "true", "format": "json",
110 "locale": "en_US", "method": "user.register",
111 "fb_api_caller_class": "com.facebook.registration.fragment.RegistrationCreateAccountFragment",
112 "api_key": "882a8490361da98702bf97a021ddc14d"}
113 # data["client_country_code"] = "US"
114 data["sig"] = calculate_signature(data, "62f8ce9f74b12f84c123cc23437a4a32")
115 return data
116
117 def execute(self):
118 # self.send_zeroheader()
119 request_data = self.prepare_request_data()
120 try:
121 response = self.session.post(self.API_URL, data=request_data, headers=self.HEADERS, timeout=20)
122 except Exception:
123 return None, None
124 else:
125 total_time = response.elapsed.total_seconds()
126 response = json.loads(response.text)
127 try:
128 session_info = response["session_info"]
129 uid, access_token = session_info["uid"], session_info["access_token"]
130 logger.info("Registered in {}s - {} - UID: {}".format(total_time, self.email, uid))
131 return uid, access_token
132 except Exception as e:
133 error_code = response.get("error_code")
134 if error_code == 368:
135 logger.info("Register service is current banned")
136 renew_connection()
137 elif error_code == 3107:
138 logger.info("Invalid username {}".format(self.email))
139 elif error_code == 3125:
140 logger.info("Invalid phone {}".format(self.email))
141 else:
142 logger.info(response)
143 return None, None
144
145
146last_created = 0
147fail_count = 0
148
149
150class RandomFBRegister:
151 MAIL_DOMAIN = "gmail.com"
152 last_created = 0
153 fail_count = 0
154
155 @classmethod
156 def check_consecutive_checkpoint(cls):
157 logger.info("Fail count: {}".format(cls.fail_count))
158 if round(time.time() - cls.last_created, 2) <= 10:
159 if cls.fail_count >= 5:
160 logger.info("Low token quality ...")
161 renew_connection()
162 cls.fail_count = 0
163 else:
164 cls.fail_count += 1
165 else:
166 cls.fail_count = 0
167
168 @classmethod
169 def create(cls, proxy=None):
170 cls.check_consecutive_checkpoint()
171 access_token = None
172 while not access_token:
173 username = ''.join(random.choice(string.ascii_lowercase) for x in range(11)) + "@" + cls.MAIL_DOMAIN
174 # username = "038" + ''.join(random.choice(string.digits) for x in range(7))
175 # username = "+1" + random.choice(["316", "769", "515", "228", "231", "385", "386", "231"]) + ''.join(
176 # random.choice(string.digits) for x in range(7))
177 password = "fbtest123"
178 uid, access_token = FBRegister(username, password, proxy=proxy).execute()
179 cls.last_created = time.time()
180 return uid, access_token
181
182
183if __name__ == "__main__":
184 uid, access_token = RandomFBRegister.create()
185 print(uid,access_token)