Ejemplo n.º 1
0
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'))
Ejemplo n.º 2
0
 def __init__(self):
     self.updater = UpdateConfig()
     self.requester = Requester(self.updater.get_config())
Ejemplo n.º 3
0
 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()
Ejemplo n.º 4
0
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"),
                )
Ejemplo n.º 5
0
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)