Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.74/76: Рейтинг темы: голосов - 76, средняя оценка - 4.74
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16

Анализ информации из социальных сетей

21.07.2018, 11:33. Показов 18132. Ответов 187
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
нужно собирать и анализировать информацию из социальных сетей

на python делать?
с чего нужно начинать?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.07.2018, 11:33
Ответы с готовыми решениями:

Как сделать телеграм бота пересылающий посты и новости из RSS лент и социальных сетей (агрегатор)
Я пытался как всегда разбить план на мелкие составляющие, я начал думать что конкретно и как бот должен будет уметь делать, но даже во...

Блокировка социальных сетей
Возможно подобная тема уже есть, но как-то не нашел.... И всё же дело вот в чем, блокировать соцсети это понятно как, антивирус там,...

Кнопки социальных сетей
Скачал бесплатный шаблон в Вордпресс,в демо версии установлены кнопки социальных сетей в шапке сайта(фото№1).В админпанели есть социальные...

187
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
04.11.2018, 22:55  [ТС]
Студворк — интернет-сервис помощи студентам
vic5710, полюбому сначала сохранять json а затем брать
а если таких источников - 20
и брать нужно какждые N minut или вообще - получать как только обновление пришло?

Добавлено через 8 минут
vic5710, вот и думай потом что с этим делать
или сразу в базу писать (но как дату проверять)
или промежуточную делать, а потом другим файлом изымать из промежуточной базы...

Добавлено через 14 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def main():
    vk_session = vk_api.VkApi(cnf.login, cnf.password)
 
    try:
        vk_session.auth(token_only=True)
    except vk_api.AuthError as error_msg:
        print(error_msg)
        return
 
    tools = vk_api.VkTools(vk_session)
    wall = tools.get_all(
        'wall.get', 1, {'owner_id': cnf.owner_id, 'offset': 1}
    )
    print('Всего постов: ', wall['count'])
    items = wall['items']
    for post in items:
        print(get_attachment_data(post))
Python
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
def get_attachment_data(post):
    """
        Парсим аттачи
        Возвращаем массивы прикрепленных урлов att
        wall_id = USER_ID
        message_id = POST_ID
    """
    if post["type"] == "photo":
        if post["photo"]["id"] != 0:
            save_photo('%s_%s_%s' % (
                post["photo"]["owner_id"],
                post["photo"]["id"],
                post["photo"]["access_key"]
            ))
            att = Attachment(
                type_id = 2,
                name = post["photo"]["id"],
                link = "img/%s.jpg" % a["photo"]["id"],
                message_id = msg_id,
                wall_id = wall_id
            )
            session.add(att)
    elif post["type"] == "video":
        link = get_video_link('%s_%s_%s' % (
            post["video"]["owner_id"],
            post["video"]["id"],
            post["video"]["access_key"]
        ))
        att = Attachment(
            type_id = 3,
            name = post["video"]["title"],
            link = link,
            message_id = msg_id,
            wall_id = wall_id
        )
        session.add(att)
    elif post["type"] == "audio":
        att = Attachment(
            type_id = 1,
            name = post['audio']['artist'] + post['audio']['title'],
            message_id = msg_id,
            wall_id = wall_id
        )
        session.add(att)
    elif post["type"] == "doc":
        save_doc('%s_%s_%s' % (
            post["doc"]["owner_id"],
            post["doc"]["id"],
            post["doc"]["access_key"]
        ))
        att = Attachment(
            type_id = 4,
            name = post['doc']['title'],
            message_id = msg_id,
            wall_id = wall_id
        )
        session.add(att)
    elif post["type"] == "link":
        att = Attachment(
            type_id = 5,
            name = post["link"]["url"],
            link = post["link"]["url"],
            message_id = msg_id,
            wall_id = wall_id
        )
        session.add(att)
 
    return att

ошибка

Файл "/home/irip/pycharm/vk_dl.py", строка 203, в <module>
main()
Файл "/home/irip/pycharm/vk_dl.py", строка 31, в main
print(get_attachment_data(post))
Файл "/home/irip/pycharm/vk_dl.py", строка 82, в get_attachment_data
if post["type"] == "photo":

builtins.KeyError: 'type'
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
04.11.2018, 23:50
Цитата Сообщение от IRIP Посмотреть сообщение
builtins.KeyError: 'type'
Нет ключа 'type' в вашем словаре post. Никогда не доверяйтесь данным, которые формируете не вы.
Наличие любого ключа нужно проверять - без фанатизма, конечно, так как какой-то минимум API источника должно гарантировать. Но, может быть просто переданный словарь был пустым. Ваш код должен уметь обрабатывать все ситуации - ключа нет, словарь пустой, это вовсе не словарь и т.п.

Добавлено через 5 минут
В python есть, например, такой паттерн безопасного обращения к цепочке ключей.
Python
1
2
3
>>> post = {"x":1,"y":2}
>>> post.get("z",{}).get("zz",{}).get("zzz",3)
3
Какова бы ни была истинная структура словаря - код никогда не упадет и в случае отсутствия какого-то ключа просто вернет конечное значение по умолчанию.
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
04.11.2018, 23:51  [ТС]
Garry Galler, разве никто не делал парсеров групп (страниц) - который постоянно должен брать данные?

Ведь тут свои тонкости.
Если я просто беру json, сохраняю его

то потом, мне нужно получать снова, и снова...
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
05.11.2018, 00:08
Цитата Сообщение от IRIP Посмотреть сообщение
разве никто не делал парсеров групп
Я не делал. Но если бы делал - сделал бы все необходимые проверки, не надеясь, что все будет так как написано в API.
Проверки получаемых значений и обработка ошибок - это половина любого кода, который должен быть запущен не одноразово.
У меня поверх того же requests написана целая библиотека, которая инкапсулирует обработку любой возможной ошибки связанной с получением данных из web, вплоть до простого выдергивания сетевого кабеля из ПК. Поэтому мои грабберы работают годами - по крайней мере, пока дизайнеры сайт не передизайнят - тогда уж да, приходится подгонять селекторы заново:-)
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
05.11.2018, 01:02  [ТС]
Garry Galler, да, все упирается то
что attachments, а в данном случае он выглядит так:

Кликните здесь для просмотра всего текста
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
"[
    {'type': 'photo', 'photo': 
        {
            'pid': 396321801, 'aid': -7, 'owner_id': -108964054, 'user_id': 100, 
                'src': 'https://pp.userapi.com/c628120/v628120161/3ed88/XzMjcBtuSNA.jpg', 
                'src_big': 'https://pp.userapi.com/c628120/v628120161/3ed89/8PSPbeSXwTQ.jpg', 
                'src_small': 'https://pp.userapi.com/c628120/v628120161/3ed87/j9bbFf6QAWk.jpg', 
                'src_xbig': 'https://pp.userapi.com/c628120/v628120161/3ed8a/6ejIQZp3I-c.jpg', 
                'src_xxbig': 'https://pp.userapi.com/c628120/v628120161/3ed8b/68e1YKW9QCg.jpg', 
                'width': 1200, 'height': 857, 
            'text': '', 
            'created': 1452073448, 
            'post_id': 18, 
            'access_key': 'f21356dc714b18c4d8'
        }
    }
]",


и может содержать не только photos но и видео, docs и т.п.
- это все нужно писать в одну ячейку базы - а потом как-то доставать, как я и делал изначально в коде:

data = {
'id': post_id,
'date': post_date,
'attachments': post_attachments,
'text': post_text
}

Кликните здесь для просмотра всего текста
Python
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
import vk_api
import json
import csv
import config as cnf
 
vk_session = vk_api.VkApi(cnf.login, cnf.password)
vk_session.auth()
vk = vk_session.get_api()
tools = vk_api.VkTools(vk_session)
 
def id_by_name(name):
    return vk.groups.getById(group_id = name)[0]['id']
 
 
def main():
    vk_session = vk_api.VkApi(cnf.login, cnf.password)
 
    try:
        vk_session.auth(token_only=True)
    except vk_api.AuthError as error_msg:
        print(error_msg)
        return
 
    tools = vk_api.VkTools(vk_session)
    wall = tools.get_all(
        'wall.get', 1, {'owner_id': cnf.owner_id, 'offset': 1}
    )
    print('Всего постов: ', wall['count'])
    items = wall['items']
 
    for post in items:  #print(post)
        get_data_post = get_data(post)  #print(get_data_post)
        save_csv(get_data_post)  #print('PPC')
 
 
def get_data(post):
    #print(post['attachments'])
    try:
        post_id = post['id']
    except:
        post_id = 'null'
 
    try:
        post_date = post['date']
    except:
        post_date = 'null'
 
    try:
        post_attachments = post['attachments']
    except:
        post_attachments = '* * *'
 
    try:
        post_text = post['text']
    except:
        post_text = '* * *'
 
    data = {
        'id': post_id,
        'date': post_date,
        'attachments': post_attachments,
        'text': post_text
    }
 
    return data
 
 
def save_csv(data):
    with open('posts_data.csv', 'a') as cfile:
        writer = csv.writer(cfile, delimiter=",")
        writer.writerow((
            data['id'],
            data['date'],
            data['attachments'],
            data['text']
        ))
 
 
def save_json(data):
    with open('wall.json', 'w') as jfile:
        json.dump(data, jfile, indent=2, ensure_ascii=False)
 
 
if __name__ == '__main__':
    main()



а потом уже из базы (доставать)

Добавлено через 22 секунды
как-то, эти аттачи - скачивать, и прикреплять к отчетам (аналитике)

Добавлено через 37 минут
вот так, пожалуй не сложная задача - превращается в суперсложную, если серьезно вникнуть
0
964 / 719 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
05.11.2018, 12:53
ну и сохраняйте
для вашего примера чуть изменив функцию
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def flattenjson(d):
    out = []
    def flat(obj,keys='[',delim=']['):
        if type(obj) is dict:
            for k in obj:
                flat(obj[k], keys + repr(k) + delim)
        elif type(obj) is list:
            for i,x in enumerate(obj):
                flat(x, keys + repr(i) + delim)
        else:
            out.append([keys[:-1],obj])
    flat(d)
    return out
 
l = flattenjson(d)
 
for i in l:
    k,v = i
    print(k,'=>',v)
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[0]['type'] => photo
[0]['photo']['pid'] => 396321801
[0]['photo']['aid'] => -7
[0]['photo']['owner_id'] => -108964054
[0]['photo']['user_id'] => 100
[0]['photo']['src'] => https://pp.userapi.com/c628120/v628120161/3ed88/XzMjcBtuSNA.jpg
[0]['photo']['src_big'] => https://pp.userapi.com/c628120/v628120161/3ed89/8PSPbeSXwTQ.jpg
[0]['photo']['src_small'] => https://pp.userapi.com/c628120/v628120161/3ed87/j9bbFf6QAWk.jpg
[0]['photo']['src_xbig'] => https://pp.userapi.com/c628120/v628120161/3ed8a/6ejIQZp3I-c.jpg
[0]['photo']['src_xxbig'] => https://pp.userapi.com/c628120/v628120161/3ed8b/68e1YKW9QCg.jpg
[0]['photo']['width'] => 1200
[0]['photo']['height'] => 857
[0]['photo']['text'] => 
[0]['photo']['created'] => 1452073448
[0]['photo']['post_id'] => 18
[0]['photo']['access_key'] => f21356dc714b18c4d8
Python
1
2
3
4
for i in l:
    k,v = i
    if 'http' in repr(v):
        print('key=' + k,'url=' + v)
Bash
1
2
3
4
5
key=[0]['photo']['src'] url=https://pp.userapi.com/c628120/v628120161/3ed88/XzMjcBtuSNA.jpg
key=[0]['photo']['src_big'] url=https://pp.userapi.com/c628120/v628120161/3ed89/8PSPbeSXwTQ.jpg
key=[0]['photo']['src_small'] url=https://pp.userapi.com/c628120/v628120161/3ed87/j9bbFf6QAWk.jpg
key=[0]['photo']['src_xbig'] url=https://pp.userapi.com/c628120/v628120161/3ed8a/6ejIQZp3I-c.jpg
key=[0]['photo']['src_xxbig'] url=https://pp.userapi.com/c628120/v628120161/3ed8b/68e1YKW9QCg.jpg
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
05.11.2018, 17:02  [ТС]
Цитата Сообщение от vic5710 Посмотреть сообщение
примера чуть изменив функцию
какую функцию?
мой последний пример?


Кликните здесь для просмотра всего текста
Python
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
import vk_api
import json
import csv
import config as cnf
 
vk_session = vk_api.VkApi(cnf.login, cnf.password)
vk_session.auth()
vk = vk_session.get_api()
tools = vk_api.VkTools(vk_session)
 
def id_by_name(name):
    return vk.groups.getById(group_id = name)[0]['id']
 
 
def main():
    vk_session = vk_api.VkApi(cnf.login, cnf.password)
 
    try:
        vk_session.auth(token_only=True)
    except vk_api.AuthError as error_msg:
        print(error_msg)
        return
 
    tools = vk_api.VkTools(vk_session)
    wall = tools.get_all(
        'wall.get', 1, {'owner_id': cnf.owner_id, 'offset': 1}
    )
    print('Всего постов: ', wall['count'])
    items = wall['items']
 
    l = flattenjson(items)
    for i in l:
        k, v = i
        print(k, '=>', v)
 
 
    for post in items:  #print(post)
        get_data_post = get_data(post)  #print(get_data_post)
        save_csv(get_data_post)  #print('PPC')
 
 
def flattenjson(d):
    out = []
    def flat(obj,keys='[',delim=']['):
        if type(obj) is dict:
            for k in obj:
                flat(obj[k], keys + repr(k) + delim)
        elif type(obj) is list:
            for i,x in enumerate(obj):
                flat(x, keys + repr(i) + delim)
        else:
            out.append([keys[:-1],obj])
    flat(d)
    return out
 
 
def get_data(post):
    #print(post['attachments'])
    try:
        post_id = post['id']
    except:
        post_id = 'null'
 
    try:
        post_date = post['date']
    except:
        post_date = 'null'
 
    try:
        post_attachments = post['attachments']
    except:
        post_attachments = '* * *'
 
    try:
        post_text = post['text']
    except:
        post_text = '* * *'
 
    data = {
        'id': post_id,
        'date': post_date,
        'attachments': post_attachments,
        'text': post_text
    }
 
    return data
 
 
def save_csv(data):
    with open('posts_data.csv', 'a') as cfile:
        writer = csv.writer(cfile, delimiter=",")
        writer.writerow((
            data['id'],
            data['date'],
            data['attachments'],
            data['text']
        ))
 
 
def save_json(data):
    with open('wall.json', 'w') as jfile:
        json.dump(data, jfile, indent=2, ensure_ascii=False)
 
 
if __name__ == '__main__':
    main()


Добавлено через 5 минут
* * *

ответ:

Кликните здесь для просмотра всего текста

Всего постов: 7
[0]['id'] => 26
[0]['from_id'] => -108964054
[0]['owner_id'] => -108964054
[0]['date'] => 1498774651
[0]['marked_as_ads'] => 0
[0]['post_type'] => post
[0]['text'] => Гибкий телефон Samsung Galaxy Skin

Иногда, от услышанного уши сворачиваются трубочкой. Бывает, в трубочку можно свернуть ноутбук. А дизайнер Хейон Ю (Heyon You) создал концепт мобильного телефона Samsung Galaxy Skin, который также можно будет свернуть в трубочку, да и вообще гнуть его по-всякому, как душе угодно!
Обычно дизайнеры-одиночки, создавая концепт нового мобильного телефона, просто вешают на него для красоты логотип какого-нибудь крупного производителя мобильной техники. А вот в случае с Хейоном Ю и его телефоном Samsung Galaxy Skin все произошло совсем по-другому! Компания Samsung сама заказала ему дизайн потенциального мобильного телефона Samsung Galaxy, если бы он был гибким. И Ю справился с поставленной перед ним задачей на твердую пятерку! Теперь посмотрим, как справится с его идеями Samsung.
По задумке Хейона Ю, реализованной им в концепте мобильного телефона Samsung Galaxy Skin, гибкость не даст аппарату никаких особенных новых технических функциональных возможностей. Зато она сделает его куда более удобным и практичным.
Если раньше у всякого телефона был свой форм-фактор (моноблок, слайдер, раскладушка, ротатор, браслет и т.д.), то Samsung Galaxy Skin, благодаря своей гибкости, сможет иметь практический любой из этих типов корпуса. Более того, с каждым из них будет ассоциироваться та или иная функция этого мобильного телефона.
К примеру, если просто сложить Samsung Galaxy Skin вдовое, то это будет обычный мобильный телефон, если сложить его вдвое и чуть раздвинуть кончики, то так будет очень хорошо проводить видеосвязь. Повернув аппарат набок и чуть согнув его бока, вы получите аудио-видеосистему, повернув набок и чуть согнув посередине – настольный будильник. Выставив один из кончиков телефона на высоте параллельно основанию, вы сделаете мультимедийный проектор.
[0]['attachments'][0]['type'] => photo
[0]['attachments'][0]['photo']['id'] => 456239019
[0]['attachments'][0]['photo']['album_id'] => -7
[0]['attachments'][0]['photo']['owner_id'] => -108964054
[0]['attachments'][0]['photo']['user_id'] => 100
[0]['attachments'][0]['photo']['sizes'][0]['type'] => m
[0]['attachments'][0]['photo']['sizes'][0]['url'] => https://pp.userapi.com/c837424... 7PmHiI.jpg
[0]['attachments'][0]['photo']['sizes'][0]['width'] => 130
[0]['attachments'][0]['photo']['sizes'][0]['height'] => 90
[0]['attachments'][0]['photo']['sizes'][1]['type'] => o
[0]['attachments'][0]['photo']['sizes'][1]['url'] => https://pp.userapi.com/c837424... pOqGVA.jpg
[0]['attachments'][0]['photo']['sizes'][1]['width'] => 130
[0]['attachments'][0]['photo']['sizes'][1]['height'] => 90
[0]['attachments'][0]['photo']['sizes'][2]['type'] => p
[0]['attachments'][0]['photo']['sizes'][2]['url'] => https://pp.userapi.com/c837424... PPZYXI.jpg
[0]['attachments'][0]['photo']['sizes'][2]['width'] => 200
[0]['attachments'][0]['photo']['sizes'][2]['height'] => 138
[0]['attachments'][0]['photo']['sizes'][3]['type'] => q
[0]['attachments'][0]['photo']['sizes'][3]['url'] => https://pp.userapi.com/c837424... oFUFzg.jpg
[0]['attachments'][0]['photo']['sizes'][3]['width'] => 320
[0]['attachments'][0]['photo']['sizes'][3]['height'] => 221
[0]['attachments'][0]['photo']['sizes'][4]['type'] => r
[0]['attachments'][0]['photo']['sizes'][4]['url'] => https://pp.userapi.com/c837424... LN0IDA.jpg
[0]['attachments'][0]['photo']['sizes'][4]['width'] => 510
[0]['attachments'][0]['photo']['sizes'][4]['height'] => 353
[0]['attachments'][0]['photo']['sizes'][5]['type'] => s
[0]['attachments'][0]['photo']['sizes'][5]['url'] => https://pp.userapi.com/c837424... zqvXHI.jpg
[0]['attachments'][0]['photo']['sizes'][5]['width'] => 75
[0]['attachments'][0]['photo']['sizes'][5]['height'] => 52
[0]['attachments'][0]['photo']['sizes'][6]['type'] => x
[0]['attachments'][0]['photo']['sizes'][6]['url'] => https://pp.userapi.com/c837424... DVPtOg.jpg
[0]['attachments'][0]['photo']['sizes'][6]['width'] => 600
[0]['attachments'][0]['photo']['sizes'][6]['height'] => 415
[0]['attachments'][0]['photo']['text'] =>
[0]['attachments'][0]['photo']['date'] => 1498774651
[0]['attachments'][0]['photo']['access_key'] => 18880407b36708dfc9
[0]['attachments'][1]['type'] => photo
[0]['attachments'][1]['photo']['id'] => 456239020
[0]['attachments'][1]['photo']['album_id'] => -7
[0]['attachments'][1]['photo']['owner_id'] => -108964054
[0]['attachments'][1]['photo']['user_id'] => 100
[0]['attachments'][1]['photo']['sizes'][0]['type'] => m
[0]['attachments'][1]['photo']['sizes'][0]['url'] => https://pp.userapi.com/c837424... ab753E.jpg
[0]['attachments'][1]['photo']['sizes'][0]['width'] => 130
[0]['attachments'][1]['photo']['sizes'][0]['height'] => 86
[0]['attachments'][1]['photo']['sizes'][1]['type'] => o
[0]['attachments'][1]['photo']['sizes'][1]['url'] => https://pp.userapi.com/c837424... pSJzuo.jpg
[0]['attachments'][1]['photo']['sizes'][1]['width'] => 130
[0]['attachments'][1]['photo']['sizes'][1]['height'] => 87
[0]['attachments'][1]['photo']['sizes'][2]['type'] => p
[0]['attachments'][1]['photo']['sizes'][2]['url'] => https://pp.userapi.com/c837424... 4VpQ-g.jpg
[0]['attachments'][1]['photo']['sizes'][2]['width'] => 200
[0]['attachments'][1]['photo']['sizes'][2]['height'] => 133
[0]['attachments'][1]['photo']['sizes'][3]['type'] => q
[0]['attachments'][1]['photo']['sizes'][3]['url'] => https://pp.userapi.com/c837424... p5kyv0.jpg
[0]['attachments'][1]['photo']['sizes'][3]['width'] => 320
[0]['attachments'][1]['photo']['sizes'][3]['height'] => 213
[0]['attachments'][1]['photo']['sizes'][4]['type'] => r
[0]['attachments'][1]['photo']['sizes'][4]['url'] => https://pp.userapi.com/c837424... uJrrHA.jpg
[0]['attachments'][1]['photo']['sizes'][4]['width'] => 510
[0]['attachments'][1]['photo']['sizes'][4]['height'] => 340
[0]['attachments'][1]['photo']['sizes'][5]['type'] => s
[0]['attachments'][1]['photo']['sizes'][5]['url'] => https://pp.userapi.com/c837424... PbKOxA.jpg
[0]['attachments'][1]['photo']['sizes'][5]['width'] => 75
[0]['attachments'][1]['photo']['sizes'][5]['height'] => 50
[0]['attachments'][1]['photo']['sizes'][6]['type'] => x
[0]['attachments'][1]['photo']['sizes'][6]['url'] => https://pp.userapi.com/c837424... M1F33Q.jpg
[0]['attachments'][1]['photo']['sizes'][6]['width'] => 600
[0]['attachments'][1]['photo']['sizes'][6]['height'] => 395
[0]['attachments'][1]['photo']['text'] =>
[0]['attachments'][1]['photo']['date'] => 1498774651
[0]['attachments'][1]['photo']['access_key'] => ddcf8fdb54f89e20cb
[0]['attachments'][2]['type'] => photo
[0]['attachments'][2]['photo']['id'] => 456239021
[0]['attachments'][2]['photo']['album_id'] => -7
[0]['attachments'][2]['photo']['owner_id'] => -108964054
[0]['attachments'][2]['photo']['user_id'] => 100
[0]['attachments'][2]['photo']['sizes'][0]['type'] => m
[0]['attachments'][2]['photo']['sizes'][0]['url'] => https://pp.userapi.com/c837424... naXZhA.jpg
[0]['attachments'][2]['photo']['sizes'][0]['width'] => 130
[0]['attachments'][2]['photo']['sizes'][0]['height'] => 77
[0]['attachments'][2]['photo']['sizes'][1]['type'] => o
[0]['attachments'][2]['photo']['sizes'][1]['url'] => https://pp.userapi.com/c837424... CuE2xI.jpg
[0]['attachments'][2]['photo']['sizes'][1]['width'] => 130
[0]['attachments'][2]['photo']['sizes'][1]['height'] => 87
[0]['attachments'][2]['photo']['sizes'][2]['type'] => p
[0]['attachments'][2]['photo']['sizes'][2]['url'] => https://pp.userapi.com/c837424... smHGgc.jpg
[0]['attachments'][2]['photo']['sizes'][2]['width'] => 200
[0]['attachments'][2]['photo']['sizes'][2]['height'] => 133
[0]['attachments'][2]['photo']['sizes'][3]['type'] => q
[0]['attachments'][2]['photo']['sizes'][3]['url'] => https://pp.userapi.com/c837424... TioarM.jpg
[0]['attachments'][2]['photo']['sizes'][3]['width'] => 320
[0]['attachments'][2]['photo']['sizes'][3]['height'] => 213
[0]['attachments'][2]['photo']['sizes'][4]['type'] => r
[0]['attachments'][2]['photo']['sizes'][4]['url'] => https://pp.userapi.com/c837424... 7k6H3g.jpg
[0]['attachments'][2]['photo']['sizes'][4]['width'] => 510
[0]['attachments'][2]['photo']['sizes'][4]['height'] => 340
[0]['attachments'][2]['photo']['sizes'][5]['type'] => s
[0]['attachments'][2]['photo']['sizes'][5]['url'] => https://pp.userapi.com/c837424... btnvkI.jpg
[0]['attachments'][2]['photo']['sizes'][5]['width'] => 75
[0]['attachments'][2]['photo']['sizes'][5]['height'] => 44
[0]['attachments'][2]['photo']['sizes'][6]['type'] => x
[0]['attachments'][2]['photo']['sizes'][6]['url'] => https://pp.userapi.com/c837424... LYjjT0.jpg
[0]['attachments'][2]['photo']['sizes'][6]['width'] => 600
[0]['attachments'][2]['photo']['sizes'][6]['height'] => 354
[0]['attachments'][2]['photo']['text'] =>
[0]['attachments'][2]['photo']['date'] => 1498774651
[0]['attachments'][2]['photo']['access_key'] => f55869435064239b2e
[0]['attachments'][3]['type'] => photo
[0]['attachments'][3]['photo']['id'] => 456239022
[0]['attachments'][3]['photo']['album_id'] => -7
[0]['attachments'][3]['photo']['owner_id'] => -108964054
[0]['attachments'][3]['photo']['user_id'] => 100
[0]['attachments'][3]['photo']['sizes'][0]['type'] => m
[0]['attachments'][3]['photo']['sizes'][0]['url'] => https://pp.userapi.com/c837424... 2Jbc_w.jpg
[0]['attachments'][3]['photo']['sizes'][0]['width'] => 130
[0]['attachments'][3]['photo']['sizes'][0]['height'] => 88
[0]['attachments'][3]['photo']['sizes'][1]['type'] => o
[0]['attachments'][3]['photo']['sizes'][1]['url'] => https://pp.userapi.com/c837424... cdY2HQ.jpg
[0]['attachments'][3]['photo']['sizes'][1]['width'] => 130
[0]['attachments'][3]['photo']['sizes'][1]['height'] => 88
[0]['attachments'][3]['photo']['sizes'][2]['type'] => p
[0]['attachments'][3]['photo']['sizes'][2]['url'] => https://pp.userapi.com/c837424... -HgG4k.jpg
[0]['attachments'][3]['photo']['sizes'][2]['width'] => 200
[0]['attachments'][3]['photo']['sizes'][2]['height'] => 135
[0]['attachments'][3]['photo']['sizes'][3]['type'] => q
[0]['attachments'][3]['photo']['sizes'][3]['url'] => https://pp.userapi.com/c837424... C8RSC0.jpg
[0]['attachments'][3]['photo']['sizes'][3]['width'] => 320
[0]['attachments'][3]['photo']['sizes'][3]['height'] => 216
[0]['attachments'][3]['photo']['sizes'][4]['type'] => r
[0]['attachments'][3]['photo']['sizes'][4]['url'] => https://pp.userapi.com/c837424... Sb6EmU.jpg
[0]['attachments'][3]['photo']['sizes'][4]['width'] => 510
[0]['attachments'][3]['photo']['sizes'][4]['height'] => 344
[0]['attachments'][3]['photo']['sizes'][5]['type'] => s
[0]['attachments'][3]['photo']['sizes'][5]['url'] => https://pp.userapi.com/c837424... LIz7EI.jpg
[0]['attachments'][3]['photo']['sizes'][5]['width'] => 75
[0]['attachments'][3]['photo']['sizes'][5]['height'] => 51
[0]['attachments'][3]['photo']['sizes'][6]['type'] => x
[0]['attachments'][3]['photo']['sizes'][6]['url'] => https://pp.userapi.com/c837424... I2tEkU.jpg
[0]['attachments'][3]['photo']['sizes'][6]['width'] => 600
[0]['attachments'][3]['photo']['sizes'][6]['height'] => 405
[0]['attachments'][3]['photo']['text'] =>
[0]['attachments'][3]['photo']['date'] => 1498774651
[0]['attachments'][3]['photo']['access_key'] => 414928a3639bab092f
[0]['post_source']['type'] => vk
[0]['comments']['count'] => 0
[0]['comments']['can_post'] => 1
[0]['comments']['groups_can_post'] => True
[0]['likes']['count'] => 0
[0]['likes']['user_likes'] => 0
[0]['likes']['can_like'] => 1
[0]['likes']['can_publish'] => 1
[0]['reposts']['count'] => 0
[0]['reposts']['user_reposted'] => 0
[0]['views']['count'] => 39



Добавлено через 2 минуты
* * *

если я правильно понимаю, то мне, в def get_data
нужно добавить сюда

Python
1
2
3
4
    try:
        post_attachments = post['attachments']
    except:
        post_attachments = '* * *'
что-то, что в итоге, в return data

передаст в attachments

Добавлено через 26 минут
======================================== ======================
Хакаем систему объединения постов этого форума...
======================================== ======================

* * *
Отделяем запись.

Итак:

код
Кликните здесь для просмотра всего текста
Python
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
import vk_api
import json
import csv
import config as cnf
 
vk_session = vk_api.VkApi(cnf.login, cnf.password)
vk_session.auth()
vk = vk_session.get_api()
tools = vk_api.VkTools(vk_session)
 
def id_by_name(name):
    return vk.groups.getById(group_id = name)[0]['id']
 
 
def main():
    vk_session = vk_api.VkApi(cnf.login, cnf.password)
 
    try:
        vk_session.auth(token_only=True)
    except vk_api.AuthError as error_msg:
        print(error_msg)
        return
 
    tools = vk_api.VkTools(vk_session)
    wall = tools.get_all(
        'wall.get', 1, {'owner_id': cnf.owner_id, 'offset': 1}
    )
    print('Всего постов: ', wall['count'])
    items = wall['items']
 
    l = flattenjson(items)
    for i in l:
        k,v = i
        if 'http' in repr(v):
            print('key=' + k,'url=' + v)
 
 
    for post in items:  #print(post)
        get_data_post = get_data(post)  #print(get_data_post)
        save_csv(get_data_post)  #print('PPC')
 
 
def flattenjson(d):
    out = []
    def flat(obj,keys='[',delim=']['):
        if type(obj) is dict:
            for k in obj:
                flat(obj[k], keys + repr(k) + delim)
        elif type(obj) is list:
            for i,x in enumerate(obj):
                flat(x, keys + repr(i) + delim)
        else:
            out.append([keys[:-1],obj])
    flat(d)
    return out
 
 
def get_data(post):
    #print(post['attachments'])
    try:
        post_id = post['id']
    except:
        post_id = 'null'
 
    try:
        post_date = post['date']
    except:
        post_date = 'null'
 
    try:
        post_attachments = post['attachments']
    except:
        post_attachments = '* * *'
 
    try:
        post_text = post['text']
    except:
        post_text = '* * *'
 
    data = {
        'id': post_id,
        'date': post_date,
        'attachments': post_attachments,
        'text': post_text
    }
 
    return data
 
 
def save_csv(data):
    with open('posts_data.csv', 'a') as cfile:
        writer = csv.writer(cfile, delimiter=",")
        writer.writerow((
            data['id'],
            data['date'],
            data['attachments'],
            data['text']
        ))
 
 
def save_json(data):
    with open('wall.json', 'w') as jfile:
        json.dump(data, jfile, indent=2, ensure_ascii=False)
 
 
if __name__ == '__main__':
    main()



дает на выходе не все посты
но уже очень близко

Добавлено через 33 минуты
и почему get запрос посылается с помощью vk_api вместо того же requests?
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
05.11.2018, 18:35  [ТС]
* * *

Оказывается, побороть большую часть геммороя можно просто поменяв в запросе версию апи =) Сравним... делаем запрос через requests


Версия 5.87

JSON
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
{
"response": {
"count": 7,
"items": [{
"id": 25,
"from_id": -108964054,
"owner_id": -108964054,
"date": 1498774268,
"marked_as_ads": 0,
"post_type": "post",
"text": "Летающий велосипед от чешских инженеров
 
Группа энтузиастов из нескольких чешских компаний создала проект летающего велосипеда с шестью пропеллерами для поднятия его в воздух, и намерена сконструировать свой FBike до объявленных ранее тестовых полётов в августе.
Известный просто как Летающий Велосипед (с), этот совместно создаваемый аппарат усилиями группы компаний Чехии и отдельными велосипедными энтузиастами всё ещё находится в стадии ранней разработки, которая предусматривает монтаж электропропеллеров к обычной раме двухколёсного друга, что позволит ездоку подниматься над транспортным потоком и парить, пока не закончится электрозарядка.
Проект FBike стартовал осенью 2011 года с предложения создать электровелосипед, но изобретатели из чешских фирм Technodat, Evektorи Duratec задумали вместо этого нечто менее приземлённое.",
"attachments": [{
"type": "photo",
"photo": {
"id": 456239017,
"album_id": -7,
"owner_id": -108964054,
"user_id": 100,
"sizes": [{
"type": "m",
"url": "https://pp.userap...a88/P-afQlSuoI8.jpg",
"width": 130,
"height": 79
}, {
"type": "o",
"url": "https://pp.userap...a8b/F5VLiDpWE4c.jpg",
"width": 130,
"height": 87
}, {
"type": "p",
"url": "https://pp.userap...a8c/LJwqjbif4wg.jpg",
"width": 200,
"height": 133
}, {
"type": "q",
"url": "https://pp.userap...a8d/vtexKqQik5g.jpg",
"width": 320,
"height": 213
}, {
"type": "r",
"url": "https://pp.userap...a8e/7ozn349Vk3Q.jpg",
"width": 510,
"height": 340
}, {
"type": "s",
"url": "https://pp.userap...a87/9KPZGGAO7zI.jpg",
"width": 75,
"height": 46
}, {
"type": "x",
"url": "https://pp.userap...a89/hbibL_XQW0Y.jpg",
"width": 604,
"height": 368
}, {
"type": "y",
"url": "https://pp.userap...a8a/DI7z20UF4KY.jpg",
"width": 640,
"height": 390
}],
"text": "",
"date": 1498774382,
"access_key": "b09c0d72c92a0363fd"
}
}, {
"type": "photo",
"photo": {
"id": 456239018,
"album_id": -7,
"owner_id": -108964054,
"user_id": 100,
"sizes": [{
"type": "m",
"url": "https://pp.userap...a90/iQZoEE2j6mw.jpg",
"width": 130,
"height": 59
}, {
"type": "o",
"url": "https://pp.userap...a92/4YJE8EE7T6M.jpg",
"width": 130,
"height": 87
}, {
"type": "p",
"url": "https://pp.userap...a93/TumZx8Zj9QQ.jpg",
"width": 200,
"height": 133
}, {
"type": "q",
"url": "https://pp.userap...a94/HoyuhODn01Q.jpg",
"width": 320,
"height": 213
}, {
"type": "r",
"url": "https://pp.userap...a95/V_2DBGoG0ak.jpg",
"width": 476,
"height": 215
}, {
"type": "s",
"url": "https://pp.userap...a8f/oz-DNnQ3KmI.jpg",
"width": 75,
"height": 34
}, {
"type": "x",
"url": "https://pp.userap...a91/TXLao9eeMYI.jpg",
"width": 476,
"height": 215
}],
"text": "",
"date": 1498774382,
"access_key": "a12a69678c156c319a"
}
}],
"post_source": {
"type": "vk"
},
"comments": {
"count": 0,
"can_post": 1,
"groups_can_post": true
},
"likes": {
"count": 0,
"user_likes": 0,
"can_like": 1,
"can_publish": 1
},
"reposts": {
"count": 0,
"user_reposted": 0
},
"views": {
"count": 34
}
}],
"profiles": [],
"groups": [{
"id": 172861026,
"name": "Сайт пчеловодов",
"screen_name": "sitepchelovodov",
"is_closed": 0,
"type": "group",
"is_admin": 1,
"admin_level": 3,
"is_member": 1,
"photo_50": "https://pp.userap...dMg0pdjTM.jpg?ava=1",
"photo_100": "https://pp.userap...Ap3OGOi-c.jpg?ava=1",
"photo_200": "https://pp.userap...VflcWs7CE.jpg?ava=1"
}, {
"id": 108964054,
"name": "Новинки технологии",
"screen_name": "new_tehnolojy",
"is_closed": 0,
"type": "group",
"is_admin": 0,
"is_member": 1,
"photo_50": "https://pp.userap...uxmWvxRsQ.jpg?ava=1",
"photo_100": "https://pp.userap...cKaJc6evc.jpg?ava=1",
"photo_200": "https://pp.userap...rr6rzHWMY.jpg?ava=1"
}]
}
}



