Как сгенерировать несколько токенов vk api python
Перейти к содержимому

Как сгенерировать несколько токенов vk api python

  • автор:

Сбор данных с помощью API Вконтакте

Давайте поговорим о том, как используя API, вы можете получить и отсортировать данные всего несколькими командами. В продолжение темы сбора данных из социальной сети Вконтакте, хотим поделиться своим опытом по поиску пользователей и их друзей.

Так вот, сделав несколько пробных выборок для анализа, мы поняли, что поиск по фамилии и имени дает слишком ненадежные результаты, т.к. даты рождения многих пользователей скрыты, и даже выгрузив все совпадения по ФИ, вы все равно не сможете потом идентифицировать нужные данные.

Важно: мы заметили, что при поиске по ФИ + ДР Вконтакте выдаст подходящих пользователей, даже если их дата рождения скрыта. Это можно было использовать, только нужно обеспечить связь с данными поискового запроса. Для работы с API VK мы решили использовать Python с библиотекой vk_api (установка: pip install vk_api). Итого нам потребуются 2 библиотеки:

import pandas as pd import vk_api

Далее – импорт входных данных в формате ID, Имя, Фамилия, Отчество (можно оставить пустым, так как Вконтакте отчество отсутствует), День рождения, Месяц рождения, Год рождения. Пример: (0,Пет, Петрови, ,1,1,1950)

data = pd.read_csv(‘in.txt’, encoding = ‘cp1251’)

Затем авторизация и получение токена VK:

vk_session = vk_api.VkApi(‘+79XXXXXXXXXX’, ‘password’) vk_session.auth() vk = vk_session.get_api()

После этого мы можем начинать выполнять запросы к API.

Разберем для примера использование метода users.search и сохранение полученных результатов. Основные параметры это q – строка поискового запроса, так же для поиска нам понадобятся birth_day, birth_month, birth_year, count – количество результатов (поставим максимум – 1000), fields – список дополнительных полей, в примере укажем ‘bdate, city’. Результат будет возвращен в виде словаря Python. Разберем подробно:

t=<> #создаем словарь для хранения данных, получаемых от API VK for j in range(0, len(data)): #запускаем поиск по массиву #Далее следует обращение к API с нашими параметрами: t[j]=vk.users.search(q = data[‘N’][j] + ‘ ‘ + data[‘F’][j], birth_day = data[‘D’][j], \ birth_month = data[‘M’][j], birth_year = data[‘Y’][j], count = 1000, fields=’bdate, city’) for h in (t[j][‘items’]): #Сохраняем результаты поиска в файл»users.txt» with open(‘users.txt’,’a’) as f1: f1.write((str(data[‘id’][j]) + ‘;’ #ID исходный + str(t[j][‘count’]) + ‘;’ #Количество найденных пользователей + str(h[‘id’]) + ‘;’ #ID пользователя VK + h[‘last_name’] + ‘;’ #Фамилия + h[‘first_name’] + ‘;’ #Имя + h.get(‘bdate’,») + ‘;’ #Дата рождения + h.get(‘city’,<>).get(‘title’,») #У города несколько параметров — нам нужно название: title + ‘;\n’).encode(‘cp1251’, ‘replace’).decode(‘cp1251’))#Для удаления нестандартных символов, которые могут вызывать ошибки

Далее мы можем в этом же цикле осуществить поиск и сохранение ID друзей пользователя, за это отвечает метод friends.get. Если друзей нет (или скрыты), метод вернет ошибку, поэтому используем try/except:

try: m=vk.friends.get(user_id = str(h[‘id’]), count = 50000) for q in m[‘items’]: #Сохраняем ID друзей в файл «friends.txt» with open(‘friends.txt’,’a’) as f2: f2.write(str(data[‘id’][j]) + ‘;’ + str(h[‘id’]) + ‘;’ + str(q) + ‘;\n’) except: #Если друзей нет (или скрыты) пишем в файл 0 для этого ID with open(‘friends.txt’,’a’) as f2: f2.write(str(data[‘id’][j]) + ‘;’ + str(h[‘id’]) + ‘;0;\n’)

