Skip to content

Instantly share code, notes, and snippets.

@python273
Last active December 20, 2018 14:23
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save python273/270784b56b587204ce0f3ff69c8cbb3d to your computer and use it in GitHub Desktop.
Save python273/270784b56b587204ce0f3ff69c8cbb3d to your computer and use it in GitHub Desktop.
VK (vk.com) Messages Dumper | Python3

Писал давно, код плохой. Протестировано на python3

       DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
               Version 2, December 2004

Copyright (C) 2004 Sam Hocevar sam@hocevar.net

Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed.

       DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  1. You just DO WHAT THE FUCK YOU WANT TO.
* {
border: 0;
margin: 0;
padding: 0;
}
html, body {
height: 100%;
width: 100%;
font-family: tahoma,arial,verdana,sans-serif,Lucida Sans;
}
a {
color: #2B587A;
text-decoration: none;
}
.clear {
clear: both;
}
.message_list {
width: 600px;
margin-left: auto;
margin-right: auto;
}
.message {
font-size: 13px;
background-color: #ffffff;
margin: 5px;
padding: 5px;
border: 1px solid #dae1e8;
border-radius: 3px;
}
.fwd_message {
border-left: 2px solid #C3D1E0;
padding-left: 5px;
margin: 5px;
padding: 5px;
/*min-width: 400px;*/
}
.avatar {
width: 32px;
height: 32px;
margin-right: 5px;
float: left;
}
.username {
font-weight: bold;
}
.username_fwd {
font-weight: bold;
float: left;
}
.date a {
float: right;
color: #999999;
}
.date_fwd {
margin-left: 5px;
float: left;
}
.body {
word-wrap: break-word;
}
.left {
float: left;
max-width: 530px;
}
.right {
float: right;
}
.attachments {
overflow: auto;
}
#!/usr/bin/python3
import os
try:
import simplejson as json
except ImportError:
import json
import vk_api
def main():
login, password = 'python@vk.com', 'mypassword'
vk_session = vk_api.VkApi(login, password)
try:
vk_session.auth()
except vk_api.AuthError as error_msg:
print(error_msg)
return
vk_tools = vk_api.VkTools(vk_session)
my_id = vk_session.method('users.get')[0]['id']
print('My page: http://vk.com/id{}'.format(my_id))
path = './dumps/dialogs_{}/'.format(my_id)
os.makedirs(path, exist_ok=True)
print('Get dialogs...')
dialogs = vk_tools.get_all(
'messages.getDialogs',
max_count=200,
values={'preview_length': '0'}
)
print('Dialogs count:', dialogs['count'])
for i in dialogs['items']:
i = i['message']
if 'chat_id' in i:
user_id = 2000000000 + i['chat_id']
else:
user_id = i['user_id']
print('Get messages %s...' % user_id)
values = {
'user_id': user_id,
'rev': '1'
}
messages = vk_tools.get_all(
'messages.getHistory',
max_count=200,
values=values
)
messages['id'] = user_id
dialog_path = os.path.join(path, '{}.json'.format(user_id))
with open(dialog_path, 'w', encoding='utf-8') as f:
json.dump(messages, f, separators=(',', ':'), ensure_ascii=False)
if __name__ == '__main__':
main()
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import cgi
import datetime
import os
import vk_api
import simplejson as json
start_file = """
<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="../style.css" />
</head>
<body>
<div class="message_list">
"""
end_file = """
</div>
</body>
</html>
"""
message_template = """
<div class="message">
<div class="avatar">
<img width="32" height="32" src="{avatar}"/>
</div>
<div class="date right"><a name="{id}" href="http://vk.com/im?msgid={id}&amp;sel={sel}">#{id} {date}</a></div>
<div class="username"><a href="http://vk.com/id{user_id}">{user_name}</a></div>
<div class="left">
<div class="body">{body}</div>
<div class="attachments">
{fwd}{attachments}
</div>
</div>
<div class="clear"></div>
</div>
"""
fwd_template = """
<div class="fwd_message">
<div class="avatar">
<img width="32" height="32" src="{avatar}"/>
</div>
<div class="username username_fwd"><a href="http://vk.com/id{user_id}">{user_name}</a></div>
<div class="date date_fwd"><a href="http://vk.com/im?msgid={id}&amp;sel={sel}">{date}</a></div>
<div class="clear"></div>
<div class="left">
<div class="body">{body}</div>
<div class="fwd_attachments">
{fwd}{attachments}
</div>
</div>
<div class="clear"></div>
</div>
"""
info_template = """
<div class="message">
<a href="http://vk.com/im?sel={sel}">Link</a>
</div>
"""
photo_template = """
<a href="{fullsize}"><img src="{thumbnail}" /></a>
"""
PHOTO_SIZES = (
'photo_75', 'photo_130', 'photo_604',
'photo_807', 'photo_1280', 'photo_2560'
)
def get_photo_attach(photo):
thumbnail = photo['photo_130']
fullsize = None
for i in PHOTO_SIZES[::-1]:
if i in photo:
fullsize = photo[i]
break
return {'thumbnail': thumbnail, 'fullsize': fullsize}
class Message(object):
def __init__(self, raw, users, sel, template=message_template):
self.raw = raw
self.users = users
self.sel = sel
self.template = template
def get_body(self):
body = cgi.escape(self.raw['body']).replace('\n', '<br/>')
return body
def __str__(self):
try:
if 'from_id' in self.raw:
from_user = self.users[self.raw['from_id']]
elif 'user_id' in self.raw:
from_user = self.users[self.raw['user_id']]
except:
from_user = {
'photo_50': 'http://vk.com/images/deactivated_c.gif',
'id': '0',
'first_name': 'DELETED',
'last_name': ''
}
date = datetime.datetime.fromtimestamp(self.raw['date'])
fwd_messages = []
for i in self.raw.get('fwd_messages', []):
fwd_messages.append(Message(i, self.users, self.sel, fwd_template))
attachments = []
for attach in self.raw.get('attachments', ()):
if attach['type'] == 'photo':
photo = get_photo_attach(attach['photo'])
attachments.append(
photo_template.format(**photo)
)
else:
attachments.append('<div>{}</div>'.format(attach['type']))
values = {
'id': self.raw.get('id', ''),
'sel': self.sel,
'avatar': from_user['photo_50'],
'date': date.strftime('%d.%m.%Y %H:%M'),
'user_id': from_user['id'],
'user_name': ' '.join([from_user['first_name'],
from_user['last_name']]),
'body': self.get_body(),
'attachments': ''.join(attachments),
'fwd': '\n'.join(str(i) for i in fwd_messages)
}
return self.template.format(**values)
class Main(object):
def __init__(self):
self.vk = vk_api.VkApi()
self.users = {}
def get_user(self, ids):
values = {
'user_ids': ','.join(str(i) for i in ids),
'fields': 'photo_50'
}
response = self.vk.method('users.get', values)
for i in response:
self.users.update({i['id']: i})
def render(self, dump):
with open('./html/%s.html' % dump['id'], 'w', encoding='utf-8') as f:
f.write(start_file)
f.write(info_template.format(sel=dump['sel']))
for i in dump['items']:
message = Message(i, self.users, dump['sel'])
f.write(str(message)) # .encode('utf-8', errors='replace').decode("utf-8"))
f.write(end_file)
def run(self):
try:
os.mkdir('html')
except:
pass
listdir = os.listdir('./dumps/')
for x, i in enumerate(listdir, 1):
print('{}. {}'.format(x, i))
self.path = './dumps/' + listdir[int(input('>')) - 1]
print('Selected {}'.format(self.path))
for filename in os.listdir(self.path):
print('Render %s' % filename)
f = open(os.path.join(self.path, filename), 'r', encoding='utf-8')
dump = json.load(f)
f.close()
users = []
for i in dump['items']:
if not i['from_id'] in users:
users.append(i['from_id'])
for f in i.get('fwd_messages', []):
if not f['user_id'] in users:
users.append(i['user_id'])
self.get_user(users)
if dump['id'] > 2e9:
sel = "c%s" % (dump['id'] - 2e9)
else:
sel = dump['id']
dump.update({'sel': sel})
self.render(dump)
if __name__ == '__main__':
main = Main()
main.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment