Skip to content

Commit 1356719

Browse files
committed
4.5
Обработка проверки безопасности (ввод номера).
1 parent 1985593 commit 1356719

8 files changed

Lines changed: 115 additions & 55 deletions

File tree

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
build/
22
dist/
3+
test/
34
*.pyc
45
upload_to_PyPi.py
6+
.project
7+
.pydevproject
8+
.settings/

example.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
__email__ = "mikeking568@gmail.com"
66
__contact__ = "https://vk.com/python273"
77

8-
""" Пример получения последнего сообщения со стены """
9-
108

119
def main():
10+
u""" Пример получения последнего сообщения со стены """
11+
1212
login = u'python@vk.com'
1313
password = u'mypassword'
1414

@@ -21,7 +21,7 @@ def main():
2121
values = {
2222
'count': 1 # Получаем только одно сообщение
2323
}
24-
response = vk.method('wall.get', values) # С использованием метода wall.get
24+
response = vk.method('wall.get', values) # Используем метод wall.get
2525
print(response[1]['text']) # Печатаем текст последнего поста со стены
2626

2727
if __name__ == '__main__':

jconfig/jconfig.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,8 @@ def parse(self):
2727
self.update()
2828
return {}
2929

30-
def update(self, settings={}):
31-
settings = json.dump(settings, open(self.filename, 'w'))
30+
def update(self, settings=None):
31+
if not settings:
32+
settings = {}
33+
34+
json.dump(settings, open(self.filename, 'w'))

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from distutils.core import setup
55
setup(name='vk_api',
6-
version='4.4',
6+
version='4.5',
77
description='Module to use API VKontakte vk.com',
88
author='Kirill Python',
99
author_email='mikeking568@gmail.com',

vk_api/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
__author__ = "Kirill Python"
2-
__version__ = "4.4"
2+
__version__ = "4.5"
33
__email__ = "mikeking568@gmail.com"
44
__contact__ = "https://vk.com/python273"
55

vk_api/upload/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,5 @@
1-
from vk_upload import *
1+
import sys
2+
if sys.version_info[0] == 2:
3+
from vk_upload import *
4+
else:
5+
from .vk_upload import *

vk_api/upload/vk_upload.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
class vk_upload():
1+
class VkUpload():
22
def __init__(self, vk):
33
self.vk = vk
4+
# https://vk.com/dev/upload_files
45

56
def photo(self, aid, photos):
67
""" Загрузка изображений в альбом пользователя

vk_api/vk_api.py

Lines changed: 94 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,113 +1,149 @@
11
# -*- coding: utf-8 -*-
2-
import requests
3-
from jconfig import config
2+
import jconfig
43
import re
5-
6-
cj_from_dict = requests.utils.cookiejar_from_dict
4+
import requests
75

86

97
class 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

152200
def regexp(reg, string):
153-
""" Поиск по регулярке """
201+
u""" Поиск по регулярке """
154202

155203
reg = re.compile(reg, re.IGNORECASE | re.DOTALL)
156204
reg = reg.findall(string)

0 commit comments

Comments
 (0)