Если мы хотим выполнить большое количество запросов, нужно добавить паузу между ними, например, команда sleep библиотеки time. Без этого учетная запись VK может быть заблокирована. Экспериментальным путем подобраны значения 9 секунд для поиска без друзей и 5 для поиска с друзьями (меньше, т.к. получение и сохранение списка друзей занимает несколько секунд). Производительность при использовании одной учетной записи Вконтакте составляет 8-10 тыс. пользователей в сутки. Полученные результаты сохраняются в файлы users.txt и friends.txt и могут в дальнейшем быть обработаны в БД или средствами Python.

Вк-бот отвечает только один раз. Vk_api, python

После первого ответа, он ничего не делает. Как это исправить?

Отслеживать

823 5 5 серебряных знаков 9 9 бронзовых знаков

задан 2 авг 2020 в 17:48

Станіслав Нетреба Станіслав Нетреба

37 7 7 бронзовых знаков

Я бы на вашем месте токен не показывал

2 авг 2020 в 17:52

random_id должен быть разным для каждого сообщения. В этом его суть

2 авг 2020 в 18:25

меняйте random_id в цикле

2 авг 2020 в 19:01

@timur как это сделать?

2 авг 2020 в 20:04

Походу, достаточно строчку random_id = vk_api.utils.get_random_id() перенести в тело цикла.

3 авг 2020 в 1:57

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

random_id должен быть разным для кажндого сообщения. Это нужно для того, чтобы ваш бот не отравлял одно и то же сообщение несколько раз. При отправке каждого сообщения вы должны генерировать новый random_id . Вам нужно в каждом вызове функции write_msg указывать random_id=vk_api.utils.get_random_id() , например:

write_msg(event.user_id, random_id=vk_api.utils.get_random_id(), "Хай") 

Отслеживать

ответ дан 3 авг 2020 в 13:21

823 5 5 серебряных знаков 9 9 бронзовых знаков

Тогда уж, лучше строчку random_id = vk_api.utils.get_random_id() перенести внутрь цикла, сразу после for event in longpoll.listen():

VK API — Несколько токенов в execute методе

Как вы можете знать, существует замечательный метод в VK API под названием — execute.
Данный метод принимает алгоритмы в формате VKScript, документации по которому, к сожалению я так и не нашел. Частичное решение различных нюансов можно найти — здесь.

Задача: Выполнить одним запросом, несколько вложенных запросов на стороне сервера, что бы сократить время и общее количество запросов передаваемых серверам ВКонтакте.

Вопрос: Как сделать несколько обращений к какому либо методу используя несколько разных индивидуальных access_token. Дело в том, что если передавать данный access_token в GET параметрах вместе с code значением (наш передаваемый алгоритм), то все запросы к методам, внутри нашего алгоритма, будут исходить именно от этого access_token’a.

  • Вопрос задан более трёх лет назад
  • 4332 просмотра

Парсинг целевой аудитории ВКонтакте

При размещении рекламы некоторые площадки в настройках аудитории позволяют загрузить список конкретных людей, которые увидят рекламу. Для парсинга id по конкретным пабликам существуют специальные инструменты, но куда интереснее (и дешевле) сделать это собственноручно при помощи Python и VK API. Сегодня расскажем, как для рекламной кампании LEFTJOIN мы спарсили целевую аудиторию и загрузили её в рекламный кабинет.

В материале «Собираем данные по рекламным кампаниям ВКонтакте» подробно описан процесс получения токена пользователя для VK API

Парсинг пользователей

Для отправки запросов потребуется токен пользователя и список пабликов, чьих участников мы хотим получить. Мы собрали около 30 сообществ, посвящённых аналитике, BI-инструментам и Data Science.

