-
Notifications
You must be signed in to change notification settings - Fork 2
/
vodafone.py
196 lines (162 loc) · 5.64 KB
/
vodafone.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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#!/usr/bin/env python
#Vodafone-WiFi
#Automated login for it.portal.vodafone-wifi.com
#Interface
#isVodafone()
#isLogged(history)
#parseUrl(welcomeUrl, SUCCESS_URL)
#getConfig()
#def getPayload(USERFAKE, PASS, CUSTOMER)
#def connect(USERNAME, PASSWORD, CUSTOMER, SUCCESS_URL)
#dependencies
#remember to install with "sudo pip install requests"
import requests
#remember to install with "sudo pip install configparser"
import configparser
#remember to install with "sudo pip install logging"
import logging
from os.path import dirname, abspath, join
from time import sleep
# for url parsing
from sys import version_info
if version_info[0] < 3:
from urlparse import parse_qs
from urlparse import urlparse
from urllib import urlencode
else:
from urllib.parse import parse_qs
from urllib.parse import urlparse
from urllib.parse import urlencode
ROOT_DIR = dirname(abspath(__file__))
#raised if SSID is not Vodafone or Vodafone extender
class NotConnectedToVodafoneWiFiException(Exception):
def __init__(self):
logging.info('You are not connected to Vodafone-WiFi')
#checks if you are connected to a Vodafone Wi-Fi hotspot
def isVodafone(FORCE):
#a get request on http://192.168.6.1 returns 403 when connected to a Vodafone Wi-Fi
#other networks may return the same but it would be rare.
if FORCE:
return True;
VODAFONE_IP = ['http://192.168.6.1', 'http://192.168.182.1']
for IP in VODAFONE_IP:
try:
r = requests.get(IP, timeout=10)
if r.status_code != 403:
raise NotConnectedToVodafoneWiFiException()
except requests.ConnectionError as e:
logging.debug(e)
raise NotConnectedToVodafoneWiFiException()
logging.debug('You are connected to Vodafone-WiFi')
return True
#checks if login was made or not by looking if redirect has been done
def isLogged(history):
if history:
raise requests.ConnectionError
return True
def parseUrl(welcomeUrl, SUCCESS_URL):
o = urlparse(welcomeUrl)
q = parse_qs(o.query)
q['res'] = ['login']
q['userurl'] = [SUCCESS_URL]
return o._replace(query=urlencode(q, True)).geturl()
#can cause undefined behaviour depending on welcomeUrl
# return welcomeUrl[0:47] + 'login' + welcomeUrl[54:172] + '&userurl=' + SUCCESS_URL
#reads from file and splits input parameters
def getConfig():
dict = {}
try:
#getting configuration parameters from the .conf file
c = configparser.ConfigParser()
c.read(join(ROOT_DIR,'vodafone.conf'))
dict['username'] = c.get('config', 'username')
dict['password'] = c.get('config', 'password')
dict['customer'] = c.get('config', 'customer')
dict['force'] = c.get('config', 'force')
except:
logging.debug("Please re-check the configuration file")
return dict
#sets data for post request
def getPayload(USERFAKE, PASS, CUSTOMER):
dict = {}
dict['chooseCountry'] = CUSTOMER + '%2F'
if CUSTOMER == 'VF_IT' or 'VF_ES':
dict['userFake'] = USERFAKE
else:
dict['userFake2'] = USERFAKE
dict['UserName'] = CUSTOMER + '%2F' + USERFAKE
dict['Password'] = PASS
dict['rememberMe'] = 'true'
dict['_rememberMe'] = 'on'
return dict
#connects to the network if there's a vodafone captive portal
def connect(FORCE, USERNAME, PASSWORD, CUSTOMER, SUCCESS_URL):
#later assigned
hotspotUrl = ''
vodafone = False
logged = False
vodafone = isVodafone(FORCE)
#if get request isn't sending response retry in 10 seconds
while not hotspotUrl and vodafone:
try:
r = requests.get(SUCCESS_URL, timeout=10)
hotspotUrl = r.url
logged = isLogged(r.history)
except requests.exceptions.Timeout as e:
logging.debug(e)
logging.debug('Retrying get request because of Timeout')
sleep(10)
except requests.ConnectionError as e:
logging.debug(e)
logging.debug('Retrying get request because of ConnectionError')
sleep(10)
#if not logged try login
if hotspotUrl and vodafone and not logged:
logging.info('Trying to login...')
#generates login url from welcome url
#can cause undefined behaviour if captive portal structure is changed
parsedUrl = parseUrl(hotspotUrl, SUCCESS_URL)
logging.info('Login parsed url:\n ' + parsedUrl)
logging.info('Making the payload')
#Form Data used to login
payload = getPayload(USERNAME, PASSWORD, CUSTOMER)
#may return ConnectionError if login is successful because then it re-establishes connection
try:
r = requests.post(parsedUrl, data=payload, timeout=20)
logged = isLogged(not r.history)
except requests.exceptions.Timeout as e:
logging.debug(e)
except requests.ConnectionError as e:
logging.debug(e)
if logged:
logging.info('>>> Logged!')
else:
logging.debug('Login failed, review your username and password in voadafone.conf')
def main():
#Logging item
logging.basicConfig(filename=join(ROOT_DIR,'vodafone.log'),format='%(asctime)s %(levelname)s %(message)s',level=logging.INFO, filemode='w')
#Logging header
logging.info('#################################################################')
logging.info('Please, report any error that may occurr at blackwiz4rd@gmail.com')
logging.info('#################################################################')
config = {}
try:
logging.info('Reading the configuration file (vodafone.conf)')
config = getConfig()
except IOError as e:
logging.debug(e)
#Getting parameters
USERNAME = config['username']
PASSWORD = config['password']
CUSTOMER = config['customer']
FORCE = config['force']
logging.info('Username: ' + USERNAME)
logging.info('Password: ' + PASSWORD)
logging.info('Customer: ' + CUSTOMER)
logging.info('Force: ' + FORCE)
#Replace '@' with '%40'
USERNAME.replace('@','%40')
SUCCESS_URL = 'http://captive.apple.com/hotspot-detect.html'
connect(FORCE, USERNAME, PASSWORD, CUSTOMER, SUCCESS_URL)
if __name__ == "__main__":
main()