11# -*- coding: utf-8 -*-
2- import requests
3- from jconfig import config
2+ import jconfig
43import re
5-
6- cj_from_dict = requests .utils .cookiejar_from_dict
4+ import requests
75
86
97class VkApi ():
108 def __init__ (self ,
11- login = None , password = None ,
9+ login = None , password = None , number = None ,
1210 sid = None , token = None ,
1311 app_id = 2895443 , scope = 2097151 , proxies = None ):
12+ u""" Данные для авторизации:
13+ login, password
14+
15+ number - На случай проверки безопасности
16+ Номер: +7 12345678 90
17+ Передавать в number: 12345678
18+
19+ Для авторизации без логина и пароля:
20+ sid, token
21+
22+ app_id - айди Standalone-приложения
23+ scope - права приложения числом
24+ proxies - использование прокси
25+ {'http': 'http://127.0.0.1:8888/',
26+ 'https' : 'https://127.0.0.1:8888/'}
27+
28+ """
1429
1530 self .login = login
1631 self .password = password
32+ self .number = number
33+
1734 self .sid = sid
1835 self .token = {'access_token' : token }
19- self .settings = config (login )
36+ self .settings = jconfig . config (login )
2037
2138 self .app_id = app_id
2239 self .scope = scope
2340
2441 self .http = requests .Session ()
25- self .http .proxies = proxies # Ставим прокси если есть
42+ self .http .proxies = proxies # Ставим прокси
2643 self .http .headers = { # Притворимся браузером
27- 'User-agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0'
44+ 'User-agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) ' \
45+ 'Gecko/20100101 Firefox/20.0'
2846 }
2947 self .http .verify = False
3048
31- if login and password : # Oh...
49+ if login and password :
3250 self .sid = self .settings ['remixsid' ]
3351 self .token = self .settings ['access_token' ]
3452
3553 if not self .check_sid ():
36- if not self .vk_login ():
37- raise authorization_error ( 'Authorization error (bad password)' )
54+ self .vk_login ()
55+
3856 if not self .check_token ():
39- if not self .api_login ():
40- raise authorization_error ('Authorization error (api)' )
57+ self .api_login ()
4158
42- def vk_login (self , captcha_sid = '' , captcha_key = '' ):
43- """ Авторизцаия ВКонтакте с получением cookies remixsid """
59+ def vk_login (self , captcha_sid = None , captcha_key = None ):
60+ u """ Авторизцаия ВКонтакте с получением cookies remixsid """
4461
4562 url = 'http://login.vk.com/'
46- data = {
63+ values = {
4764 'act' : 'login' ,
4865 'utf8' : '1' ,
49- 'captcha_sid' : captcha_sid ,
50- 'captcha_key' : captcha_key ,
5166 'email' : self .login ,
5267 'pass' : self .password
5368 }
5469
55- if 'remixsid' in self .http .cookies :
56- self .http .cookies .pop ('remixsid' )
57- response = self .http .post (url , data )
70+ if captcha_sid and captcha_key :
71+ values .update ({
72+ 'captcha_sid' : captcha_sid ,
73+ 'captcha_key' : captcha_key
74+ })
75+
76+ self .http .cookies .clear ()
77+ response = self .http .post (url , values )
5878
5979 if 'remixsid' in self .http .cookies :
6080 remixsid = self .http .cookies ['remixsid' ]
6181 self .settings ['remixsid' ] = remixsid
6282
63- # Нужно в авторизации через api_login
83+ # Нужно для авторизации в API
6484 self .settings ['forapilogin' ] = {
6585 'p' : self .http .cookies ['p' ],
6686 'l' : self .http .cookies ['l' ]
6787 }
6888
6989 self .sid = remixsid
70- return True
7190
7291 elif 'sid=' in response .url :
7392 raise authorization_error ('Authorization error (capcha)' )
93+ else :
94+ raise authorization_error ('Authorization error (bad password)' )
95+
96+ if 'security_check' in response .url :
97+ if self .number :
98+ number_hash = regexp (r'security_check.*?hash: \'(.*?)\'\};' ,
99+ response .text )[0 ]
100+
101+ values = {
102+ 'act' : 'security_check' ,
103+ 'al' : '1' ,
104+ 'al_page' : '3' ,
105+ 'code' : self .number ,
106+ 'hash' : number_hash ,
107+ 'to' : ''
108+ }
109+
110+ response = self .http .post ('http://vk.com/login.php' , values )
111+
112+ if response .text .split ('<!>' )[4 ] == '4' :
113+ return
74114
75- elif 'security_check' in response .url :
76115 raise authorization_error ('Authorization error (enter number)' )
77116
78117 def check_sid (self ):
79- """ Прверка Cookies remixsid на валидность """
118+ u """ Прверка Cookies remixsid на валидность """
80119
81120 if self .sid :
82- url = 'https ://vk.com/feed2.php'
83- self .http .cookies = cj_from_dict ({
121+ url = 'http ://vk.com/feed2.php'
122+ self .http .cookies . update ({
84123 'remixsid' : self .sid ,
85124 'remixlang' : '0' ,
86125 'remixsslsid' : '1'
87126 })
88127
89- response = self .http .post (url ).json ()
128+ response = self .http .get (url ).json ()
90129
91130 if response ['user' ]['id' ] != - 1 :
92131 return response
93132
94133 def api_login (self ):
95- """ Получение токена через Desktop приложение """
134+ u """ Получение токена через Desktop приложение """
96135
97- url = 'https ://oauth.vk.com/authorize'
98- data = {
136+ url = 'http ://oauth.vk.com/authorize'
137+ values = {
99138 'client_id' : self .app_id ,
100139 'scope' : self .scope ,
101140 'response_type' : 'token' ,
102141 }
103142
104- cookies = {}
105- cookies .update (self .settings ['forapilogin' ])
106- cookies .update ({'remixsid' : self .sid })
107- cookies = cj_from_dict (cookies )
108- self .http .cookies = cookies
143+ self .http .cookies .update (self .settings ['forapilogin' ])
144+ self .http .cookies .update ({'remixsid' : self .sid })
109145
110- response = self .http .post (url , data )
146+ response = self .http .post (url , values )
111147
112148 if not 'access_token' in response .url :
113149 url = regexp (r'location\.href = "(.*?)"\+addr;' , response .text )[0 ]
@@ -123,34 +159,46 @@ def api_login(self):
123159
124160 self .settings ['access_token' ] = token
125161 self .token = token
126- return True
162+ else :
163+ raise authorization_error ('Authorization error (api)' )
127164
128165 def check_token (self ):
129- """ Прверка access_token на валидность """
166+ u """ Прверка access_token на валидность """
130167
131168 if self .token .get ('access_token' ):
132169 try :
133170 self .method ('isAppUser' )
134- except :
171+ except api_error :
135172 return False
136173
137174 return True
138175
139- def method (self , method , data = {}):
140- """ Использование методов API """
176+ def method (self , method , values = None ):
177+ u""" Использование методов API
178+
179+ method - название метода
180+ 'users.get'
181+
182+ values - параметры
183+ {'uids': 1}
184+
185+ """
186+
187+ url = 'http://api.vk.com/method/%s' % method
141188
142- url = 'https://api.vk.com/method/%s' % method
143- data .update ({'access_token' : self .token ['access_token' ]})
189+ if not values :
190+ values = {}
191+ values .update ({'access_token' : self .token ['access_token' ]})
144192
145- response = self .http .post (url , data ).json ()
193+ response = self .http .post (url , values ).json ()
146194 if 'error' in response :
147195 raise api_error (response ['error' ])
148196 else :
149197 return response ['response' ]
150198
151199
152200def regexp (reg , string ):
153- """ Поиск по регулярке """
201+ u """ Поиск по регулярке """
154202
155203 reg = re .compile (reg , re .IGNORECASE | re .DOTALL )
156204 reg = reg .findall (string )
0 commit comments