-
Notifications
You must be signed in to change notification settings - Fork 0
/
pwned-account.py
121 lines (90 loc) · 2.72 KB
/
pwned-account.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/usr/bin/env python3
"""!!DEPRECATED!! The Have I been pwned account API is now covered by a $3.5/month fee
and is no longer supported by this script.
Have I been Pwned account database check.
Usage: pwned-account [--help] [options] [ACCOUNT]
Arguments:
ACCOUNT The account to check, if empty prompt for account.
Options:
-d --debug Debug only (displays informations and quits).
-h --help Displays the help.
-v --verbose Displays more informations.
"""
import sys
import hashlib
import json
import re
import requests
import docopt as docpt
from docopt import docopt
# options
options = None # type: dict
debug = False # type: bool
verbose = False # type: bool
# arguments
account = "" # type: str
def main():
"""Main method."""
# options
global debug, verbose
debug, verbose = options['--debug'], options['--verbose'] # type: bool, bool
if debug:
verbose = True
# arguments
global account
account = options['ACCOUNT'] # type: str
if not account:
account = input('Account: ')
print()
if not account:
raise RuntimeWarning('Empty account.')
# API URL
url = 'https://haveibeenpwned.com/api/v3/breachedaccount/%s' % account
# verbose
if verbose:
print('API URL %s' % url)
print()
# fetch matching hashes
r = requests.get(url)
# handle HTTP errors
if not r.ok:
print('Wrong API response, HTTP status code: %s' % r.status_code)
print(r.content)
exit(1)
pwns = json.loads(r.content or '{}')
if debug:
print(json.dumps(pwns, indent=4))
# output
if not pwns:
print('Account not pwned.')
else:
print('Pwned in %d breach%s:' % (len(pwns), 'es' if len(pwns) > 1 else ''))
idx = 0
for pwned in pwns: # type: dict
idx = idx + 1
label = pwned.get('Title', None)
if verbose:
desc = pwned.get('Description', '')
desc = re.sub(r'<a.*>(.*)</a>', r'\g<1>', desc)
label = '%s: %s' % (label, desc)
label = '%s\n [%s]' % (label, ', '.join(pwned.get('DataClasses', [])))
print('%5d. %s' % (idx, label))
if verbose:
print()
print()
def cli():
"""Command-line interface"""
global options
options = docopt(__doc__)
try:
main()
except RuntimeWarning as w:
print(" Warning: %s" % w, file=sys.stderr)
sys.exit(1)
except RuntimeError as w:
print("%s" % w, file=sys.stderr)
print(docpt.printable_usage(__doc__))
sys.exit(1)
# main entry point
if __name__ == '__main__':
cli()