import requests import time group_list = ['datacampus', '185023286', 'data_mining_in_action', '223456', '187222444', 'nta_ds_ai', 'business__intelligence', 'club1981711', 'datascience', 'ozonmasters', 'businessanalysts', 'datamining.team', 'club.shad', '174278716', 'sqlex', 'sql_helper', 'odssib', 'sapbi', 'sql_learn', 'hsespbcareer', 'smartdata', 'pomoshch_s_spss', 'dwhexpert', 'k0d_ds', 'sql_ex_ru', 'datascience_ai', 'data_club', 'mashinnoe_obuchenie_ai_big_data', 'womeninbigdata', 'introstats', 'smartdata', 'data_mining_in_action', 'dlschool_mipt'] token = 'ваш_токен'

Запрос на получение участников сообщества к API ВКонтакте вернёт максимум 1000 строк — для получения последующих тысяч потребуется смещать параметр offset на единицу. Но нужно знать, до какого момента это делать — поэтому опишем функцию, которая принимает id сообщества, получает информацию о числе участников сообщества и возвращает максимальное значение для offset — отношение числа участников к 1000, ведь мы можем получить ровно тысячу человек за раз.

def get_offset(group_id): count = requests.get('https://api.vk.com/method/groups.getMembers', params=< 'access_token':token, 'v':5.103, 'group_id': group_id, 'sort':'id_desc', 'offset':0, 'fields':'last_seen' >).json()['response']['count'] return count // 1000

Следующим этапом опишем функцию, которая принимает id сообщества, собирает в один список id всех подписчиков и возвращает его. Для этого отправляем запросы на получение 1000 человек, пока не кончается offset, вносим данные в список и возвращаем его. Проходя по каждому человеку дополнительно проверяем дату его последнего посещения социальной сети — если он не заходил с середины ноября, добавлять его не будем. Время указывается в формате unixtime.

def get_users(group_id): good_id_list = [] offset = 0 max_offset = get_offset(group_id) while offset < max_offset: response = requests.get('https://api.vk.com/method/groups.getMembers', params=< 'access_token':token, 'v':5.103, 'group_id': group_id, 'sort':'id_desc', 'offset':offset, 'fields':'last_seen' >).json()['response'] offset += 1 for item in response['items']: try: if item['last_seen']['time'] >= 1605571200: good_id_list.append(item['id']) except Exception as E: continue return good_id_list

Теперь пройдём по всем сообществам из списка и для каждого соберём участников, а затем внесём их в общий список all_users. В конце переводим сначала список в множество, а затем опять в список, чтобы избавиться от возможных дубликатов: одни и те же люди могли быть участниками разных пабликов. Лишним не будет после каждого паблика приостановить работу программы на секунду, чтобы не столкнуться с ограничениями на число запросов.

all_users = [] for group in group_list: print(group) try: users = get_users(group) all_users.extend(users) time.sleep(1) except KeyError as E: print(group, E) continue all_users = list(set(all_users))

Последним шагом записываем каждого пользователя в файл с новой строки.

with open('users.txt', 'w') as f: for item in all_users: f.write("%s\n" % item)

Аудитория в рекламном кабинете из файла

Переходим в свой рекламный кабинет ВКонтакте и заходим во вкладку «Ретаргетинг». Там будем кнопка «Создать аудиторию»:

После нажатия на неё откроется новое окно, где можно будет выбрать в качестве источника файл и указать название для аудитории:

После загрузки пройдёт несколько секунд и аудитория будет доступна. Первые минут 10 будет указано, что аудитория слишком мала: это не так и панель вскоре обновится, если в вашей аудитории действительно более 100 человек.

Итоги

Сравним среднюю стоимость привлечённого в наше сообщество участника в объявлении с автоматической настройкой аудитории и в объявлении, аудиторию для которого мы спарсили. В первом случае получаем среднюю стоимость в 52,4 рубля, а во втором — в 33,2 рубля. Подбор качественной аудитории при помощи методов парсинга данных из ВКонтакте помог снизить среднюю стоимость на 37%.

Для рекламной кампании мы подготовили такой пост (нажмите на картинку, чтобы перейти к нему):

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *