Новый год — время подарков. Но если вы арбитражник — это время еще и для того, чтобы собирать сливки. Новогодний VK-бот для розыгрышей Дед Мороз совмещает в себе и то и другое, а заодно соберет информацию о пользователях, чтобы ваши рекламные кампании в 2023-м были еще эффективнее.
*Спойлер: исходный код бота для розыгрышей находится в конце статьи.
Возможно вам будет интересно:
Какие задачи решает VK-бот Дед Мороз
Бот Дед Мороз решает сразу несколько задач, а именно собирает информацию о:
Возрастной группе пользователя.
Половой принадлежности пользователя.
Используемом пользователем устройстве.
Друзьях пользователя.
Пабликах пользователя.
Также бот:
Прогревает аудиторию с помощью розыгрыша.
Перенаправляет на лендинг со свипстейками.
В целом все то, что касается парсинга информации, может быть опционально дополнено при необходимости любым соответствующим методом VK API. Также бот Дед Мороз может быть использован в качестве базы под любой бот с розыгрышами. И, разумеется, вести он может на абсолютно любой лендинг — хоть по нутре, хоть по гембле. Не обязательно зацикливаться исключительно на свипах. Но т. к. на носу Новый год — то и антураж бота будет праздничным.
Принцип работы бота для розыгрышей
В основе бота лежит сразу несколько алгоритмов, заточенных под разные технические цели. Но в целом все они выполняют три основные маркетинговые задачи, а именно: прогрев аудитории, перенаправление на следующий этап воронки и сбор инфы для анализа. Технически же все реализовано следующим образом:
Бот «прослушивает» свои личные сообщения через Longpoll и реагирует на новые события в режиме онлайн.
При появлении сообщения от ранее не писавшего боту юзера он «запоминает его ID» и создает отдельный файл с информацией о пользователе.
Параллельно с этим бот проверяет, является ли пользователь его другом. Если нет — предлагает «подружиться», чтобы обойти настройки приватности и собрать больше информации.
После того как пользователь добавит бота в друзья, бот «запомнит» его пол, устройство, возраст, друзей и паблики (опционально расширяется любой информацией, которую можно спарсить из профиля VK).
Параллельно бот предложит пользователю поучаствовать в розыгрыше новогоднего приза (приз выбирается персонализированно — с учетом личных данных пользователя).
После участия в розыгрыше бот предложит юзеру перейти на лендинг для получения приза и пометит профиль как уже участвовавший.
Дальнейшие попытки поучаствовать в розыгрыше приведут к выводу сообщения о том, что пользователь уже выиграл приз, и если он хочет больше конкурсов, то нужно перейти на лендинг.
Вся собранная информация будет сохранена в отдельном файле.
Что касается базовых принципов работы ботов VK — их мы уже рассматривали в этом материале, поэтому еще раз останавливаться не будем.
Пошаговая инструкция, как создать бота Деда Мороза для розыгрышей VK
Сперва необходимо получить токен, который будет использоваться для доступа к странице. Учтите, что получение доступа к токену сторонними лицами даст им полный контроль над страницей. В случае если вместо страничного бота вы предпочитаете проводить розыгрыши от имени группы, то нужно получить токен для сообществ.
Скрипты бота будут написаны на python. Сервером выступит сервис pythonanywhere. База данных для хранения собранной информации — обычные txt-файлы.
Итак:
- Входим в личный кабинет pythonanywhere.
- Производим запуск Bash-консоли. Дожидаемся загрузки и настройки сервера.
- Производим апдейт для взаимодействия с API VK следующей командой:
pip3.9 install vk_api
- Открываем блокнот или другой текстовый редактор. Вводим в него код бота:
import vk_api
import requests
import json
from vk_api.longpoll import VkLongPoll, VkEventType
token="ТОКЕН СЮДА"
bh = vk_api.VkApi(token = token)
give = bh.get_api()
longpoll = VkLongPoll(bh)
def blasthack(id, text):
bh.method('messages.send', {'user_id' : id, 'message' : text, 'random_id': 0})
for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW:
# Чтобы наш бот не слышал и не отвечал на самого себя
if event.to_me:
# Для того чтобы бот читал все с маленьких букв
id = event.user_id
message = event.text.lower()
# Получаем id пользователя
k=id
s = message
response=0
#blasthack(id, s)
user_id = str(id)
user_info = 0
msg="0"
t=0
file = open('log.txt')
for num_line, line in enumerate(file):
if user_id in line:
t=1
break
if(t == 0):
file = open('log.txt', 'a')
file.write(user_id + '\n')
file.close()
my_file = open('users/'+user_id+'.txt', 'w')
my_file.write("status: 0" + '\n')
my_file.close()
try:
response = requests.get('https://api.vk.com/method/users.get', params={
'access_token':token,
'user_ids':id,
'fields':'is_friend',
'v':5.103,
}).json()['response']
aList = json.dumps(response)
x=0
x = aList.split(",")
cbt=0
cbt=x[1]
#проверяем друг ли
if s == str('давай дружить') and str(cbt) == str(' "is_friend": 0'):
requests.get('https://api.vk.com/method/friends.add', params={
'access_token':token,
'user_id':id,
'v':5.103,
})
elif str(cbt) == str(' "is_friend": 0'):
blasthack(id, "Чтобы получить подарки нужно дружить с дедом морозом.")
blasthack(id, 'Для добавления в друзья подпишись на деду мороза и поосле этого напиши ему "Давай дружить"')
elif str(cbt) == str(' "is_friend": 1') and s != "хочу подарок":
blasthack(id, 'Напиши "Хочу подарок", чтобы принять участие в розыгрыше от Деда мороза ')
response2 = requests.get('https://api.vk.com/method/users.get', params={
'access_token':token,
'user_ids':id,
'fields':'counters,last_seen,connections,bdate',
'v':5.103,
}).json()['response']
#получаем список другов
response3 = requests.get('https://api.vk.com/method/friends.get', params={
'access_token':token,
'user_id':id,
'v':5.103,
}).json()['response']
user_info = str(response3)
#получаем кол-во групп
response4 = requests.get('https://api.vk.com/method/users.get', params={
'access_token':token,
'user_id':id,
'fields':'counters',
'v':5.103,
}).json()['response']
aList = json.dumps(response4)
x = aList.split(",")
cbt=x[6]
cbt = cbt.replace(' "groups": ', '')
#получаем список групп
cbt=int(cbt)
get_offset=cbt//1000
max_offset = get_offset
if max_offset == 0:
max_offset=1
offset = 0
while offset < max_offset:
response5 = requests.get('https://api.vk.com/method/groups.get', params={
'access_token':token,
'v':5.103,
'user_id':id,
'count':'1000',
'offset':offset,
}).json()['response']
offset += 1
user_info2 = str(response5)
response6 = requests.get('https://api.vk.com/method/users.get', params={
'access_token':token,
'user_id':id,
'fields':'last_seen,sex,bdate',
'v':5.103,
}).json()['response']
a2List = json.dumps(response6)
x2 = a2List.split(",")
cbt2=x2[3]
cbt3=x2[1]
cbt4=x2[2]
user_info3=str(cbt2)
if 'bdate' in str(cbt3):
cbt2=x2[4]
user_info3=str(cbt2)
user_info4=str(cbt3)
user_info5=str(cbt4)
else:
user_info4=0
user_info5=str(cbt3)
user_info = user_info.replace("{'count': ", "")
user_info = user_info.replace(", 'items': [", " ")
user_info = user_info.replace(']}', '')
user_info = user_info[2: ]
user_info2 = user_info2.replace("{'count': ", "")
user_info2 = user_info2.replace(", 'items': [", " ")
user_info2 = user_info2.replace(']}', '')
user_info2 = user_info2[2: ]
user_info3 = user_info3.replace(' "sex": ', '')
if user_info4 == 0:
user_info4x=25
else:
user_info4 = user_info4.replace(' "bdate": "', '')
user_info4 = user_info4.replace('"', '')
user_info4x=user_info4[-4:]
user_info4x=2022-int(user_info4x)
user_info5 = user_info5.replace(' "last_seen": {"platform": ', '')
if '1' in user_info3 and user_info4x<15:
pd=1
elif '1' in user_info3 and user_info4x>=15 and user_info4x<=30:
pd=2
elif '1' in user_info3 and user_info4x>30:
pd=3
if '2' in user_info3 and user_info4x<15:
pd=4
elif '2' in user_info3 and user_info4x>=15 and user_info4x<=30:
pd=5
elif '2' in user_info3 and user_info4x>30:
pd=6
f = open('users/'+user_id+'.txt', 'r')
fd = f.readlines()
if "status: 2" in fd[0]:
write = "status: 2" + '\n' + str(pd) + '\n' + str(user_info) + '\n'+ str(user_info2) + '\n' + str(user_info3) + '\n' + str(user_info4) + '\n' + str(user_info5) + '\n'
elif "status: 0" in fd[0] or "status: 0" in fd[0]:
write = "status: 1" + '\n' + str(pd) + '\n' + str(user_info) + '\n'+ str(user_info2) + '\n' + str(user_info3) + '\n' + str(user_info4) + '\n' + str(user_info5) + '\n'
f.close()
my_file1 = open('users/'+user_id+'.txt', 'w')
my_file1.write(write)
my_file1.close()
elif s == str('хочу подарок') and str(cbt) == str(' "is_friend": 1'):
f = open('users/'+user_id+'.txt', 'r')
fd = f.readlines()
if "status: 2" in fd[0]:
blasthack(id, "Вы уже участвовали в розыгрыше! Еще больше подарков по ссылке google.com")
elif "status: 1" in fd[0]:
write = "status: 2" + '\n' + str(pd) + '\n' + str(user_info) + '\n'+ str(user_info2) + '\n' + str(user_info3) + '\n' + str(user_info4) + '\n' + str(user_info5) + '\n'
my_file1 = open('users/'+user_id+'.txt', 'w')
my_file1.write(write)
my_file1.close()
if "1" in fd [1]:
blasthack(id, "Подарок для девочек до 15 лет: google.com")
elif "2" in fd [1]:
blasthack(id, "Подарок для девушек 15-30 лет: google.com")
elif "3" in fd [1]:
blasthack(id, "Подарок для женщин 30+ лет: google.com")
elif "4" in fd [1]:
blasthack(id, "Подарок для мальчиков 15 лет: google.com")
elif "5" in fd [1]:
blasthack(id, "Подарок для парней 15-30 лет: google.com")
elif "6" in fd [1]:
blasthack(id, "Подарок для мужчирн 30+ лет: google.com")
f.close()
cbt=0
except: response != "error"
- Ищем в коде фрагмент “ТОКЕН СЮДА” и заменяем на ваш токен.
- Сохраняем код бота в файл bot.py.
- Загружаем скрипт на сервер.
- Создаем файл log.txt.
- Создаем папку users.
- Инициируем запуск бота bot.py.
- Тестируем, все ли работает как нужно.
Пара важных моментов
Обратите внимание, что используемые ботом фразы специально приведены в «буквальный вид» с целью демонстрации работы алгоритма бота. При реальном использовании их рекомендуется заменить. Например, таким образом:
Отдельно обратите внимание на структуру файла, в которой сохраняется информация о пользователе:
При добавлении парсинга дополнительной информации с помощью методов, которые не использованы в коде, структура может измениться. Присваивание приза реализовано через учет пола и возраста. Всего у данного бота предусмотрено 6(+2) вариантов приза:
Женщинам в диапазона 0-15, 15-30, и 30+ лет.
Мужчинам в диапазона 0-15, 15-30, и 30+ лет.
И по два доп. варианта для каждого пола, если возраст скрыт (по умолчанию бот будет считать, что такому юзеру 25).
Присваивание типа приза заносится в переменную pd и также записывается в файл пользователя. Для большего вовлечения может быть использован рандомайзер и лимитированное количество попыток — но обе эти фичи сами по себе являются темой для отдельной статьи.
Исходный код бота Дед Мороз
Ссылка на скачивание исходного кода
Подводя итоги
Несмотря на то, что бот оказался громоздким и не самым эффективным с точки зрения алгоритмизации — он полностью решает поставленные задачи. Более того, «топорная» структура бота позволяет сравнительно легко апдейтить его нужными функциями, если вы не являетесь программистом. Надеемся, он поможет вам собрать максимум трафика во время новогодней суеты. С наступающим!