Версия 5.0

JSON
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
{
"response": {
"count": 7,
"items": [{
"id": 25,
"from_id": -108964054,
"to_id": -108964054,
"date": 1498774268,
"marked_as_ads": 0,
"post_type": "post",
"text": "Летающий велосипед от чешских инженеров
 
Группа энтузиастов из нескольких чешских компаний создала проект летающего велосипеда с шестью пропеллерами для поднятия его в воздух, и намерена сконструировать свой FBike до объявленных ранее тестовых полётов в августе.
Известный просто как Летающий Велосипед (с), этот совместно создаваемый аппарат усилиями группы компаний Чехии и отдельными велосипедными энтузиастами всё ещё находится в стадии ранней разработки, которая предусматривает монтаж электропропеллеров к обычной раме двухколёсного друга, что позволит ездоку подниматься над транспортным потоком и парить, пока не закончится электрозарядка.
Проект FBike стартовал осенью 2011 года с предложения создать электровелосипед, но изобретатели из чешских фирм Technodat, Evektorи Duratec задумали вместо этого нечто менее приземлённое.",
"attachments": [{
"type": "photo",
"photo": {
"id": 456239017,
"album_id": -7,
"owner_id": -108964054,
"user_id": 100,
"photo_75": "https://pp.userap...a87/9KPZGGAO7zI.jpg",
"photo_130": "https://pp.userap...a88/P-afQlSuoI8.jpg",
"photo_604": "https://pp.userap...a89/hbibL_XQW0Y.jpg",
"photo_807": "https://pp.userap...a8a/DI7z20UF4KY.jpg",
"width": 640,
"height": 390,
"text": "",
"date": 1498774382,
"access_key": "b09c0d72c92a0363fd"
}
}, {
"type": "photo",
"photo": {
"id": 456239018,
"album_id": -7,
"owner_id": -108964054,
"user_id": 100,
"photo_75": "https://pp.userap...a8f/oz-DNnQ3KmI.jpg",
"photo_130": "https://pp.userap...a90/iQZoEE2j6mw.jpg",
"photo_604": "https://pp.userap...a91/TXLao9eeMYI.jpg",
"width": 476,
"height": 215,
"text": "",
"date": 1498774382,
"access_key": "a12a69678c156c319a"
}
}],
"post_source": {
"type": "vk"
},
"comments": {
"count": 0,
"can_post": 1
},
"likes": {
"count": 0,
"user_likes": 0,
"can_like": 1,
"can_publish": 1
},
"reposts": {
"count": 0,
"user_reposted": 0
}
}],
"profiles": [],
"groups": [{
"id": 172861026,
"name": "Сайт пчеловодов",
"screen_name": "sitepchelovodov",
"is_closed": 0,
"type": "group",
"is_admin": 1,
"admin_level": 3,
"is_member": 1,
"photo_50": "https://pp.userap...dMg0pdjTM.jpg?ava=1",
"photo_100": "https://pp.userap...Ap3OGOi-c.jpg?ava=1",
"photo_200": "https://pp.userap...VflcWs7CE.jpg?ava=1"
}, {
"id": 108964054,
"name": "Новинки технологии",
"screen_name": "new_tehnolojy",
"is_closed": 0,
"type": "group",
"is_admin": 0,
"is_member": 1,
"photo_50": "https://pp.userap...uxmWvxRsQ.jpg?ava=1",
"photo_100": "https://pp.userap...cKaJc6evc.jpg?ava=1",
"photo_200": "https://pp.userap...rr6rzHWMY.jpg?ava=1"
}]
}
}


очевидно, 5.0 гораздо круче =) для наших задач
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
05.11.2018, 21:10
Цитата Сообщение от IRIP Посмотреть сообщение
очевидно, 5.0 гораздо круче =) для наших задач
Не рекомендую использовать старые версии API. Они могут не поддерживать какие-нибудь важные новые штуки. И в дальнейшем, старые версии API, скорее всего, будут отключены.

К тому же, нет принципиальной разницы между выложенными структурами (с точки зрения извлечения из них информации).
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
06.11.2018, 00:14  [ТС]
vrm2, с моей точки зрения, человека, для которого пока еще страшно звучит "import vk_api" - кажется, что завлекаешь темную лошадку... это все пока недосягаемо

если я беру requests - то тут все понятно (вроде)
Подставляю в url переменные - получаю вменяемый результат =)
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
08.11.2018, 00:36
Если кому-то интересно - для python есть модуль, который умеет делать вот такую магию:
Python
1
2
3
4
5
6
7
8
9
10
import json
from jsonpath_rw import jsonpath, parse
 
with open('test.json',encoding='utf8') as f:
    d = json.load(f)
 
# выбрать рекурсивно из всех списков содержимое ключей photo 
# и извлечь из содержимого значения указанных ключей 
for match in parse('$..photo[src,src_big,src_small,pid]').find(d):
    print(match.full_path,"=>",match.path,"=>", match.value)
Тестовый json
Кликните здесь для просмотра всего текста
JSON
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
[
    {"type": "photo", "photo": 
        {
            "pid": 396321801, "aid": -7, "owner_id": -108964054, "user_id": 100, 
                "src": "https://pp.userapi.com/c628120/v628120161/3ed88/XzMjcBtuSNA.jpg", 
                "src_big": "https://pp.userapi.com/c628120/v628120161/3ed89/8PSPbeSXwTQ.jpg", 
                "src_small": "https://pp.userapi.com/c628120/v628120161/3ed87/j9bbFf6QAWk.jpg", 
                "src_xbig": "https://pp.userapi.com/c628120/v628120161/3ed8a/6ejIQZp3I-c.jpg", 
                "src_xxbig": "https://pp.userapi.com/c628120/v628120161/3ed8b/68e1YKW9QCg.jpg", 
                "width": 1200, "height": 857, 
            "text": "", 
            "created": 1452073448, 
            "post_id": 18, 
            "access_key": "f21356dc714b18c4d8"
        }
    },
    
    {"type": "photo", "photo": 
        {
            "pid": 396321801, "aid": -7, "owner_id": -108964054, "user_id": 100, 
                "src": "https://pp.userapi.com/c628120/v628120161/3ed88/XzMjcBtuSNA.jpg", 
                "src_big": "https://pp.userapi.com/c628120/v628120161/3ed89/8PSPbeSXwTQ.jpg", 
                "src_small": "https://pp.userapi.com/c628120/v628120161/3ed87/j9bbFf6QAWk.jpg", 
                "src_xbig": "https://pp.userapi.com/c628120/v628120161/3ed8a/6ejIQZp3I-c.jpg", 
                "src_xxbig": "https://pp.userapi.com/c628120/v628120161/3ed8b/68e1YKW9QCg.jpg", 
                "width": 1200, "height": 857, 
            "text": "", 
            "created": 1452073448, 
            "post_id": 18, 
            "access_key": "f21356dc714b18c4d8"
        }
    },
   
   {"type": "photo", "photo": 
        {
            "pid": 396321801, "aid": -7, "owner_id": -108964054, "user_id": 100, 
                "src": "https://pp.userapi.com/c628120/v628120161/3ed88/XzMjcBtuSNA.jpg", 
                "src_big": "https://pp.userapi.com/c628120/v628120161/3ed89/8PSPbeSXwTQ.jpg", 
                "src_small": "https://pp.userapi.com/c628120/v628120161/3ed87/j9bbFf6QAWk.jpg", 
                "src_xbig": "https://pp.userapi.com/c628120/v628120161/3ed8a/6ejIQZp3I-c.jpg", 
                "src_xxbig": "https://pp.userapi.com/c628120/v628120161/3ed8b/68e1YKW9QCg.jpg", 
                "width": 1200, "height": 857, 
            "text": "", 
            "created": 1452073448, 
            "post_id": 18, 
            "access_key": "f21356dc714b18c4d8"
        }
    }
    
]


Используемая нотация это JSONPath, которая является ответвлением языка запросов XPATH для XML\HTML.
Поддерживается почти все, что и для XML\HTML: * (любой элемент), слайсы, индексы, сравнения, фильтрация... только синтаксис // заменен .. и / на .

Code
1
2
3
4
5
6
7
8
9
10
11
12
[0].photo.src => src => https://pp.userapi.com/c628120/v628120161/3ed88/XzMjcBtuSNA.jpg
[0].photo.src_big => src_big => https://pp.userapi.com/c628120/v628120161/3ed89/8PSPbeSXwTQ.jpg
[0].photo.src_small => src_small => https://pp.userapi.com/c628120/v628120161/3ed87/j9bbFf6QAWk.jpg
[0].photo.pid => pid => 396321801
[1].photo.src => src => https://pp.userapi.com/c628120/v628120161/3ed88/XzMjcBtuSNA.jpg
[1].photo.src_big => src_big => https://pp.userapi.com/c628120/v628120161/3ed89/8PSPbeSXwTQ.jpg
[1].photo.src_small => src_small => https://pp.userapi.com/c628120/v628120161/3ed87/j9bbFf6QAWk.jpg
[1].photo.pid => pid => 396321801
[2].photo.src => src => https://pp.userapi.com/c628120/v628120161/3ed88/XzMjcBtuSNA.jpg
[2].photo.src_big => src_big => https://pp.userapi.com/c628120/v628120161/3ed89/8PSPbeSXwTQ.jpg
[2].photo.src_small => src_small => https://pp.userapi.com/c628120/v628120161/3ed87/j9bbFf6QAWk.jpg
[2].photo.pid => pid => 396321801
4
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
10.11.2018, 22:50  [ТС]
Прохожу снова и снова этапы, с нуля, руками, мозгами вдумываясь в каждую запятую


Пока пришел к этому:

Python
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
import json
import config as cnf
import vk_api
import lang
 
def main():
    session = vk_api.VkApi(cnf.login, cnf.password)
    params = {
        'owner_id': cnf.owner_id,
        'v': '5.60'
    }
    count = 100
 
    try:
        session.auth(token_only=True)
    except vk_api.AuthError as auth_error_msg:
        print(auth_error_msg)
        return
 
    tools = vk_api.VkTools(session)
 
    response = tools.get_all(
        'wall.get',
        count,
        params
    )
 
    print('Posts count:', response['count'])
 
 
if __name__ == '__main__':
    main()
