■ ■ ■ ■ ■ ■
maryam/core/util/osint/numverify.py
| skipped 14 lines |
15 | 15 | | along with this program. If not, see <http://www.gnu.org/licenses/>. |
16 | 16 | | """ |
17 | 17 | | |
18 | | - | import re |
19 | | - | import hashlib |
20 | | - | import html |
| 18 | + | import random |
21 | 19 | | |
22 | 20 | | class main: |
23 | 21 | | |
24 | 22 | | def __init__(self, num): |
25 | 23 | | """ numverify search engine |
26 | | - | num : number to search |
| 24 | + | num : number to search |
| 25 | + | country : country code |
| 26 | + | |
27 | 27 | | """ |
28 | 28 | | self.framework = main.framework |
29 | 29 | | self.num = num |
30 | 30 | | self._json = '' |
31 | | - | self._suffix = '' |
32 | | - | self.numverify = 'https://numverify.com' |
33 | | - | |
34 | | - | def forge_secret(self): |
35 | | - | # Numverify uses AJAX with an insecure hash to verify its requests |
36 | | - | # A secret value from a tag is appended to the phone number and md5'd |
37 | | - | return hashlib.md5((self.num+self._suffix).encode()).hexdigest() |
| 31 | + | self.numverify = 'http://apilayer.net/api/validate' |
| 32 | + | self.keys = [ |
| 33 | + | '3489ab1ab092628f8b2a63b3d94b75f3', |
| 34 | + | 'ea52c77e9877dd4fdb83bdec925d3eeb', |
| 35 | + | 'e6f3944b3724f836871a4f9dcc546eb6', |
| 36 | + | '3796398e6c96912c29a56ec0177b8d6b', |
| 37 | + | '95f0bc6561937986c3386b1ffcd36ae9', |
| 38 | + | 'd49245f8853efbff4dfd245387531727', |
| 39 | + | '62552e99ed3cb92159be4153242b7eea', |
| 40 | + | '1322a4a256acd589e2e3ce73e65fdd3f', |
| 41 | + | '3fcf94548f2177e781eff270d43790f6', |
| 42 | + | '7778341260206c06fac4a2727a27955f', |
| 43 | + | 'a0bfc16589d513fc472832935c9c6528', |
| 44 | + | '3618d844c1b6802106a6309c92c71ac2', |
| 45 | + | '376bbc8ef5ee4a9d8f6a81a7ddd9f4cd', |
| 46 | + | 'd4e8383a4f2efec6e523faad8797c4d1', |
| 47 | + | '0a45e3f8273a7f929f4ec237e4f24d10', |
| 48 | + | '64edafd9cc5d839d8d9bac9ac0837851', |
| 49 | + | '5165b0fec39bb03e42f43d4cc5513dcb', |
| 50 | + | 'e2a851b9b76a579c0fef4304969546e7', |
| 51 | + | '9a39c3058615ec330c7223a596f62934', |
| 52 | + | '2a06b63cb88a13ebeea7e5f83f01f8d7', |
| 53 | + | '1ed52249226585cdb176926e34d75aa5', |
| 54 | + | '8a6cb00cac3c904dd1c82b29ab5061d0', |
| 55 | + | 'fe11bd5cfea457f9fda5ed3fecc8fc54' |
| 56 | + | ] |
38 | 57 | | |
39 | 58 | | def run_crawl(self): |
40 | | - | from bs4 import BeautifulSoup as bs |
41 | | - | |
42 | 59 | | self.framework.verbose('Searching...') |
43 | | - | self.num = re.sub(r'\+|\s', '', self.num); |
44 | 60 | | try: |
45 | | - | req = self.framework.request(url=self.numverify) |
46 | | - | soup = bs(req.text,'html.parser') |
47 | | - | |
48 | | - | self._suffix = soup.find('input', {'name': 'scl_request_secret'})['value'] |
49 | | - | secret = self.forge_secret() |
50 | | - | url = ''.join([f'{self.numverify}/php_helper_scripts/phone_api.php', |
51 | | - | f'?secret_key={secret}&number={self.num}']) |
52 | | - | |
53 | | - | req = self.framework.request(url=url) |
| 61 | + | payload = { |
| 62 | + | 'access_key': random.choice(self.keys), |
| 63 | + | 'number': self.num, |
| 64 | + | 'format': 1 |
| 65 | + | } |
| 66 | + | req = self.framework.request( |
| 67 | + | url=self.numverify, |
| 68 | + | params=payload) |
54 | 69 | | self._json = req.json() |
55 | 70 | | except Exception as e: |
56 | 71 | | self.framework.error(f"ConnectionError {e}.", 'util/numverify', 'run_crawl') |
| skipped 7 lines |