class GetContactAPI: def __init__(self): self.updater = UpdateConfig() self.requester = Requester(self.updater.get_config()) def get_name_by_phone(self, phoneNumber): response = self.requester.get_phone_name(phoneNumber) if response: name = response['result']['profile']['name'] surname = response['result']['profile']['surname'] if not name and not surname: user_name = None else: user_name = f'{parse_none(name)} {parse_none(surname)}' country_code = response['result']['profile']['countryCode'] country = response['result']['profile']['country'] if not country: country_name = f"{parse_none(country_code)}" else: country_name = f'{country} {parse_none(country_code)}' result = {"name": user_name, "phoneNumber": response['result']['profile']['phoneNumber'], "country": country_name, "displayName": response['result']['profile']['displayName'], "profileImage": response['result']['profile']['profileImage'], "email": response['result']['profile']['email'], "is_spam": True if response['result']['spamInfo']["degree"] == "high" else False} remain_count = response['result']['subscriptionInfo']['usage']['search']['remainingCount'] self.updater.update_remain_count_by_token(config.TOKEN, remain_count) return result else: return {"name": None, "phoneNumber": phoneNumber, "country": config.COUNTRY, "displayName": "Not Found", "profileImage": None, "email": None, "is_spam": False} def get_tags_by_phone(self, phoneNumber): response = self.requester.get_phone_tags(phoneNumber) if response: result = {"tags": [tag['tag'] for tag in response['result']['tags']]} return result else: return {"tags": []} def update_config(self): self.requester.update_config(self.updater.get_config()) def get_name_by_phone_with_change_token(self, phone): result = self.get_name_by_phone(phone) self.update_config() return result def get_information_by_phone(self, phone): result_name = self.get_name_by_phone(phone) result_tags = self.get_tags_by_phone(phone) self.update_config() return dict(**result_name, **result_tags) def print_information_by_phone(self, phone): data = self.get_information_by_phone(phone) self._print_beauty_output(data) def get_from_file(self, file): phones = open(file, 'r').read().split('\n') for phone in phones: self.print_information_by_phone(phone) def _print_beauty_output(self, data): print("Phone:", data['phoneNumber']) print("User:"******"\t", tag.encode('utf-8', errors='replace').decode('utf-8', errors='replace'))
def __init__(self): self.updater = UpdateConfig() self.requester = Requester(self.updater.get_config())
def __init__(self, config_=None): current_config = config_ if config_ else config self.cipher = Cipher(current_config) self.updater = UpdateConfig() self.update_timestamp() self.set_dict()
class GetContactAPI: def __init__(self): self.updater = UpdateConfig() self.requester = Requester(self.updater.get_config()) def get_name_by_phone(self, phoneNumber): Log.d("Call get_name_by_phone with phoneNumber ", phoneNumber) response = self.requester.get_phone_name(phoneNumber) if response: name = response["result"]["profile"]["name"] surname = response["result"]["profile"]["surname"] if not name and not surname: user_name = None else: user_name = f"{parse_none(name)} {parse_none(surname)}" country_code = response["result"]["profile"]["countryCode"] country = response["result"]["profile"]["country"] if not country: country_name = f"{parse_none(country_code)}" else: country_name = f"{country} {parse_none(country_code)}" result = { "name": user_name, "phoneNumber": response["result"]["profile"]["phoneNumber"], "country": country_name, "displayName": response["result"]["profile"]["displayName"], "profileImage": response["result"]["profile"]["profileImage"], "email": response["result"]["profile"]["email"], "is_spam": response["result"]["spamInfo"]["degree"] == "high", } remain_count = response["result"]["subscriptionInfo"]["usage"][ "search"]["remainingCount"] self.updater.update_remain_count_by_token(config.TOKEN, remain_count) return result return { "name": None, "phoneNumber": phoneNumber, "country": config.COUNTRY, "displayName": "Not Found", "profileImage": None, "email": None, "is_spam": False, } def get_tags_by_phone(self, phoneNumber): Log.d("Call get_tags_by_phone with phoneNumber ", phoneNumber) response = self.requester.get_phone_tags(phoneNumber) if response: result = { "tags": [tag["tag"] for tag in response["result"]["tags"]] } return result return {"tags": []} def update_config(self): self.requester.update_config(self.updater.get_config()) def get_name_by_phone_with_change_token(self, phone): Log.d("Call get_name_by_phone_with_change_token with phone ", phone) result = self.get_name_by_phone(phone) self.update_config() return result def get_information_by_phone(self, phone): Log.d("Call get_information_by_phone with phone ", phone) result_name = self.get_name_by_phone(phone) result_tags = self.get_tags_by_phone(phone) self.update_config() return dict(**result_name, **result_tags) def print_information_by_phone(self, phone): Log.d("Call print_information_by_phone with phone ", phone) data = self.get_information_by_phone(phone) self._print_beauty_output(data) def get_from_file(self, file): Log.d("Call get_from_file with file ", file) with open(file, "r") as f: phones = f.read().split("\n") for phone in phones: self.print_information_by_phone(phone) def _print_beauty_output(self, data): Log.d("Call _print_beauty_output with data ", data) print("Phone:", data["phoneNumber"]) print("User:"******"displayName"]) if "tags" in data.keys() and data["tags"]: print("Tag list: ") for tag in data["tags"]: print( "\t", tag.encode("utf-8", errors="replace").decode("utf-8", errors="replace"), )
class Requester: def __init__(self, config_=None): current_config = config_ if config_ else config self.cipher = Cipher(current_config) self.updater = UpdateConfig() self.update_timestamp() self.set_dict() def set_dict(self): self.base_url = "https://pbssrv-centralevents.com" self.base_uri_api = f"/{config.API_VERSION}/" self.methods = { "number-detail": "details", "search": "search", "verify-code": "", "register": "", } self.headers = { "X-App-Version": config.APP_VERSION, "X-Token": config.TOKEN, "X-Os": config.ANDROID_OS, "X-Client-Device-Id": config.DEVICE_ID, "Content-Type": "application/json; charset=utf-8", "Connection": "close", "Accept-Encoding": "gzip, deflate", "X-Req-Timestamp": self.timestamp, "X-Req-Signature": "", "X-Encrypted": "1", } self.request_data = { "countryCode": config.COUNTRY, "source": "", "token": config.TOKEN, } def update_config(self, config): self.cipher.update_config(config) self.set_dict() def update_timestamp(self): self.timestamp = str(time.time()).split(".")[0] def prepare_payload(self, data): return json.dumps(data).replace(" ", "").replace("~", " ") def _send_post(self, url, data): Log.d("Call _send_post with url:", url, "data:", data) response = requests.post(url, data=data, headers=self.headers) self.update_timestamp() return self._parse_response(response) def send_request_encrypted(self, url, data): self.headers["X-Encrypted"] = "1" return self._send_post( url, json.dumps({"data": self.cipher.encrypt_AES_b64(data)})) def send_request_no_encrypted(self, url, data): self.headers["X-Encrypted"] = "0" return self._send_post(url, data) def _parse_response(self, response): Log.d("Call _parse_response with response:", response.text) if response.status_code == 200: return True, response.json()["data"] if response.status_code == 201: return True, response.json() else: Log.d("Not correct answer from server.") response = response.json() if "data" in response.keys(): response = response["data"] Log.d("Response: ", response) response = json.loads(self.cipher.decrypt_AES_b64(response)) Log.d("Response decrypted: ", response) errorCode = response["meta"]["errorCode"] if errorCode == "403004": print("Captcha is detected. ") from getcontact.decode_captcha import CaptchaDecode c = CaptchaDecode() code, path = c.decode_response(response) self.decode_captcha(code) return False, {"repeat": True} if errorCode == "404001": print("No information about phone in database") if errorCode == "403021": # Token dead Log.d("Token is dead.", config.TOKEN) self.updater.update_remain_count_by_token(config.TOKEN, 0) else: Log.d("Unhandled error with response", response) Log.d("Try to use correct token") return False, {} def send_req_to_the_server(self, url, payload, no_encryption=False): payload = self.prepare_payload(payload) self.headers["X-Req-Signature"] = self.cipher.create_signature( payload, self.timestamp) if no_encryption: is_ok, response = self.send_request_no_encrypted(url, payload) else: is_ok, response = self.send_request_encrypted(url, payload) if is_ok: # print(json.loads(self.cipher.decrypt_AES_b64(response))) return json.loads(self.cipher.decrypt_AES_b64(response)) elif not is_ok and "repeat" in response.keys() and response["repeat"]: return self.repeat_last_task() else: return response def repeat_last_task(self): function = self.current_task["function"] phone = self.current_task["phone"] if function == "get_phone_name": return self.get_phone_name(phone) elif function == "get_phone_tags": return self.get_phone_tags(phone) def get_phone_name(self, phoneNumber): self.current_task = { "function": "get_phone_name", "phone": phoneNumber } self.update_config(config) method = "search" self.request_data["source"] = self.methods[method] self.request_data["phoneNumber"] = phoneNumber return self.send_req_to_the_server( self.base_url + self.base_uri_api + method, self.request_data) def get_phone_tags(self, phoneNumber): self.current_task = { "function": "get_phone_tags", "phone": phoneNumber } self.update_config(config) method = "number-detail" self.request_data["source"] = self.methods[method] self.request_data["phoneNumber"] = phoneNumber return self.send_req_to_the_server( self.base_url + self.base_uri_api + method, self.request_data) def decode_captcha(self, code): self.update_config(config) captcha_data = {"token": config.TOKEN, "validationCode": code} return self.send_req_to_the_server( self.base_url + self.base_uri_api + "verify-code", captcha_data)