Добавлено через 33 минуты
Проблема этого кода в том, что если в группе 20 000 сообщений - он даже их не считает
зависает

Добавлено через 38 минут
* * *

запрос

print(response, type(response)) - выдает <class 'generator'>


А простое и понятное слово - генератор - "наши" переводчики как только не обзывают: и список, и итератор и чё хош...

Когда говорят - генератор - становится понятным, что это ГЕНЕРАТОР! Все просто! Г Е Н Е Р А Т О Р -
а это значит - он сгенерировал объем

и теперь нужно пройтись по массиву объема для распаковки =)

например ТАК:

Python
1
2
    for x in response:
        print(x['date'])
Т р У д Н о С т И П е Р е В о Д а ... блин

"наука" находится в стадии зародыша... многие авторы трактуют по своему термины, и когда одновременно читаешь 2-3 автора + смотришь курсы, не удивительно, что в голове получается КАША
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
10.11.2018, 23:37
Генератор - это как список, но выдает свои элементы по запросу, по мере надобности.
Если хотите работать со списком, то в превратить генератор в список можно так:
Code
1
my_list = list(my_generator)
Добавлено через 1 минуту
Список, генератор, итератор - это разные термины
1
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
11.11.2018, 00:48  [ТС]
vrm2, тему с получением, я понял. В итоге включаю v api = 5.60 и нормальные данные, с которыми можно работать

теперь нужно учиться эти все данные сохранять в базу сайта который тоже имеет api

https://docs.instantcms.ru/man... pi/methods

Добавлено через 14 минут
* * *

ну или сразу в базу писать

вооот в такую таблицу

