-
Notifications
You must be signed in to change notification settings - Fork 5
/
HTTPServices.py
215 lines (179 loc) · 7.52 KB
/
HTTPServices.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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
#(C) Marek Chrusciel,
# Jakub Kosinski,
# Marcin Krupowicz,
# Mateusz Strycharski
#
# $Id$
import urllib
import urllib2
import types
import time
import random
import Helpers
from Exceptions import *
class Token(object):
"""
Klasa reprezentujaca dane tokena potrzebnego do rejestracji konta Gadu-Gadu
"""
def __init__(self, width, height, length, id, url):
self.__width = width
self.__height = height
self.__length = length
self.__id = id
self.__url = url
def __get_width(self):
return self.__width
def __get_height(self):
return self.__height
def __get_length(self):
return self.__lenght
def __get_id(self):
return self.__id
def __get_url(self):
return self.__url
def __get_image(self):
request = urllib2.urlopen(self.__url)
return request.read()
width = property(__get_width) # zwraca dlugosc obrazka
height = property(__get_height) # zwraca wysokosc obrazka
length = property(__get_length) # zwraca rozmiar obrazka (?)
id = property(__get_id) # zwraca numer id tokena
url = property(__get_url) # zwraca URL tokena
image = property(__get_image) # zwraca strumien z obrazkiem w formacie GIF
class HTTPServices(object):
__user_agent = 'Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)'
def get_server(self,uin):
"""
Metoda pobiera z serwerow Gadu-Gadu adres serwera oraz port, na ktorym nasluchuje
"""
assert type(uin) == types.IntType
url = 'http://appmsg.gadu-gadu.pl/appsvc/appmsg4.asp?fmnumber=' + str(uin) + '&version=7,7,0,3315&lastmsg=0'
try:
request = urllib2.Request(url)
request.add_header('User-Agent', self.__user_agent)
response = urllib2.urlopen(request)
info = response.read().split(' ')
except: #wyjatki zwiazane z niemoznoscia polaczenia sie. Inne tu chyba nie powinny wystapic :)
raise GGServerNotOperating()
if info[2] == 'notoperating':
raise GGServerNotOperating('HTTPServices.get_server: Server is not operating')
server = info[2].split(':')[0]
port = info[2].split(':')[1]
return server, int(port)
def get_token_data(self):
"""
Metoda pobiera z serwera Gadu-Gadu dane tokena potrzebnego do rejestracji konta. Zwraca obiekt typu Token
"""
url = 'http://register.gadu-gadu.pl/appsvc/regtoken.asp'
try:
request = urllib2.Request(url)
request.add_header('User-Agent', self.__user_agent)
response = urllib2.urlopen(request)
width, height, length, id, url = response.read().replace('\r\n',' ').split(' ')
except: #wyjatki zwiazane z niemoznoscia polaczenia sie. Inne tu chyba nie powinny wystapic :)
raise GGServerNotOperating()
return Token(width, height, length, id, url + '?tokenid=' + id)
def register_account(self, pwd, email, tokenid, tokenval):
"""
Metoda rejestruje nowe konto w sieci Gadu-Gadu. Przyjmuje nastepujace parametry:
* pwd - haslo uzytkownika
* email - email uzytkownika, sluzacy do odzyskiwania hasla
* tokenid - ID tokena pobranego metoda get_token_data
* tokenval - tresc z obrazka tokena
Zwraca przydzielony numer konta. W przypadku blednych danych tokena rzucany jest wyjatek
"""
code = Helpers.gg_http_hash(email, pwd)
url = 'http://register.gadu-gadu.pl/appsvc/fmregister3.asp'
data = urllib.urlencode({'pwd' : pwd, 'email' : email, 'tokenid' : tokenid, 'tokenval' : tokenval, 'code' : code})
try:
request = urllib2.Request(url, data)
request.add_header('User-Agent', self.__user_agent)
response = urllib2.urlopen(request)
text = response.read()
except: #wyjatki zwiazane z niemoznoscia polaczenia sie. Inne tu chyba nie powinny wystapic :)
raise GGServerNotOperating()
if text == 'bad_tokenval':
raise GGBadTokenVal('HTTPServices.register_account: Bad tokenval')
uin = text[text.find(':')+1:len(text)]
return int(uin)
def delete_account(self, fmnumber, fmpwd, tokenid, tokenval):
"""
Metoda usuwa konto o numerze fmnumber z serwerow Gadu-Gadu. Przyjmuje nastepujace parametry:
* fmnumber - numer Gadu-Gadu do usuniecia
* fmpwd - haslo do numeru
* tokenid - ID tokena pobranego metoda get_token_data
* tokenval - tresc z obrazka tokena
Zwraca True gdy numer zostanie usuniety lub False w przeciwnym wypadku
"""
code = Helpers.gg_http_hash('[email protected]', fmpwd)
random.seed(int(time.time()))
pwd = random.randint(0,0xffff)
url = 'http://register.gadu-gadu.pl/appsvc/fmregister3.asp'
data = urllib.urlencode({'fmnumber' : fmnumber, 'fmpwd' : fmpwd, 'delete' : 1, 'pwd' : pwd, 'email' : '[email protected]', 'tokenid' : tokenid, 'tokenval' : tokenval, 'code' : code})
try:
request = urllib2.Request(url, data)
request.add_header('User-Agent', self.__user_agent)
response = urllib2.urlopen(request)
text = response.read()
except: #wyjatki zwiazane z niemoznoscia polaczenia sie. Inne tu chyba nie powinny wystapic :)
raise GGServerNotOperating()
if text == 'reg_success:'+str(fmnumber):
return True
else:
return False
def remind_password(self, userid, email, tokenid, tokenval):
"""
Metoda wysyla przypomnienie hasla na adres email podany przy rejestracji. Przyjmuje parametry:
* userid - numer Gadu-Gadu uzytkownika
* email - email podany przy rejestracji
* tokenid - ID tokena pobranego metoda get_token_data
* tokenval - tresc z obrazka tokena
Zwraca True gdy przypomnienie zostalo wyslane, False w przeciwnym wypadku
"""
code = Helpers.gg_http_hash(str(userid), email)
url = 'http://retr.gadu-gadu.pl/appsvc/fmsendpwd3.asp'
data = urllib.urlencode({'userid' : userid, 'email' : email, 'tokenid' : tokenid, 'tokenval' : tokenval, 'code' : code})
try:
request = urllib2.Request(url, data)
request.add_header('User-Agent', self.__user_agent)
response = urllib2.urlopen(request)
text = response.read()
except: #wyjatki zwiazane z niemoznoscia polaczenia sie. Inne tu chyba nie powinny wystapic :)
raise GGServerNotOperating()
if text == 'pwdsend_success':
return True
else:
return False
def change_password(self, fmnumber, fmpwd, pwd, email, tokenid, tokenval):
"""
Metoda zmienia haslo i/lub email uzytkownika. Przyjmuje parametry:
* fmnumber - numer Gadu-Gadu uzytkownika
* fmpwd - stare haslo
* pwd - nowe haslo
* email - nowy adres email
* tokenid - ID tokena pobranego metoda get_token_data
* tokenval - tresc z obrazka tokena
Zwraca True gdy operacja sie powiodla, False w przeciwnym wypadku
"""
if pwd == '': # w przypadku zmiany samego emaila
pwd = fmpwd
code = Helpers.gg_http_hash(pwd, email)
url = 'http://register.gadu-gadu.pl/appsvc/fmregister3.asp'
data = urllib.urlencode({'fmnumber' : fmnumber, 'fmpwd' : fmpwd, 'pwd' : pwd, 'email' : email, 'tokenid' : tokenid, 'tokenval' : tokenval, 'code' : code})
try:
request = urllib2.Request(url, data)
request.add_header('User-Agent', self.__user_agent)
response = urllib2.urlopen(request)
text = response.read()
except: #wyjatki zwiazane z niemoznoscia polaczenia sie. Inne tu chyba nie powinny wystapic :)
raise GGServerNotOperating()
if text == 'reg_success:' + str(fmnumber):
return True
else:
return False
get_server = classmethod(get_server)
get_token_data = classmethod(get_token_data)
register_account = classmethod(register_account)
delete_account = classmethod(delete_account)
remind_password = classmethod(remind_password)
change_password = classmethod(change_password)