Skip to content

Commit 6fa17ab

Browse files
committed
Add ProbivApiPhoneInfo class for searching information by phone number using probivapi.com
1 parent 8ff75f9 commit 6fa17ab

File tree

3 files changed

+124
-30
lines changed

3 files changed

+124
-30
lines changed

Diff for: CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# gods_eye changelog
22

3+
## 1.2.0
4+
5+
- Add ProbivApiPhoneInfo class for searching information by phone number using probivapi.com
6+
37
## 1.1.2
48
- Changed README
59

Diff for: setup.cfg

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[metadata]
22
name = gods_eye
3-
version = 1.1.2
3+
version = 1.2.0
44
author = Pavel Dat
55
author_email = [email protected]
66
description = A set of tools which should be used in Gods Eye

Diff for: src/phone_info/phone_info.py

+119-29
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,17 @@
77
▒▐█░░░▐█─░▐█░▒▀▄▀░░▐█▄▄▒██▄▄█░▐█▄█▀░▐█─░▐█░▒▄█▄░
88
"""
99

10-
import sys
1110
import logging
11+
import sys
1212
from pathlib import Path
1313

1414
import folium
1515
import phonenumbers
16-
from phonenumbers import geocoder, carrier
16+
import requests
1717
from opencage.geocoder import OpenCageGeocode
18+
from phonenumbers import carrier, geocoder
1819

19-
sys.path.insert(
20-
0,
21-
'src'
22-
)
20+
sys.path.insert(0, "src")
2321

2422
from logger.logger import Logger
2523

@@ -29,9 +27,7 @@ class PhoneInfo:
2927
Gets info by phone number.
3028
"""
3129

32-
def __init__(self,
33-
number: str,
34-
debug: bool = False) -> None:
30+
def __init__(self, number: str, debug: bool = False) -> None:
3531
"""
3632
Constructor.
3733
@@ -65,9 +61,9 @@ def get_country(self) -> str:
6561
"""
6662

6763
number = phonenumbers.parse(self.__number)
68-
self.__logger.info('Find country')
69-
country = geocoder.description_for_number(number, 'en')
70-
self.__logger.debug(f'Country found: {country}')
64+
self.__logger.info("Find country")
65+
country = geocoder.description_for_number(number, "en")
66+
self.__logger.debug(f"Country found: {country}")
7167
return country
7268

7369
def get_operator(self) -> str:
@@ -79,14 +75,12 @@ def get_operator(self) -> str:
7975
"""
8076

8177
number = phonenumbers.parse(self.__number)
82-
self.__logger.info('Find operator')
83-
operator = carrier.name_for_number(number, 'en')
84-
self.__logger.debug(f'Operator found: {operator}')
78+
self.__logger.info("Find operator")
79+
operator = carrier.name_for_number(number, "en")
80+
self.__logger.debug(f"Operator found: {operator}")
8581
return operator
8682

87-
def draw_map(self,
88-
api_key: str = None,
89-
path_to_save: [str, Path] = None) -> None:
83+
def draw_map(self, api_key: str = None, path_to_save: [str, Path] = None) -> None:
9084
"""
9185
Draws map with phone location.
9286
If api_key is not given - map will not be drawn.
@@ -99,26 +93,122 @@ def draw_map(self,
9993
"""
10094

10195
if api_key is None:
102-
self.__logger.raise_fatal(ValueError('Api key not given'))
96+
self.__logger.raise_fatal(ValueError("Api key not given"))
10397

10498
geocode = OpenCageGeocode(api_key)
10599
location = self.get_country()
106100
results = geocode.geocode(location)
107101

108-
self.__logger.info('Get lat and lng')
109-
lat = results[0]['geometry']['lat']
110-
lng = results[0]['geometry']['lng']
111-
self.__logger.debug(f'Lat: {lat}, Lng: {lng}')
102+
self.__logger.info("Get lat and lng")
103+
lat = results[0]["geometry"]["lat"]
104+
lng = results[0]["geometry"]["lng"]
105+
self.__logger.debug(f"Lat: {lat}, Lng: {lng}")
112106

113107
my_map = folium.Map(location=[lat, lng], zoom_start=9)
114108
folium.Marker([lat, lng], popup=location).add_to(my_map)
115109

116-
self.__logger.info('Draw map')
110+
self.__logger.info("Draw map")
117111
if path_to_save is None:
118-
my_map.save(f'{self.__number}.html')
119-
self.__logger.debug(f'Map was saved to {self.__number}.html')
112+
my_map.save(f"{self.__number}.html")
113+
self.__logger.debug(f"Map was saved to {self.__number}.html")
120114
else:
121115
Path(path_to_save).mkdir(exist_ok=True, parents=True)
122-
my_map.save(f'{path_to_save}/{self.__number}.html')
123-
self.__logger.debug(f'Map was saved to '
124-
f'{path_to_save}/{self.__number}.html')
116+
my_map.save(f"{path_to_save}/{self.__number}.html")
117+
self.__logger.debug(
118+
f"Map was saved to " f"{path_to_save}/{self.__number}.html"
119+
)
120+
121+
122+
class ProbivApiPhoneInfo:
123+
"""
124+
Gets info by phone number.
125+
First of all, you need to register and get a subscription to this api:
126+
https://probivapi.com/.
127+
"""
128+
129+
def __init__(self, secret_key: str, number: str, debug: bool = False) -> None:
130+
"""
131+
Constructor.
132+
133+
Args:
134+
* secret_key - Secret key from https://probivapi.com/
135+
* number - Phone number
136+
* debug - Activate debug mode
137+
"""
138+
139+
self.__secret_key = secret_key
140+
self.__number = number
141+
self.__logger = Logger(self.__class__.__name__)
142+
if debug:
143+
self.__logger.setLevel(logging.DEBUG)
144+
145+
@property
146+
def number(self) -> str:
147+
"""
148+
Property number method.
149+
"""
150+
return self.__number
151+
152+
@number.setter
153+
def number(self, value):
154+
self.__number = value
155+
156+
def get_info_by_number(self) -> None:
157+
"""
158+
Gets all found info by phone number.
159+
"""
160+
161+
url = f"https://probivapi.com/api/phone/info/{self.__number}"
162+
163+
head = {"X-Auth": self.__secret_key}
164+
165+
response = requests.get(url, headers=head)
166+
self.__logger.debug(response.text)
167+
168+
try:
169+
json_response = response.json()
170+
except Exception:
171+
json_response = {}
172+
173+
callapp_data = json_response.get("callapp", {})
174+
callapp_api_name = callapp_data.get("name", "Not found")
175+
callapp_emails = ", ".join(
176+
[email.get("email") for email in callapp_data.get("emails", [])]
177+
)
178+
callapp_websites = ", ".join(
179+
[site.get("websiteUrl") for site in callapp_data.get("websites", [])]
180+
)
181+
callapp_addresses = ", ".join(
182+
[addr.get("street") for addr in callapp_data.get("addresses", [])]
183+
)
184+
callapp_description = callapp_data.get("description", "Not found")
185+
callapp_opening_hours = ", ".join(
186+
[
187+
f"{day}: {', '.join(hours)}"
188+
for day, hours in callapp_data.get("openingHours", {}).items()
189+
]
190+
)
191+
callapp_lat = callapp_data.get("lat", "Not found")
192+
callapp_lng = callapp_data.get("lng", "Not found")
193+
callapp_spam_score = callapp_data.get("spamScore", "Not found")
194+
callapp_priority = callapp_data.get("priority", "Not found")
195+
eyecon_api_name = json_response.get("eyecon", "Not found")
196+
viewcaller_name_list = [
197+
tag.get("name", "Not found") for tag in json_response.get("viewcaller", [])
198+
]
199+
viewcaller_api_name = ", ".join(viewcaller_name_list)
200+
201+
info = f"""✅ Info for {self.__number}
202+
┣ 📱 ФИО (CallApp): {callapp_api_name}
203+
┣ 📧 Emails (CallApp): {callapp_emails}
204+
┣ 🌐 Сайты (CallApp): {callapp_websites}
205+
┣ 🏠 Адреса (CallApp): {callapp_addresses}
206+
┣ 📝 Описание (CallApp): {callapp_description}
207+
┣ 🕒 Часы работы (CallApp): {callapp_opening_hours}
208+
┣ 🌍 Координаты (CallApp): {callapp_lat}, {callapp_lng}
209+
┣ ⚠️ Spam Score (CallApp): {callapp_spam_score}
210+
┣ ⭐ Priority (CallApp): {callapp_priority}
211+
┣ 🌐 ФИО (EyeCon): {eyecon_api_name}
212+
┣ 🔎 ФИО (ViewCaller): {viewcaller_api_name}"""
213+
214+
self.__logger.info(info)

0 commit comments

Comments
 (0)