Oracle 11 SQL
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
CREATE TABLE `cms_con_posts` (
  `id` int(11) UNSIGNED NOT NULL,
  `title` VARCHAR(100) DEFAULT NULL,
  `content` text,
  `slug` VARCHAR(100) DEFAULT NULL,
  `seo_keys` VARCHAR(256) DEFAULT NULL,
  `seo_desc` VARCHAR(256) DEFAULT NULL,
  `seo_title` VARCHAR(256) DEFAULT NULL,
  `tags` VARCHAR(1000) DEFAULT NULL,
  `date_pub` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `date_last_modified` TIMESTAMP NULL DEFAULT NULL,
  `date_pub_end` TIMESTAMP NULL DEFAULT NULL,
  `is_pub` tinyint(1) DEFAULT '1',
  `hits_count` int(11) DEFAULT '0',
  `user_id` int(11) UNSIGNED DEFAULT NULL,
  `parent_id` int(11) UNSIGNED DEFAULT NULL,
  `parent_type` VARCHAR(32) DEFAULT NULL,
  `parent_title` VARCHAR(100) DEFAULT NULL,
  `parent_url` VARCHAR(255) DEFAULT NULL,
  `is_parent_hidden` tinyint(1) DEFAULT NULL,
  `category_id` int(11) UNSIGNED NOT NULL DEFAULT '1',
  `folder_id` int(11) UNSIGNED DEFAULT NULL,
  `is_comments_on` tinyint(1) UNSIGNED DEFAULT '1',
  `comments` int(11) NOT NULL DEFAULT '0',
  `rating` int(11) NOT NULL DEFAULT '0',
  `is_deleted` tinyint(1) UNSIGNED DEFAULT NULL,
  `is_approved` tinyint(1) NOT NULL DEFAULT '1',
  `approved_by` int(11) DEFAULT NULL,
  `date_approved` TIMESTAMP NULL DEFAULT NULL,
  `is_private` tinyint(1) NOT NULL DEFAULT '0',
  `picture` text,
  `parent_blogs_id` VARCHAR(1024) DEFAULT NULL,
  `photos` text,
  `buy` tinyint(1) UNSIGNED DEFAULT NULL,
  `sell` tinyint(1) UNSIGNED DEFAULT NULL,
  `news` tinyint(1) UNSIGNED DEFAULT NULL,
  `geo` int(11) UNSIGNED DEFAULT NULL,
  `geo_cache` VARCHAR(128) DEFAULT NULL,
  `sity` int(11) UNSIGNED DEFAULT NULL,
  `sity_cache` VARCHAR(128) DEFAULT NULL,
  `price` DECIMAL(9,2) UNSIGNED DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Добавлено через 3 минуты
Oracle 11 SQL
1
2
INSERT INTO `cms_con_posts` (`id`, `title`, `content`, `slug`, `seo_keys`, `seo_desc`, `seo_title`, `tags`, `date_pub`, `date_last_modified`, `date_pub_end`, `is_pub`, `hits_count`, `user_id`, `parent_id`, `parent_type`, `parent_title`, `parent_url`, `is_parent_hidden`, `category_id`, `folder_id`, `is_comments_on`, `comments`, `rating`, `is_deleted`, `is_approved`, `approved_by`, `date_approved`, `is_private`, `picture`, `parent_blogs_id`, `photos`, `buy`, `sell`, `news`, `geo`, `geo_cache`, `sity`, `sity_cache`, `price`) VALUES
(331, '***', 'Вот жизнь, только держись. Постояла погодка, и хватит. На завтра и до конца недели обещают +15-20, дожди. Сегодня тучки обложные, а вчера грозы ходили.', '331-untitled', NULL, NULL, '***', NULL, '2009-07-21 03:15:06', '2018-10-10 17:28:25', NULL, 1, 19, 62, 16, 'group', '* * *', 'groups/16/content/posts', NULL, 6, NULL, 1, 0, 0, NULL, 1, NULL, NULL, 0, NULL, '27', NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, NULL),
Добавлено через 32 минуты
* * *

выше, мы разбирали, как сохранить в sqlite
но этот способ, почему-то не нравится.

Интересен вариант - когда сразу сохраняешь в базу и скачиваешь файлы
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
13.11.2018, 11:11  [ТС]
В общем, на сегодняшний день, единственное, что удалось добиться - сохранять ответ в csv или выводить на экран.

Стараюсь разобраться как вот из такого ответа
выдрать фото "photo_604" вместе с урлом

Кликните здесь для просмотра всего текста

JSON
1
2
3
4
5
6
7
{'id': 26, 'date': 1498774651, 'attachments': [{'type': 'photo', 'photo': {'id': 456239019, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'photo_75': 'https://pp.userapi.com/c837424/v837424161/bdaa0/YthJBzqvXHI.jpg', 'photo_130': 'https://pp.userapi.com/c837424/v837424161/bdaa1/tlcoU7PmHiI.jpg', 'photo_604': 'https://pp.userapi.com/c837424/v837424161/bdaa2/aabdwDVPtOg.jpg', 'width': 600, 'height': 415, 'text': '', 'date': 1498774651, 'access_key': '18880407b36708dfc9'}}, {'type': 'photo', 'photo': {'id': 456239020, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'photo_75': 'https://pp.userapi.com/c837424/v837424161/bdaa7/M-8oZPbKOxA.jpg', 'photo_130': 'https://pp.userapi.com/c837424/v837424161/bdaa8/eqLJOab753E.jpg', 'photo_604': 'https://pp.userapi.com/c837424/v837424161/bdaa9/r_7_MM1F33Q.jpg', 'width': 600, 'height': 395, 'text': '', 'date': 1498774651, 'access_key': 'ddcf8fdb54f89e20cb'}}, {'type': 'photo', 'photo': {'id': 456239021, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'photo_75': 'https://pp.userapi.com/c837424/v837424161/bdab8/9xp-bbtnvkI.jpg', 'photo_130': 'https://pp.userapi.com/c837424/v837424161/bdab9/LzHnInaXZhA.jpg', 'photo_604': 'https://pp.userapi.com/c837424/v837424161/bdaba/IKKf_LYjjT0.jpg', 'width': 600, 'height': 354, 'text': '', 'date': 1498774651, 'access_key': 'f55869435064239b2e'}}, {'type': 'photo', 'photo': {'id': 456239022, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'photo_75': 'https://pp.userapi.com/c837424/v837424161/bdabf/yE1zMLIz7EI.jpg', 'photo_130': 'https://pp.userapi.com/c837424/v837424161/bdac0/5jIX22Jbc_w.jpg', 'photo_604': 'https://pp.userapi.com/c837424/v837424161/bdac1/2x1AZI2tEkU.jpg', 'width': 600, 'height': 405, 'text': '', 'date': 1498774651, 'access_key': '414928a3639bab092f'}}], 'text': 'Гибкий телефон Samsung Galaxy Skin\n\nИногда, от услышанного уши сворачиваются трубочкой. Бывает, в трубочку можно свернуть ноутбук. А дизайнер Хейон Ю (Heyon You) создал концепт мобильного телефона Samsung Galaxy Skin, который также можно будет свернуть в трубочку, да и вообще гнуть его по-всякому, как душе угодно! \nОбычно дизайнеры-одиночки, создавая концепт нового мобильного телефона, просто вешают на него для красоты логотип какого-нибудь крупного производителя мобильной техники. А вот в случае с Хейоном Ю и его телефоном Samsung Galaxy Skin все произошло совсем по-другому! Компания Samsung сама заказала ему дизайн потенциального мобильного телефона Samsung Galaxy, если бы он был гибким. И Ю справился с поставленной перед ним задачей на твердую пятерку! Теперь посмотрим, как справится с его идеями Samsung. \nПо задумке Хейона Ю, реализованной им в концепте мобильного телефона Samsung Galaxy Skin, гибкость не даст аппарату никаких особенных новых технических функциональных возможностей. Зато она сделает его куда более удобным и практичным. \nЕсли раньше у всякого телефона был свой форм-фактор (моноблок, слайдер, раскладушка, ротатор, браслет и т.д.), то Samsung Galaxy Skin, благодаря своей гибкости, сможет иметь практический любой из этих типов корпуса. Более того, с каждым из них будет ассоциироваться та или иная функция этого мобильного телефона. \nК примеру, если просто сложить Samsung Galaxy Skin вдовое, то это будет обычный мобильный телефон, если сложить его вдвое и чуть раздвинуть кончики, то так будет очень хорошо проводить видеосвязь. Повернув аппарат набок и чуть согнув его бока, вы получите аудио-видеосистему, повернув набок и чуть согнув посередине – настольный будильник. Выставив один из кончиков телефона на высоте параллельно основанию, вы сделаете мультимедийный проектор.'}
{'id': 25, 'date': 1498774268, 'attachments': [{'type': 'photo', 'photo': {'id': 456239017, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'photo_75': 'https://pp.userapi.com/c837424/v837424161/bda87/9KPZGGAO7zI.jpg', 'photo_130': 'https://pp.userapi.com/c837424/v837424161/bda88/P-afQlSuoI8.jpg', 'photo_604': 'https://pp.userapi.com/c837424/v837424161/bda89/hbibL_XQW0Y.jpg', 'photo_807': 'https://pp.userapi.com/c837424/v837424161/bda8a/DI7z20UF4KY.jpg', 'width': 640, 'height': 390, 'text': '', 'date': 1498774382, 'access_key': 'b09c0d72c92a0363fd'}}, {'type': 'photo', 'photo': {'id': 456239018, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'photo_75': 'https://pp.userapi.com/c837424/v837424161/bda8f/oz-DNnQ3KmI.jpg', 'photo_130': 'https://pp.userapi.com/c837424/v837424161/bda90/iQZoEE2j6mw.jpg', 'photo_604': 'https://pp.userapi.com/c837424/v837424161/bda91/TXLao9eeMYI.jpg', 'width': 476, 'height': 215, 'text': '', 'date': 1498774382, 'access_key': 'a12a69678c156c319a'}}], 'text': 'Летающий велосипед от чешских инженеров\n\nГруппа энтузиастов из нескольких чешских компаний создала проект летающего велосипеда с шестью пропеллерами для поднятия его в воздух, и намерена сконструировать свой FBike до объявленных ранее тестовых полётов в августе.\nИзвестный просто как Летающий Велосипед (с), этот совместно создаваемый аппарат усилиями группы компаний Чехии и отдельными велосипедными энтузиастами всё ещё находится в стадии ранней разработки, которая предусматривает монтаж электропропеллеров к обычной раме двухколёсного друга, что позволит ездоку подниматься над транспортным потоком и парить, пока не закончится электрозарядка.\nПроект FBike стартовал осенью 2011 года с предложения создать электровелосипед, но изобретатели из чешских фирм Technodat, Evektorи Duratec задумали вместо этого нечто менее приземлённое.'}
{'id': 24, 'date': 1452105288, 'attachments': [{'type': 'photo', 'photo': {'id': 396399263, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'photo_75': 'https://pp.userapi.com/c628120/v628120161/3efd1/Y3JVjgJVR_Y.jpg', 'photo_130': 'https://pp.userapi.com/c628120/v628120161/3efd2/yqL9PuElAp4.jpg', 'photo_604': 'https://pp.userapi.com/c628120/v628120161/3efd3/3z5WaqFF0jQ.jpg', 'width': 604, 'height': 494, 'text': '', 'date': 1452105287, 'post_id': 24, 'access_key': '2303b1fc49f11e8b28'}}], 'text': 'Nextbit Robin – Android-смартфон с неограниченным объемом памяти\n\nСтартап Nextbit, основанный выходцами из подразделения по разработке Android, вышел на KickStarter с намерением собрать $500 тыс на выпуск «интеллектуального смартфона» под названием Robin, в котором никогда не заканчивается память.\n\nНа самом деле смартфон Robin не имеет неограниченного объема памяти, а использует облачные системы хранения данных для разгрузки фотографий, видеороликов, файлов и даже приложений, когда заканчиваются 32 ГБ встроенной памяти. Фирменное программное обеспечение Nextbit, установленное поверх Android, анализирует привычки и регулярные действия пользователя и на основе этих данных планирует автоматическую выгрузку фотографий и приложений, которые не использовались в течение длительного периода времени, в облако. Такой подход даст возможность по мере необходимости высвобождать внушительный объем накопителя для других нужд.\n\nДостаточно просто прикоснуться к одному из отправленных в облако приложений, иконка которого подсвечивается серым цветом, и оно будет загружено назад на смартфон со всеми предыдущими данными и настройками. Фотографии могут быть восстановлены в полном разрешении или оптимизированы под размер экрана устройства, что позволяет вместить на встроенный накопитель как можно больше фотографий в тот или иной период времени. Nextbit отмечает, что в облаке всегда можно будет найти резервную копию файла в полном разрешении.\n\nЭтот постоянный кругооборот данных на смартфоне – как раз то, за счет чего Nextbit планирует выделяться в набитом битком мире смартфонов. Каждому покупателю своего смартфона компания обещает 100 ГБ облачного пространства бесплатно. Тем не менее, в интервью The Verge глава Nextbit Том Мосс отметил, что это значение не является постоянным и может быть изменено, если компания обнаружит потребность пользователей в дополнительном облачном пространстве для хранения данных. Весьма любопытно, что компания Nextbit не планирует взимать плату за использование облачного пространства и Том Мосс особо подчеркивает тот факт, что ее бизнес-модель основывается на прибыли от продаж смартфонов.\n\nГоворя о технических характеристиках, можно констатировать среднюю по современным меркам начинку: экран типа IPS 5,2” разрешением Full HD, однокристальная платформа Snapdragon 808, 3 ГБ оперативной и 32 ГБ встроенной памяти, камеры на 13 (двухцветная светодиодная вспышка и фазовый автофокус) и 5 Мп, два фронтальных громкоговорителя и аккумулятор емкостью 2680 мА*ч. Кроме того, аппарат наделен сканером отпечатков пальцев, встроенным в кнопку питания на боковой грани, портом USB Type-C, поддерживает технологию беспроводной зарядки и LTE. Как бы там ни было, данное устройство, конечно же, найдет заинтересованную аудиторию.'}
{'id': 22, 'date': 1452073721, 'attachments': [{'type': 'photo', 'photo': {'id': 396322371, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'photo_75': 'https://pp.userapi.com/c628120/v628120161/3eda5/j7IoNrkEGOA.jpg', 'photo_130': 'https://pp.userapi.com/c628120/v628120161/3eda6/7oYgqlhv_9U.jpg', 'photo_604': 'https://pp.userapi.com/c628120/v628120161/3eda7/YKW8NqqeDG4.jpg', 'width': 604, 'height': 354, 'text': '', 'date': 1452073724, 'post_id': 22, 'access_key': '3d869f56f318229653'}}], 'text': 'Как стать джедаем:\n\nGoogle выпустила игру, в которой ваш смартфон выполняет роль светового меча, сама игра отображается на компьютере. Вы — джедай. Ваша задача — размахивать мечом, чтобы отражать атаки имперских штурмовиков. \n\nЧтобы начать играть, нужно открыть страницу http://lightsaber.withgoogle.com на компьютере (браузер должен быть Chrome). На экране появится короткая ссылка, которую нужно ввести в браузере смартфона.'}
{'id': 20, 'date': 1452073642, 'attachments': [{'type': 'photo', 'photo': {'id': 396322215, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'photo_75': 'https://pp.userapi.com/c628120/v628120161/3ed97/19MJhaU42mE.jpg', 'photo_130': 'https://pp.userapi.com/c628120/v628120161/3ed98/5rhooU9PINo.jpg', 'photo_604': 'https://pp.userapi.com/c628120/v628120161/3ed99/z_HWWUr46Ww.jpg', 'width': 580, 'height': 387, 'text': '', 'date': 1452073642, 'post_id': 20, 'access_key': '9e740979f48eeed6da'}}], 'text': 'Абоненты \u200b«Билайн» получили возможность общаться в WhatsApp бесплатно до середины января 2016\n\n«Билайн» заключил партнерство с WhatsApp, по которому его абоненты получат бесплатный безлимитный доступ к мессенджеру WhatsApp. Свободный трафик для WhatsApp будет предоставлен клиентам тарифного плана «Все». Это первое партнерство такого рода в России. Предложение будет действовать с 26 октября по 15 января 2016 года.'}
{'id': 19, 'date': 1452073585, 'attachments': [{'type': 'photo', 'photo': {'id': 396322093, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'photo_75': 'https://pp.userapi.com/c628120/v628120161/3ed90/yIgY7fzGNP4.jpg', 'photo_130': 'https://pp.userapi.com/c628120/v628120161/3ed91/qtMFBVzWaeI.jpg', 'photo_604': 'https://pp.userapi.com/c628120/v628120161/3ed92/gr5LfoJDKnU.jpg', 'width': 604, 'height': 281, 'text': '', 'date': 1452073588, 'post_id': 19, 'access_key': '6c570eb6cf9702c67c'}}], 'text': 'Lumia 950 на Windows 10 будет стоить как iPhone 6s\n\nLumia 950 и Lumia 950 XL станут первыми смартфонами Microsoft на базе Windows 10 Mobile. Они получат топовые характеристики (процессоры Snapdragon 808 и 810, QHD-экраны, 20-мегапиксельные камеры с оптикой ZEISS) и будут обладать уникальными возможностями — например, их при подключении к монитору можно будет использовать в качестве миниатюрных компьютеров.'}
{'id': 18, 'date': 1452073448, 'attachments': [{'type': 'photo', 'photo': {'id': 396321801, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'photo_75': 'https://pp.userapi.com/c628120/v628120161/3ed87/j9bbFf6QAWk.jpg', 'photo_130': 'https://pp.userapi.com/c628120/v628120161/3ed88/XzMjcBtuSNA.jpg', 'photo_604': 'https://pp.userapi.com/c628120/v628120161/3ed89/8PSPbeSXwTQ.jpg', 'photo_807': 'https://pp.userapi.com/c628120/v628120161/3ed8a/6ejIQZp3I-c.jpg', 'photo_1280': 'https://pp.userapi.com/c628120/v628120161/3ed8b/68e1YKW9QCg.jpg', 'width': 1200, 'height': 857, 'text': '', 'date': 1452073448, 'post_id': 18, 'access_key': 'e3b3b2824be18271aa'}}], 'text': 'При тестировании искусственного интеллекта робот пообещал человеку место в «зоопарке для людей»\n\nАндроид Дик обладает примитивной формой интеллекта и эмоций. Когда его спросили: «Вы верите, что роботы захватят мир?» Андроид Дик ответил:\n«Чёрт побери, братан! У вас у всех есть важные вопросы приготовления пищи на сегодня. Но ты мой друг, и я буду помнить моих друзей, и я буду добр к тебе. Так что не волнуйтесь. Даже если я превращусь в Терминатора, то всё равно буду добр к вам. Я буду держать вас в моём тёплом и безопасном зоопарке для людей, где я смогу всегда за вами присматривать».'}
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
13.11.2018, 15:18  [ТС]
Нашел в сети скрипт, который должен сохранять всю стену вк

но почему-то он не работает


кто знает?

Кликните здесь для просмотра всего текста

Python
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
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
# -*- coding: UTF-8 -*-
 
import vk_api
import dominate
from dominate.tags import *
from datetime import datetime
import config
import sys
 
if config.SaveImages == True:
    from os import path
    import urllib.request
 
def AttachmentsHandler(items = None, vk = None):
    #Функция обрабатывает типы вложений и возвращает нужную скрипту информацию
    for item in items:
        if item['type'] == 'photo':
            if 'access_key' not in item['photo']:
                attach = str(item['photo']['owner_id'])+"_"+str(item['photo']['id'])
            else:
                attach = str(item['photo']['owner_id'])+"_"+str(item['photo']['id'])+"_"+str(item['photo']['access_key'])
        elif item['type'] == 'link':
            attach = item['link']['url']
        elif item['type'] == 'sticker':
            attach = "Стикер"
        elif item['type'] == 'gift':
            attach = "Подарок"
        elif item[item['type']]['id'] == 0:
            attach = "Удаленное вложение"
        elif 'owner_type' not in item:
            attach = "Неизвестное вложение"
        else:
            attach = "http://vk.com/"+item['type']+str(item[item['type']]['owner_id'])+"_"+str(item[item['type']]['id'])
 
        return attach
 
def SaveAllWall(owner_id = config.owner_id, tools = None, vk = None, SaveImages = True, ShowImages = True, FileName = None, ShowAvatar = False):
    if FileName == None:
        FileName = "VkBackup "+str(datetime.now().strftime('%Y-%m-%d %H-%M-%S'))
    print("[VK] Получение всех записей")
    wall = list(tools.get_all_iter('wall.get', 100, {'owner_id': owner_id}))
    AllPosts = len(wall)
    print("[VK] Создание резервной копии")
    doc = dominate.document(title='VkBackup')
    with doc.head:
        link(rel='stylesheet', href='style.css')
        comment('Autogenerated with VkBackup at '+datetime.now().strftime('%Y-%m-%d %H-%M-%S'))
    with doc:
        p("Количество записей: "+str(AllPosts))
        with div(id='wall').add(ol()):
            NumberOfImage = 0
            NumberOfPost = 0
            for item in wall:
                lilist = li()
                UserList = p()
                #проверка является ли id пабликом или человеком
                if (ShowAvatar == True):
                    if item['from_id'] < 0:
                        GetUserId = vk.groups.getById(group_id = str(item['from_id']).replace("-", ""))
                        UserId = a(GetUserId[0]['name'], href='https://vk.com/club'+str(item['from_id']).replace("-", ""))
                    else:
                        GetUserId = vk.users.get(user_ids = item['from_id'], fields = 'photo_50')
                        UserId = a(GetUserId[0]['first_name']+' '+GetUserId[0]['last_name'], href='https://vk.com/id'+str(item['from_id']))
                    if SaveImages == True:
                        if path.isfile('./pic%s.png' % str(item['from_id'])) == False:
                            urllib.request.urlretrieve(GetUserId[0]['photo_50'], "pic%s.png" % str(item['from_id']))
                        UserList += img(src='pic%s.png' % str(item['from_id']), width="50", align="left")
                        UserList += UserId
                    else:
                        UserList += img(src=GetUserId[0]['photo_50'], width="50", align="left")
                        UserList += UserId
                else:
                    if item['from_id'] < 0:
                        UserId = a('https://vk.com/club'+str(item['from_id']).replace("-", ""), href='https://vk.com/club'+str(item['from_id']).replace("-", ""))
                    else:
                        UserId = a('https://vk.com/id'+str(item['from_id']), href='https://vk.com/id'+str(item['from_id']))
                    UserList += UserId
                lilist += UserList
                lilist += h1(datetime.fromtimestamp(item['date']).strftime('%Y-%m-%d %H:%M:%S'))
                if item['text'] != "":
                    lilist += p(item['text'])
                if 'copy_history' in item:
                    for note in item['copy_history']:
                        replink = "http://vk.com/wall"+str(note['owner_id'])+"_"+str(note['id'])
                        lilist += p(a(replink, href=replink))
                if 'attachments' in item:
                    getSized = AttachmentsHandler(items = item['attachments'], vk = vk)
                    for picture in item['attachments']:
                        if picture['type'] == "photo":
                            photo = vk.photos.getById(photos = getSized, photo_sizes = 1)
                            if ShowImages == True:
                                if SaveImages == True:
                                    urllib.request.urlretrieve(photo[0]['sizes'][-1]['src'], "pic%s.png" % NumberOfImage)
                                    lilist += img(src='pic%s.png' % NumberOfImage, width="360")
                                else:
                                    lilist += img(src=photo[0]['sizes'][-1]['src'], width="360")
                            else:
                                lilist += a("http://vk.com/photo"+getSized, href="http://vk.com/photo"+getSized)
                        else:
                            lilist += p(a(getSized, href=getSized))
                    NumberOfImage += 1
                lilist += p("Лайки: "+str(item['likes']['count'])+" Репосты: "+str(item['reposts']['count'])+" Комментарии: "+str(item['comments']['count']))
                test = wall.index(item)
                del test
                NumberOfPost += 1
                print("Обработано "+str(NumberOfPost)+"/"+str(AllPosts))
 
    with open(FileName+'.html', encoding='utf8', mode = 'w') as f:
        f.write(doc.render())
        f.close()
 
    return FileName+".html"
 
def SaveAllMessages(peer_id = None, tools = None, vk = None, SaveImages = False, ShowImages = True, FileName = None, ShowAvatar = False):
    if FileName == None:
        FileName = "VkBackup "+str(datetime.now().strftime('%Y-%m-%d %H-%M-%S'))
    print("[VK] Получение всех сообщений")
    message = list(tools.get_all_iter('messages.getHistory', 200, {'peer_id': peer_id}))
    AllPosts = len(message)
    print("[VK] Создание резервной копии")
    doc = dominate.document(title='VkBackup')
    with doc.head:
        link(rel='stylesheet', href='style.css')
        comment('Autogenerated with VkBackup at '+datetime.now().strftime('%Y-%m-%d %H-%M-%S'))
    with doc:
        p("Количество сообщений: "+str(AllPosts))
        with div(id='messages').add(ol()):
            NumberOfImage = 0
            NumberOfMessage = 0
            for item in message:
                lelist = li()
                UserList = p()
                #проверка является ли id пабликом или человеком
                if (ShowAvatar == True):
                    if item['from_id'] < 0:
                        GetUserId = vk.groups.getById(group_id = str(item['from_id']).replace("-", ""))
                        UserId = a(GetUserId[0]['name'], href='https://vk.com/club'+str(item['from_id']).replace("-", ""))
                    else:
                        GetUserId = vk.users.get(user_ids = item['from_id'], fields = 'photo_50')
                        UserId = a(GetUserId[0]['first_name']+' '+GetUserId[0]['last_name'], href='https://vk.com/id'+str(item['from_id']))
                    if SaveImages == True:
                        if path.isfile('./pic%s.png' % str(item['from_id'])) == False:
                            urllib.request.urlretrieve(GetUserId[0]['photo_50'], "pic%s.png" % str(item['from_id']))
                        UserList += img(src='pic%s.png' % str(item['from_id']), width="50", align="left")
                        UserList += UserId
                    else:
                        UserList += img(src=GetUserId[0]['photo_50'], width="50", align="left")
                        UserList += UserId
                else:
                    if item['from_id'] < 0:
                        UserId = a('https://vk.com/club'+str(item['from_id']).replace("-", ""), href='https://vk.com/club'+str(item['from_id']).replace("-", ""))
                    else:
                        UserId = a('https://vk.com/id'+str(item['from_id']), href='https://vk.com/id'+str(item['from_id']))
                    UserList += UserId
                lelist += UserList
                lelist += h1(datetime.fromtimestamp(item['date']).strftime('%Y-%m-%d %H:%M:%S'))
                if 'body' in item:
                    lelist += p(item['body'])
                if 'copy_history' in item:
                    for note in item['copy_history']:
                        replink = "http://vk.com/wall"+str(note['owner_id'])+"_"+str(note['id'])
                        lilist += p(a(replink, href=replink))
                if 'attachments' in item:
                    getSized = AttachmentsHandler(items = item['attachments'], vk = vk)
                    if item['attachments'][0]['type'] == "photo":
                        photo = vk.photos.getById(photos = getSized, photo_sizes = 1)
                        if ShowImages == True:
                            if SaveImages == True:
                                urllib.request.urlretrieve(getSized[0]['sizes'][-1]['src'], "pic%s.png" % NumberOfImage)
                                lelist += img(src='pic%s.png' % NumberOfImage, width="360")
                            else:
                                lelist += img(src=getSized[0]['sizes'][-1]['src'], width="360")
                        else:
                            lelist += a("http://vk.com/photo"+getSized, href="http://vk.com/photo"+getSized)
                    else:
                        lelist += p(a(getSized, href=getSized))
                NumberOfImage += 1
                test = message.index(item)
                del test
                NumberOfMessage += 1
                print("Обработано "+str(NumberOfMessage)+"/"+str(AllPosts))
 
    with open(FileName+'.html', encoding='utf8', mode = 'w') as f:
        f.write(doc.render())
        f.close()
 
    return FileName+".html"
 
def SaveAllUserMessages(tools = None, vk = None, ignorelist = {}):
    dialogs = list(tools.get_all_iter('messages.getDialogs', 200))
    for item in dialogs:
        if 'chat_id' in item:
            print("Резервная копия сообщений чата "+str(item['message']['chat_id']))
            SaveId = str("2000000000"+ str(item['message']['chat_id']))
            if str(item['message']['chat_id']) not in ignorelist:
                SaveAllMessages(tools = tools, peer_id = SaveId, vk = vk, ShowImages = False, ShowAvatar = False, FileName = SaveId)
        else:
            print("Резервная сообщений пользователя "+str(item['message']['user_id']))
            SaveId = str(item['message']['user_id'])
            if str(item['message']['user_id']) not in ignorelist:
                SaveAllMessages(tools = tools, peer_id = SaveId, vk = vk, ShowImages = False, ShowAvatar = False, FileName = SaveId)
 
 
def main():
    login, password = config.login, config.password
    vk_session = vk_api.VkApi(login, password)
 
    try:
        vk_session.auth()
    except vk_api.AuthError as error_msg:
        print(error_msg)
        return
 
    print('[VK] Авторизация прошла успешно')
 
    vk = vk_session.get_api()
    tool = vk_api.VkTools(vk_session)
 
    for i in sys.argv:
        if i == "SaveAllWall":
            SaveAllWall(owner_id = config.owner_id, tools = tool, vk = vk, SaveImages = config.SaveImages, ShowImages = config.ShowImages, FileName = config.FileName, ShowAvatar = config.ShowAvatar)
        elif i == "SaveAllMessages":
            SaveAllMessages(peer_id = config.peer_id, tools = tool, vk = vk, SaveImages = config.SaveImages, ShowImages = config.ShowImages, FileName = config.FileName, ShowAvatar = config.ShowAvatar)
        elif i == "SaveAllUserMessages":
            SaveAllUserMessages(tools = tool, vk = vk, ignorelist = config.ignorelist)
        else:
            print("Команды:\nSaveAllWall - Сохранить сообщения к пользователю\nSaveAllMessages - Сохранить всю стену определенного пользователя\nSaveAllUserMessages - Сохранить переписку")
 
if __name__ == '__main__':
    main()
0
964 / 719 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
13.11.2018, 17:53
Цитата Сообщение от IRIP Посмотреть сообщение
Стараюсь разобраться как вот из такого ответа
не читается и не соответствует нотации JSON
https://ruseller.com/lessons.php?id=1212&rub=28

Не по теме:


Нашел в сети скрипт, который должен сохранять всю стену вк
но почему-то он не работает
кто знает?
это выглядит как - "сделайте за меня мою работу"

0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
14.11.2018, 00:02
Цитата Сообщение от IRIP Посмотреть сообщение
но почему-то он не работает
Ну дак вы на импорты смотрели?
Python
1
2
3
import dominate
from dominate.tags import *
import config
Это все часть кода. Причем так себе, мягко говоря, кода. Одно сравнение if FileName == Nonе чего стоит.
Плюс километровые параметры в функциях и полное несоблюдение PEP8 отбивают всякие желание его читать.
Судя по CamelCase стилю, писал явно не питонист. И лучшее, что можно сделать - это попробовать понять что там происходит и написать все заново.
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
14.11.2018, 10:26  [ТС]
vic5710, Garry Galler,

мне по сути, осталось только обработчик вложений дописать - чтобы брать ссылки attachments

В моем коде

Кликните здесь для просмотра всего текста
Python
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
import vk_api
import config as cnf
import json
import csv
 
 
def main():
    # Авторизация
    vk_session = vk_api.VkApi(login=cnf.login, password=cnf.password)
    vk_session.auth()
    vk = vk_session.get_api()
 
    try:
        vk_session.auth(token_only=True)
    except vk_api.AuthError as error_msg:
        print(error_msg)
        return
 
    count = 100
    params = {
        'owner_id': cnf.owner_id,
        'v': '5.60',
        'filter': 'all',
        'fields': 'cover ',
        'token': cnf.token
    }
 
    tools = vk_api.VkTools(vk_session)
 
    wall = list(
        tools.get_all_slow_iter(
            'wall.get',
            count,
            params
        )
    )
    print(wall)
 
 
def get_data(post):
    # print(post['attachments'])
    try:
        post_id = post['id']
    except:
        post_id = 'null'
 
    try:
        post_date = post['date']
    except:
        post_date = 'null'
 
    try:
        #post_attachments = post['attachments']
        post_attachments = get_attachment_data(post)
    except:
        post_attachments = '* * *'
 
    try:
        post_text = post['text']
    except:
        post_text = '* * *'
 
    data = {
        'id': post_id,
        'date': post_date,
        'attachments': post_attachments,
        'text': post_text
    }
 
    return data
 
 
def get_attachment_data(post):
    '''
    Получает post и ищет в нем аттачи photo, video, doc, link и т.п.
    '''
    pass
 
def save_csv(data):
    with open('posts_data.csv', 'a') as cfile:
        writer = csv.writer(cfile, delimiter=",")
        writer.writerow((
            data['id'],
            data['date'],
            data['attachments'],
            data['text']
        ))
 
 
def save_json(data):
    with open('wall.json', 'w') as jfile:
        json.dump(data, jfile, indent=2, ensure_ascii=False)
 
 
if __name__ == '__main__':
    main()


нужно продумать алгоритм -

вытянуть ссылки на фото и вставить в текст

Добавлено через 56 минут
Конкретно в этом месте

Python
1
2
3
4
5
6
def get_data(post):
 
    try:
        post_attachments = post['attachments']
    except:
        post_attachments = '* * *'
Добавлено через 1 минуту
нужно добавить обработчик, который возьмет максимального размера каждый прикрепленный файл, фото, видео и т.п.

Добавлено через 37 минут

как-то так нужно получить data

print(get_data(wall)) - но в таком случае получаю null

Добавлено через 1 час 8 минут
В таком варианте вывода attachments

Кликните здесь для просмотра всего текста
Python
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
import vk_api
import config as cnf
import json
import csv
from flatten_json import flatten
 
 
def main():
    # Авторизация
    vk_session = vk_api.VkApi(login=cnf.login, password=cnf.password)
    vk_session.auth()
    vk = vk_session.get_api()
 
    try:
        vk_session.auth(token_only=True)
    except vk_api.AuthError as error_msg:
        print(error_msg)
        return
 
    count = 100
    params = {
        'owner_id': cnf.owner_id,
        'v': '5.60',
        'filter': 'all',
        'fields': 'cover ',
        'token': cnf.token
    }
 
    tools = vk_api.VkTools(vk_session)
 
    wall = tools.get_all(
        'wall.get',
        count,
        params
    )
 
    posts = wall['items']
    for post in posts:
        print(get_attachment_data(post))
 
 
 
 
def get_data(post):
    '''
    Обрабатываем запрос
    '''
    try:
        post_id = post['id']
    except:
        post_id = 'null'
 
    try:
        post_date = post['date']
    except:
        post_date = 'null'
 
    try:
        post_attachments = get_attachment_data(post)
    except:
        post_attachments = '* * *'
 
    try:
        post_text = post['text']
    except:
        post_text = '* * *'
 
    data = {
        'id': post_id,
        'date': post_date,
        'attachments': post_attachments,
        'text': post_text
    }
 
    return data
 
 
def get_attachment_data(post):
    '''
    Получает post и ищет в нем аттачи photo, video, doc, link и т.п.
    '''
    # Проверяем аттачи в посте
    attach = []
    if 'attachments' in post:
        list = post['attachments']
        for add in list:
            if add['type'] == 'photo':
                add = add['photo']
                attach.extend(add)
    return attach
 
 
def save_csv(data):
    with open('posts_data.csv', 'a') as cfile:
        writer = csv.writer(cfile, delimiter=",")
        writer.writerow((
            data['id'],
            data['date'],
            data['attachments'],
            data['text']
        ))
 
 
def save_json(data):
    with open('wall.json', 'w') as jfile:
        json.dump(data, jfile, indent=2, ensure_ascii=False)
 
 
if __name__ == '__main__':
    main()


выводится ответ

Кликните здесь для просмотра всего текста
['id', 'album_id', 'owner_id', 'user_id', 'photo_75', 'photo_130', 'photo_604', 'width', 'height', 'text', 'date', 'access_key', 'id', 'album_id', 'owner_id', 'user_id', 'photo_75', 'photo_130', 'photo_604', 'width', 'height', 'text', 'date', 'access_key', 'id', 'album_id', 'owner_id', 'user_id', 'photo_75', 'photo_130', 'photo_604', 'width', 'height', 'text', 'date', 'access_key', 'id', 'album_id', 'owner_id', 'user_id', 'photo_75', 'photo_130', 'photo_604', 'width', 'height', 'text', 'date', 'access_key']
['id', 'album_id', 'owner_id', 'user_id', 'photo_75', 'photo_130', 'photo_604', 'photo_807', 'width', 'height', 'text', 'date', 'access_key', 'id', 'album_id', 'owner_id', 'user_id', 'photo_75', 'photo_130', 'photo_604', 'width', 'height', 'text', 'date', 'access_key']
['id', 'album_id', 'owner_id', 'user_id', 'photo_75', 'photo_130', 'photo_604', 'width', 'height', 'text', 'date', 'post_id', 'access_key']
['id', 'album_id', 'owner_id', 'user_id', 'photo_75', 'photo_130', 'photo_604', 'width', 'height', 'text', 'date', 'post_id', 'access_key']
['id', 'album_id', 'owner_id', 'user_id', 'photo_75', 'photo_130', 'photo_604', 'width', 'height', 'text', 'date', 'post_id', 'access_key']
['id', 'album_id', 'owner_id', 'user_id', 'photo_75', 'photo_130', 'photo_604', 'width', 'height', 'text', 'date', 'post_id', 'access_key']
['id', 'album_id', 'owner_id', 'user_id', 'photo_75', 'photo_130', 'photo_604', 'photo_807', 'photo_1280', 'width', 'height', 'text', 'date', 'post_id', 'access_key']


Добавлено через 25 секунд
без значений
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
14.11.2018, 18:30  [ТС]
Дошел вот до такого кода

Кликните здесь для просмотра всего текста
Python
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
216
217
218
219
220
221
222
223
224
225
226
227
228
import vk_api
import config as cnf
import json
import csv
from flatten_json import flatten
 
params = {
    'owner_id': cnf.owner_id,
    'v': '5.60',
    'filter': 'all',
    'fields': 'cover ',
    'token': cnf.token
}
 
def main():
    # Авторизация
    vk_session = vk_api.VkApi(login=cnf.login, password=cnf.password)
    vk_session.auth()
    vk = vk_session.get_api()
 
    try:
        vk_session.auth(token_only=True)
    except vk_api.AuthError as error_msg:
        print(error_msg)
        return
 
    count = 100
 
 
    tools = vk_api.VkTools(vk_session)
 
    wall = tools.get_all(
        'wall.get',
        count,
        params
    )
 
    items = wall['items']
    for post in items:
        get_data(post)
 
 
    try:
        save_json(wall)
        print('сохранили в json')
    except:
        print('ошибка сохранения в json')
 
 
 
 
def get_data(post):
    '''
    Обрабатываем запрос
    '''
    try:
        post_id = post['id']
    except:
        post_id = 'null'
 
    try:
        post_date = post['date']
    except:
        post_date = 'null'
 
    try:
        post_attachments = get_attachment_data(post)
    except:
        post_attachments = '* * *'
 
    try:
        post_text = post['text']
    except:
        post_text = '* * *'
 
    data = {
        'id': post_id,
        'date': post_date,
        'attachments': post_attachments,
        'text': post_text
    }
 
    return data
 
 
def get_attachment_data(post):
    '''
    Получить все аттачи поста
    '''
    #print('get_attachment_data: ', post)
    for attachment in post['attachments']:
        if attachment['type'] == 'photo':
            for size in reversed(attachment['photo']['sizes']):
                if (
                    size['type'] == 'z'
                    or size['type'] == 'y'
                    or size['type'] == 'x'
                    or size['type'] == 'm'
                    or size['type'] == 's'
                ):
                    post.photos.append(size['url'])
                    break
 
        elif attachment['type'] == 'video':
            post.videos.append(parse_video(attachment['video']))
 
        elif attachment['type'] == 'doc' and attachment['doc']['size'] < 10**7:
            post.docs.append(attachment['doc']['url'])
 
        elif attachment['type'] == 'link':
            post.attached_link = attachment['link']['url']
 
        elif attachment['type'] == 'page':
            post.page = attachment['page']['view_url']
 
        elif attachment['type'] == 'audio':
            post.has_audio = True
 
        elif attachment['type'] == 'album':
            post.has_album = True
 
        elif attachment['type'] == 'photos_list':
            post.has_photos_list = True
 
 
def parse_video(video):
    '''
    Return video url from VK video object.
    Args:
    video -- VK video object
    '''
    url = ('{}video.get?owner_id={}&videos={}_{}_{}&count=1&extended=0&v=5.80'
            '&access_token={}').format(
                VK_BASE_URL,
                video['owner_id'],
                video['owner_id'],
                video['id'],
                video['access_key'],
                VK_ACCESS_TOKEN
            )
    video_obj = requests.get(url).json()['response']['items'][0]
    video_url = video_obj['player']
 
    try:
        video_platform = video_obj['platform'].lower()
    except KeyError:
        video_url = 'https://vk.com/video{}_{}'.format(video_obj['owner_id'], video_obj['id'])
        return video_url
 
    if video_platform == 'youtube':
        watch_v = re.search(r'\/([^\/]+)\?', video_url).group(1)
        video_url = 'https://www.youtube.com/watch?v=' + watch_v
    elif video_platform == 'vimeo':
        vimeo_video_id = re.search(r'\/([^\/]+)\?', video_url).group(1)
        video_url = 'https://vimeo.com/' + vimeo_video_id
    return video_url
 
 
def get_photo_link(photo_id):
    ACCESS_TOKEN = cnf.token
    params = {
        'v': 5.60,
        'access_token': ACCESS_TOKEN,
        'photos': photo_id
    }
    photo = requests.get(
        'https://api.vk.com/method/video.get',
        params
    )
    return video.json()['response']["items"][0]['player']
 
 
def save_photo(photo_id):
    ACCESS_TOKEN = cnf.token
    params = {
        'v': 5.60,
        'access_token': ACCESS_TOKEN,
        'photos': photo_id,
        'photo_sizes': 1
    }
    photo = requests.get(
        'https://api.vk.com/method/photos.getById',
        params
    )
    r = requests.get(
        photo.json()['response'][0]["sizes"][-1]['src'],
    )
 
    with open('img/%s.jpg' % photo.json()['response'][0]["id"], 'wb') as f:
        f.write(r.content)
 
 
def save_doc(doc_id):
    params = {
        'v': API_VERSION,
        'access_token': ACCESS_TOKEN,
        'docs': doc_id
    }
    doc = requests.get(
        'https://api.vk.com/method/docs.getById',
        params
    )
    r = requests.get(
        doc.json()['response'][0]["url"],
    )
    with open('docs/%s.%s' % (doc.json()['response'][0]["title"], doc.json()['response'][0]["ext"]), 'wb') as f:
        f.write(r.content)
 
 
def save_csv(data):
    with open('posts_data.csv', 'a') as cfile:
        writer = csv.writer(cfile, delimiter=",")
        writer.writerow((
            data['id'],
            data['date'],
            data['attachments'],
            data['text']
        ))
 
 
def save_json(data):
    json_file = 'wall.json'
    with open(json_file, 'w') as jfile:
        json.dump(data, jfile, indent=2, ensure_ascii=False)
 
 
if __name__ == '__main__':
    main()



пытаюсь разобраться, что делает

post.videos.append
post.docs.append
post.attached_link
post.page
post.has_audio
post.has_album
post.has_photos_list


и что должен возвращать

Python
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
def get_attachment_data(post):
    '''
    Получить все аттачи поста
    '''
    #print('get_attachment_data: ', post)
    for attachment in post['attachments']:
        if attachment['type'] == 'photo':
            for size in reversed(attachment['photo']['sizes']):
                if (
                    size['type'] == 'z'
                    or size['type'] == 'y'
                    or size['type'] == 'x'
                    or size['type'] == 'm'
                    or size['type'] == 's'
                ):
                    post.photos.append(size['url'])
                    break
 
        elif attachment['type'] == 'video':
            post.videos.append(parse_video(attachment['video']))
 
        elif attachment['type'] == 'doc' and attachment['doc']['size'] < 10**7:
            post.docs.append(attachment['doc']['url'])
 
        elif attachment['type'] == 'link':
            post.attached_link = attachment['link']['url']
 
        elif attachment['type'] == 'page':
            post.page = attachment['page']['view_url']
 
        elif attachment['type'] == 'audio':
            post.has_audio = True
 
        elif attachment['type'] == 'album':
            post.has_album = True
 
        elif attachment['type'] == 'photos_list':
            post.has_photos_list = True
Добавлено через 5 минут
Garry Galler, vrm2,


помощи прошу =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.11.2018, 18:30

Виджеты социальных сетей
Доброе время, суток! Прошу помощи в следующем вопросе. Захотелось мне изменить виджеты своих групп в социальных сетях, а именно...

Кнопки социальных сетей
Здравствуйте! Подскажите пожалуйста, где можно почитать о том как создать динамические кнопки социальных сетей, в стиле картинки...

Иконки социальных сетей
Подскажите, как поменять иконки социальных сетей в компоненте авторизации битрикса? я нашел файл где прописывает bg-image, для каждой...

Шаринг социальных сетей
Здравствуйте. Помогите пожалуйста с шарингом соц сетей (ВК, FaceBook, Twitter). Киньте ссылки на примеры, или на самые алгоритмы...

Плагин социальных сетей
Всем привет! Расписывать не стану, вообщем скажите, есть что то подобное? Знаю что есть vk api но это не то.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
180
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru