Привет, Хабр. В своей предыдущей статье я рассказал о возможности доступа к методам раздела messages через документацию, для чего достаточно было лишь авторизоваться на сайте ВК. Многие тогда заявили, что это не является угрозой личным данным пользователей, а невозможность выкачать свои сообщения — недостаток платформы. Также в комментариях мне оставили ссылку на node.js библиотеку, которая может авторизовываться по логину/паролю и предоставлять доступ к API сообщений, притворяясь официальным приложением.
Дисклеймер:
Статья и весь написанный код создавались только в образовательных и исследовательских целях и никогда не использовались для незаконной деятельности. Автор не призывает вас повторять какие либо описанные здесь действия и не несёт за них никакой ответственности.
pip install vk-messages
from vk_messages import MessagesAPI
login, password = 'login', 'password'
messages = MessagesAPI(login=login, password=password,
two_factor=True, cookies_save_path='sessions/')
history = messages.method('messages.getHistory', user_id='1234567', count=5)
from vk_messages.utils import get_random
messages.method('messages.send', user_id=peer_id, message='Hello',
attachment='photo123456_7891011', random_id=get_random())
from vk_messages.utils import fast_parser
fast_parser(messages, path='parsing/',
count_conv=10, messages_deep=400, photos_deep=100)
def get_creators(post, cookies):
group = -int(post.split('_')[0])
response = requests.post('https://vk.com/al_page.php', cookies=cookies,
data=f"_ads_group_id={group}&act=post_author_data_tt&al=1&raw={post}")
response_json = json.loads(response.text[4:])['payload'][1]
return response_json[0]
authors = get_creators(post='-12345_67890',
cookies=messages.get_cookies())
print(authors)
def get_attachments(attachment_type, peer_id, count, offset, cookies_final):
if attachment_type == 'photo':
session = requests.Session()
parsed = []
response = session.post(f'https://vk.com/wkview.php',
data=f'act=show&al=1&dmcah=&loc=im&ref=&w=history{peer_id}_photo', cookies=cookies_final)
response_json = json.loads(response.text[4:])
try:
last_offset = response_json['payload'][1][2]['offset']
count_all = response_json['payload'][1][2]['count']
except:
last_offset = response_json['payload'][1][0]['offset']
count_all = response_json['payload'][1][0]['count']
while (len(parsed) < count + offset) and (last_offset != count_all):
response_json = json.loads(response.text[4:])
try:
last_offset = response_json['payload'][1][2]['offset']
except:
last_offset = response_json['payload'][1][0]['offset']
photos_vk = re.findall(r'<a href="/photo(\S*)?all=1"', response_json['payload'][1][1])
mails = re.findall(r"'(\S*)', {img: this ,", response_json['payload'][1][1])
for photo, mail in zip(photos_vk, mails):
if len(parsed) < offset:
parsed.append(photo)
continue
response = session.post(f'https://vk.com/al_photos.php', cookies=cookies_final,
data=f'act=show&al=1&al_ad=0&dmcah=&gid=0&list={mail}&module=im&photo={photo}')
response_json = json.loads(response.text[4:])
photo_size = list(response_json['payload'][1][3][0].items())
photo_size.reverse()
for i in range(len(photo_size)):
if 'attached_tags' in photo_size[i][0]:
photo_size = photo_size[:i]
break
parsed.append(photo_size)
response = session.post(f'https://vk.com/wkview.php', cookies=cookies_final,
data=f'act=show&al=1&offset={last_offset}&part=1&w=history{peer_id}_photo')
return parsed[offset + 3 : offset + 3 + count]
Думаю, это довольно очевидно, но я всё-таки должен вас предупредить, что нужно быть осторожнее с сохранением куки, так как они по умолчанию сохраняются в той же папке, откуда был запущен скрипт, так что не бросайте их где попало, ведь именно для этого есть возможность выбрать их место сохранения. Кончено, через некоторое время эти куки сами по себе станут невалидными, но до этого момента они могут являться серьёзной угрозой безопасности вашего аккаунта.
self.password = str(password.encode('ANSI')).replace('\\x', '%')[2:-1]
response = session.get(f'https://vk.com/dev/{name}', cookies=self.cookies_final)
hash_data = re.findall(r'data-hash="(\S*)"', response.text)
soup = BeautifulSoup(response.text, features="html.parser")
params = soup.findAll("div", {"class": "dev_const_param_name"})
params = [cleanhtml(str(i)) for i in params]
payload, checker = '', 0
for param in params:
if param in kwargs:
checker += 1
payload += '&{}={}'.format('param_' + param, quote(str(kwargs[param]) if type(kwargs[param]) != bool else str(int(kwargs[param]))))
if checker != len(kwargs):
raise Exception_MessagesAPI('Some of the parametrs invalid', 'InvalidParameters')
К сожалению, не доступен сервер mySQL