Как создать опрос в вк в беседе: Блог об email и интернет-маркетинге

Как сделать интеллектуального чат-бота для проведения опросов/интервью / Хабр

В современном мире всё большую популярность приобретает методика под названием customer development для тестирования идей и гипотез о будущем продукте. Методику придумал «крёстный отец Кремниевой долины» Стив Бланк.
Одним из числа сильных инструментов в «разработке клиентов» является интервью, когда вы можете побеседовать с респондентом. Однако им не всегда можно воспользоваться ввиду разных причин, которые условно можно свести к объёму бюджета и имеющемуся времени. Но во многих ситуациях можно воспользоваться опросом. Причём опросом, который можно автоматизировать за счёт применения чат-бота и нейронной сети для определения смысла слов, которые написал респондент в ответ на заданный вопрос.

В этой статье сконцентрируюсь на алгоритме работы чат-бота для проведения опроса. Как сделать чат-бота для VK писал в отдельной статье на Хабре. Использовал: Python, MySQL, API VK и готовую нейросеть от RusVectores.

Статья будет полезна для тех, кто только начинает погружаться в тему и хотел бы получить информацию, изложенную в более простой, упрощённой форме.

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

Содержание

  • Нейросеть для понимания смысла текста, вводимого пользователем

  • База данных для хранения вопросов интервью

  • Описание алгоритма работы чат-бота

Нейросеть для понимания смысла текста, вводимого пользователем

Сделать бота, который распознаёт только ключевые слова в фразе пользователя — не очень жизненно. Проверку всех ключевых слов можно постараться прописать в коде, но это трудоёмко и негибко. Поэтому стоит воспользоваться возможностями нейросетей для определения смысла введённых пользователем слов.

В данном решении была использована готовая нейросеть от сервиса RusVectores, обученная на корпусе НКРЯ с использованием алгоритма word2vec CBOW с длиной вектора 300.

НКРЯ – это совокупность русскоязычных текстов, Национальный Корпус Русского Языка в полном объёме. Содержит 270 миллионов слов, объём словаря 189 193 слова.

Word2vec CBOW — алгоритм, благодаря которому слово на естественном языке представляется в виде числового вектора. Т.е. определяет «координату» слова в «смысловом пространстве». CBOW – это аббревиатура Continuous Bag of Words. Она обозначает алгоритм, который есть в word2vec. Данный алгоритм называют моделью «мешка слов», он предсказывает слово по контексту. Ещё один алгоритм в word2vec — Skip-gram предсказывает контекст по слову.

С помощью данных алгоритмов генерируют близкие по смыслу слова при запросе в поисковой системе, сравнивают документы по смыслу, определяют смысловую близость слов и предложений.

Более подробно о word2vec можно почитать в статье «Немного про word2vec: полезная теория».

О векторном представлении слов (эмбеддинге) хорошо и с примерами описано в статье «Что такое эмбеддинги и как они помогают машинам понимать тексты».

Представление слова в виде вектора позволяет оценивать его смысловую близость с другими словами, так же представленными в виде вектора. Для оценки близости слов можно вычислить косинус угла между их векторами. Чем ближе к 1 будет косинус угла между векторами слов, тем они ближе по смыслу. Единице будет соответствовать косинус угла 0 градусов, т. е. когда векторы слов совпадают.

Чтобы создать такой набор векторов почти для 200 000 слов и постоянно иметь к ним доступ, нужно располагать вычислительными мощностями. Т.к. у меня таких мощностей нет, я воспользовался доступным онлайн сервисом RusVectores.

База данных для хранения вопросов

Для проведения опроса я подготовил табличку с вопросами и разместил её в базе данных MySQL. Как видно из рисунка ниже, вопросы имеют ответвления, похожие на древовидную структуру или структуру графа.

Структура вопросов

В базе данных таблица с вопросами выглядит так (фрагмент):

Фрагмент таблицы в БД с вопросами

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

Описание алгоритма работы чат-бота

Начало опроса

По договорённости с пользователем он заходит на страницу сообщества в ВК и инициирует диалог, нажав кнопку «Сообщение».

Бот здоровается и спрашивает разрешения начать опрос. Текст приветствия задавал в разделе «Управление»→ «Сообщения» на странице сообщества в ВК.

Если пользователь ответил что-то близкое по смыслу со словом «да», то бот начинает задавать вопросы. Как определить, что пользователь одобрил старт интервью? Для этого как раз нужна нейросеть, чтобы определить смысловую близость введённых пользователем слов к словам: да, можем, можно, начинай, ок. Для этого воспользуемся API сервиса RusVectores.

Далее приведён код функции, которая определяет начинать интервью или нет. Если интервью уже было начато, то функция определяет какой вопрос задать следующим.

фрагменты кода из bot_methods.

py
модуля, в котором реализованы все методы бота

def _identify_phrase(user_id, user_message):
    """
    identify start question or greeting
    return number of phrase in database
    """
    # identification variable, on start set "I don't know"
    identi = 'I dont know'
    # find in database current position in conversation between user and chatbot
    identi = get_current_position_in_conversation(user_id)
    if identi != 'err':
        # if the conversation has just begun
        if identi == '0':
            # define greetings
            similarity = _get_similarity(user_message, u'привет здравствуйте добрый')
            if similarity > 0.5:
                identi = "greetings"
            else:
                # define start interview or not
                identi = _start_or_not(user_message)
        # if the conversation continues
        elif identi == '1':
            # define start interview or not
            identi = _start_or_not(user_message)
        else:
            pass
            
    return identi

Вначале определим возможность начать опрос исходя из ответа пользователя с помощью метода _start_or_not():

def _start_or_not(user_message):
    """
    define <identi>: start or don't start interview
    """
    if user_message != 'старт' or user_message != 'Старт':
        _identi = 'I dont know'
        # define if user agree to start interview
        start = _get_similarity(user_message, u'да можем можно начинай ок')
        # define if user don't agree to start interview
        later = _get_similarity(user_message, u'нет позже потом завтра')
        if start > later and start > 0. 15:
            _identi = 'start'
        elif later > start and later > 0.15:
            _identi = 'later'
    else:
        _identi = "start"
    return _identi

Если пользователь решил сначала поприветствовать бота, то нужно понять это и поприветствовать в ответ. Для этого проверим на смысловую близость сообщения от пользователя со словами приветствия с помощью метода

_get_similarity(). Данный метод будет использоваться и далее для определения смысловой близости сообщений пользователя.

def _get_similarity(text1, text2):
    """
    Function return similarity between text1 and text2
    text1 - user message
    text2 - key words
    """
    text1.strip()  # delete empty space on start and end of string
    text2.strip()
    text1_words = text1.split(' ')
    text2_words = text2.split(' ')
    similarity = 0.0 # init variable
    try:
        for word1 in text1_words:
            if word1 != '':
                for word2 in text2_words:
                    if word2 != '':
                        # prepare url for request to API rusvectores. org
                        # url example https://rusvectores.org/ruscorpora_upos_cbow_300_20_2019/дело__папка/api/similarity/
                        url = '/'.join(['https://rusvectores.org/ruscorpora_upos_cbow_300_20_2019', 
                                        word1 + '__' + word2, 'api', 'similarity/'])
                        # GET request to API rusvectores.org
                        r = requests.get(url, stream=True)
                        # sum similarity of couple of words
                        similarity = similarity + float(r.text.split('\t')[0])
    except Exception as e:
        log_exception = str(e)
    # average similarity
    similarity = similarity/len(text2_words)
    # return similarity between text1 and text2
    return similarity

Переменная similarity содержит числовое обозначение смысловой близость фраз text1 и text2. Чем ближе similarity к 1, тем ближе фразы по смыслу.

Метод _identify_phrase() используется для обработки всех фраз, которые пользователь пишет в чат.

Поэтому необходимо заложить в него логику проверки как начального этапа — приветствие и старт интервью, так и последующее движение по вопросам. Для этого необходимо определять на каком вопросе и на какой развилке находится диалог. Текущую позицию в беседе определяем с помощью метода get_current_position_in_conversation()

фрагмент кода из mysqldb_methods.py
модуля, в котором реализованы все методы для работы с MySQL базой данных

def get_current_position_in_conversation(user_id):
    """
    find in database current position in conversation between user and chatbot
    using in bot_methods.py
    """
    try:
        conn = MySQLdb.connect(host=HOST, user=USER, passwd=PASSWORD, 
                               db=DATABASE, charset='utf8', init_command='SET NAMES UTF8')
        cursor = conn.cursor()
        query = "SELECT `question_num` FROM `conversations` WHERE `user_id`=%(user_id)s LIMIT 1"
        cursor.execute(query, {'user_id': user_id})
        result = cursor.
fetchone() if result is None: identi = '0' else: identi = result[0] conn.close() except Exception as e: identi = 'err' return identi

Таким образом мы обрабатываем три сценария взаимодействия с чат-ботом:
— старт опроса (понимаем согласен пользователь начать опрос или нет с помощью функции _start_or_not()),
— обмен приветствиями, если пользователь поздоровался (понимаем по смысловой близости к словам приветствия с помощью функции _get_similarity());
— движение по структуре вопросов с помощью функции get_current_position_in_conversation()

для определения текущего положения в структуре вопросов.

Давайте рассмотрим движение по структуре вопросов более подробно.

Стоп-слова

Одним из важных моментов является удаление «стоп-слов», т.е. слов, которые можно с лёгкостью удалить из предложения и при этом его смысл не потеряется. Вот набор стоп-слов, которые я использовал в данном проекте:

stop_words = [
u'а',
u'большой',u'бы',u'быть',
u'в',u'весь',u'вот',u'всей',u'вы',
u'говорить',u'год',
u'для',u'до',
u'еще',u'если',
u'же',
u'знать',
u'и',u'из',u'или',
u'к',u'как',u'который',
u'мочь',u'мы',u'мне',
u'на',u'наш',u'него',u'нее',u'них',u'но',
u'о',u'один',u'она',u'они',u'оно',u'оный',u'от',u'ото',
u'по',
u'с',u'свой',u'себя',u'сказать',
u'та',u'такой',u'такое',u'только',u'тот',u'ты',u'то',
u'у',
u'что',
u'это',u'этот',
u'я'
]
stop_characters = [u'. ',u',',u' - ',u'- ',u' -',u':',u';',u'?',u'№',u'!',u'_',u'(',
u')',u'=',u'+',u"#",u'$',u'@',u'%',u'*',u'   ',u'<',u'>','1','2','3','4','5','6',
'7','8','9','0']

С помощью метода _clear_text() очищаю предложение от стоп-слов:

Движение по структуре вопросов

Для определения в каком направлении опроса двигаться исходя из ответов респондента воспользуемся функцией _define_conversation_way():

def _define_conversation_way(user_message, identi):
    """
    define in which way we are goin to?
    """
    # all questions, unless № 3 has two ways: 'yes' (positive) or 'no' (negative)
    if identi != '3' and identi != '6':
        yes = _get_similarity(user_message, u'да заказывал просить')
        no = _get_similarity(user_message, u'нет никогда')
    elif identi == '6':
        # the question number 6 has different ways: 'delivery' or 'self-delivery'
        yes = _get_similarity(user_message, u'заказываю доставку')
        no = _get_similarity(user_message, u'еду сам ищу аналог')
    elif identi == '3':
        # the question number 3 has different ways: 'from store' or 'delivery'
        yes = _get_similarity(user_message, u'магазин сам')
        no = _get_similarity(user_message, u'доставка почта все перечисленное курьер дом')
    if yes > no and yes > 0.
15: _way = 'yes' elif no > yes and no > 0.15: _way = 'no' else: _way = 'I dont know' return _way

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

bot_methods.py
полный код модуля, в котором реализованы все методы бота

# -*- coding: utf-8 -*-
"""
Bot methods.
Realizes all what bot can do.
"3. Использование API сервиса RusVectores"
https://github.com/akutuzov/webvectors/blob/master/preprocessing/rusvectores_tutorial.ipynb
"""
import re  # for work with regular expressions
import requests  # for using HTTP requests
from bot_config import stop_words
from bot_config import stop_characters
from mysqldb_methods import get_current_position_in_conversation
from mysqldb_methods import get_question_from_DB
from mysqldb_methods import write_current_question_number_for_user
def get_bot_answer(user_id, user_message):
    """
    using in views.
py make answer to user """ answer = '' # delete stop-words and punctuation characters in sentence user_message = _clear_text(user_message) # identify what to do: start or continue conversation identi = _identify_phrase(user_id, user_message) if identi == 'greetings': answer = get_question_from_DB('1') write_current_question_number_for_user(user_id, '1') elif identi == 'start': answer = get_question_from_DB('2') write_current_question_number_for_user(user_id, '2') elif identi == 'later': answer = "Когда у вас будет возможность пройти интервью напишите мне 'старт'." elif identi == 'I dont know': answer = "Я не совсем вас понимаю...\nУточните, пожалуйста." elif identi == 'end': answer = "Спасибо за ваше участие в интервью!" else: # if top-level question: 1, 2 or 3 etc. if len(identi) == 1: # define in which way we are goin to? way = _define_conversation_way(user_message, identi) if way == 'yes' or way == 'no': if way == 'yes': # going to positive way question_num = '.
'.join([identi,'1','1']) if way == 'no': # going to negative way question_num = '.'.join([identi,'2','1']) answer = get_question_from_DB(question_num) if answer != 'None': write_current_question_number_for_user(user_id, question_num) else: question_num = str(int(identi) + 1) answer = get_question_from_DB(question_num) write_current_question_number_for_user(user_id, question_num) else: # if way='I dont know' answer = "Я не совсем вас понимаю...\nУточните, пожалуйста." else: # if subquestion: e.g. identi=2.1.1 or 3.2.2 etc. identi_numbers = identi.split('.') next_num = str(int(identi_numbers[2]) + 1) question_num = '.'.join([identi_numbers[0],identi_numbers[1],next_num]) answer = get_question_from_DB(question_num) # if we get end of subquestions in this top-level-question if answer == 'None': # going to the next top-level question question_num = str(int(identi_numbers[0]) + 1) # checking that the question is the last if _is_the_last_question(question_num): answer = get_question_from_DB(question_num) question_num = 'end' else: # is not the last question answer = get_question_from_DB(question_num) write_current_question_number_for_user(user_id, question_num) return answer def _is_the_last_question(question_num): """ define is the last question? by the condition (len(identi) == 1) of the function "get_bot_answer" question_num has lenght 1 """ is_the_last = True question_num = str(int(question_num) + 1) question = get_question_from_DB(question_num) if question != 'None': is_the_last = False return is_the_last def _define_conversation_way(user_message, identi): """ define in which way we are goin to? """ # all questions, unless № 3 has two ways: 'yes' (positive) or 'no' (negative) if identi != '3' and identi != '6': yes = _get_similarity(user_message, u'да заказывал просить') no = _get_similarity(user_message, u'нет никогда') elif identi == '6': # the question number 6 has different ways: 'delivery' or 'self-delivery' yes = _get_similarity(user_message, u'заказываю доставку') no = _get_similarity(user_message, u'еду сам ищу аналог') elif identi == '3': # the question number 3 has different ways: 'from store' or 'delivery' yes = _get_similarity(user_message, u'магазин сам') no = _get_similarity(user_message, u'доставка почта все перечисленное курьер дом') if yes > no and yes > 0. 15: _way = 'yes' elif no > yes and no > 0.15: _way = 'no' else: _way = 'I dont know' return _way def _identify_phrase(user_id, user_message): """ identify start question or greeting return number of phrase in database """ # identification variable, on start set "I don't know" identi = 'I dont know' # find in database current position in conversation between user and chatbot identi = get_current_position_in_conversation(user_id) if identi != 'err': # if the conversation has just begun if identi == '0': # define greetings similarity = _get_similarity(user_message, u'привет здравствуйте добрый') if similarity > 0.5: identi = "greetings" else: # define start interview or not identi = _start_or_not(user_message) # if the conversation continues elif identi == '1': # define start interview or not identi = _start_or_not(user_message) else: pass return identi def _start_or_not(user_message): """ define <identi>: start or don't start interview """ if user_message != 'старт' or user_message != 'Старт': _identi = 'I dont know' # define if user agree to start interview start = _get_similarity(user_message, u'да можем можно начинай ок') # define if user don't agree to start interview later = _get_similarity(user_message, u'нет позже потом завтра') if start > later and start > 0. 15: _identi = 'start' elif later > start and later > 0.15: _identi = 'later' else: _identi = "start" return _identi def _clear_text(sentence): """ delete stop-words and punctuation characters in sentence """ try: # sentence to low-case sentence = sentence.lower() # delete stop-characters for char in stop_characters: sentence = sentence.replace(char, '') # delete stop-words words_of_sentence = sentence.split(' ') result = '' for word in words_of_sentence: if word not in stop_words: result = result + ' ' + word except Exception as e: result = str(e) return result def _get_similarity(text1, text2): """ Function return similarity between text1 and text2 :param text1: user message :param text2: key words """ text1.strip() # delete empty space on start and end of string text2.strip() text1_words = text1. split(' ') text2_words = text2.split(' ') similarity = 0.0 # init variable try: for word1 in text1_words: if word1 != '': for word2 in text2_words: if word2 != '': # prepare url for request to API rusvectores.org # url example http://rusvectores.org/araneum_none_fasttextcbow_300_5_2018/дело__папка/api/similarity/ url = '/'.join(['http://rusvectores.org/araneum_none_fasttextcbow_300_5_2018', word1 + '__' + word2, 'api', 'similarity/']) # GET request to API rusvectores.org r = requests.get(url, stream=True) # sum similarity of couple of words similarity = similarity + float(r.text.split('\t')[0]) except Exception as e: log_exception = str(e) # average similarity similarity = similarity/len(text2_words) # return similarity between text1 and text2 return similarity

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

Для удобства приведу полный код модуля с методами для работы с базой данных:

mysqldb_methods.py
полный код модуля, в котором реализованы все методы для работы с MySQL базой данных

# -*- coding: utf-8 -*-
"""
Methods for work with MySQL database.
"""
import MySQLdb  # before using it do in ssh: pip install mysqlclient
""" 
import configuration variables for connect to MySQL database:
"""
from mysqldb_config import HOST
from mysqldb_config import USER
from mysqldb_config import PASSWORD
from mysqldb_config import DATABASE
def write_current_question_number_for_user(user_id, question_num):
    """
    write question number to database for this user
    """
    try:
        conn = MySQLdb.connect(host=HOST, user=USER, passwd=PASSWORD, 
                               db=DATABASE, charset='utf8', init_command='SET NAMES UTF8')
        cursor = conn. cursor()
        if question_num == '2':
            query = (
                "INSERT INTO `conversations`(`user_id`, `question_num`) "
                "VALUES (%s, %s)"
            )
            data = (user_id, question_num)
        else:
            query = (
                "UPDATE `conversations` "
                "SET `question_num`=%s "
                "WHERE `user_id`=%s "
            )
            data = (question_num, user_id)
        cursor.execute(query,data)
        conn.commit()  # commit transaction
        conn.close()
    except Exception as e:
        exception = str(e)
def get_current_position_in_conversation(user_id):
    """
    find in database current position in conversation between user and chatbot
    using in bot_methods.py
    """
    try:
        conn = MySQLdb.connect(host=HOST, user=USER, passwd=PASSWORD, 
                               db=DATABASE, charset='utf8', init_command='SET NAMES UTF8')
        cursor = conn.cursor()
        query = "SELECT `question_num` FROM `conversations` WHERE `user_id`=%(user_id)s LIMIT 1"
        cursor. execute(query, {'user_id': user_id})
        result = cursor.fetchone()
        if result is None:
            identi = '0'
        else:
            identi = result[0]
        conn.close()
    except Exception as e:
        identi = 'err'
    
    return identi
def get_question_from_DB(question_num):
    """
    return question text from database
    """
    try:
        conn = MySQLdb.connect(host=HOST, user=USER, passwd=PASSWORD, 
                               db=DATABASE, charset='utf8', init_command='SET NAMES UTF8')
        cursor = conn.cursor()
        query = "SELECT `question_text` FROM `questions` WHERE `question_num`=%(num)s LIMIT 1"
        cursor.execute(query, {'num': question_num})
        result = cursor.fetchone()
        if result is not None:
            question_text = result[0]
        else:
            question_text = "None"
        conn.close()
    except Exception as e:
        question_text = str(e)
    
    return question_text

Теперь для полноты картины приведу код скрипта, который резюмирует всю логику работы чат-бота.

скрипт views.py
«точка входа» для приёма сообщений пользователя и отправки ответов бота в чат

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import json
import threading  # for async executing tasks with VK API
import vk  # vk is library from VK
from django.views.decorators.csrf import csrf_exempt
from django.shortcuts import render
from django.http import HttpResponse
from bot_config import *  # import token, confirmation_token and over constants from bot_config.py
from bot_methods import get_bot_answer
@csrf_exempt  # exempt index() function from built-in Django protection
def index(request):  # requested url
    if (request.method == "POST"):
        data = json.loads(request.body)  # take POST request from auto-generated variable <request.body> in json format
        if (data['secret'] == secret_key):  # if json request contain secret key and it's equal my secret key
            if (data['type'] == 'confirmation'):  # if VK server request confirmation
                """
                For confirmation my server (webhook) it must return
                confirmation token, which issuing in administration web-panel
                your public group in vk. com.
                Using <content_type="text/plain"> in HttpResponse function allows you
                response only plain text, without any format symbols.
                Parameter <status=200> response to VK server as VK want.
                """
                # confirmation_token from bot_config.py
                return HttpResponse(confirmation_token, 
                                    content_type="text/plain", 
                                    status=200)
            if (data['type'] == 'message_new'):  # if VK server send a message
                # t - is new thread to async execute answer_to_message()
                t = threading.Thread(target=_answer_to_message, args=(data,))
                t.start()
                return HttpResponse('ok', content_type="text/plain", status=200)
    else:
        return HttpResponse('see you :)')
# send anser to user message
def _answer_to_message(data):
    session = vk.Session()
    api = vk.API(session, v=5.5)
    user_id = data['object']['user_id']
    user_message = data['object']['body']
    # get bot answer
    answer = get_bot_answer(user_id, user_message)
    # token from bot_config. py
    api.messages.send(access_token = token, user_id = str(user_id), message = answer)

О том как устроена структура файлов приложения, его настройка описывал в подробностях в отдельной статье на Хабре.

Успехов!

Уверен, что для решения изложенной задачи существуют более элегантные решения и подходы. Несмотря на это надеюсь что изложенный материал найдёт своего читателя и будет полезен как в целом, так и в каких-то аспектах.
Желаю всем интересных проектов и успехов в их реализации!

Как создать голосование в ВК в беседе?

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

Сама процедура создания опроса для голосования очень проста и ее может использовать каждый. В несколько кликов можно создать простое голосование в группе или у себя на стене, прикрепить его к посту или опубликовать отдельно. Но что можно сделать если возникла необходимость создать голосование в беседе ВК? Есть ли такая возможность и как ее использовать? Рассмотрим все по порядку.

Как провести голосование у себя на стене?

Создавать и добавлять к себе на стену опрос можно с использованием различных версий сайта и приложений – во всех вариантах эта возможность присутствует. Выше говорилось уже о том, что процедура добавления голосования на стену очень простая. В форме для обычной публикации есть эта функция. Рассмотрим пошагово, как делать голосование у себя на стене.

  1. Нужно кликнуть вверху на стене, чтобы активировать форму для создания публикаций.
  2. Теперь открыть меню, нажав на кнопку с надписью: «Еще», в выпавшем списке следует выбрать предпоследний пункт «Опрос».
  3. Следующий шаг – введение темы голосования и создания вариантов для ответов. Нужно заполнить все поля, а затем нажать на кнопку «Отправить», чтобы опубликовать созданное голосование и сделать его доступным для пользователей Вконтакте.
  4. Теперь голосование опубликовано и каждый может выражать свое мнение.

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

 Создание опроса в группе

Стена сообщества по функциональности практически не отличается от личной новостной стены. Поэтому, алгоритм действий почти совпадает. Единственное, в чем разница – необходимо выбрать от чьего имени будет создана публикация. В группе можно публиковать на открытой стене голосования от своего имени, или же от имени сообщества (для администраторов и модераторов). Поэтому, сначала необходимо выбрать от чьего имени будет опубликовано голосование.

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

Как сделать голосование в беседе ВК?

Иногда возникает необходимость узнать общественное мнение в беседах, созданных для объединения и общения людей. Проблема в том, что в беседах нет кнопки, которая открывала бы форму создания голосования. Поэтому, создать опрос в беседе напрямую не получится. Однако, можно создать его на личной стене или в группе, а затем отправить в беседу. Вот как это сделать.

  1. Нажать кнопку «Поделиться» в публикации с созданным голосованием.
  2. Теперь нужно установить галочку напротив пункта «Отправить личным сообщением», а затем ниже выбрать беседу, в которую необходимо поместить голосование. Ниже можно добавить текстовый комментарий и нажать кнопку отправки. Это единственный способ добавить опрос в беседу.

Важно! После того, как голосование утратит актуальность можно удалить его, причем не только на стене, но и в беседе. Чтобы убрать голосование в беседе, необходимо выделить сообщение, выбрать кнопку удаления и перед подтверждением установить внизу галочку напротив пункта «Удалить для всех».

 Как скопировать опрос на сайт?

Голосование в опросах, размещенных Вконтакте, может быть более полным и объемным, если в нем примет участие большее количество людей. Для того, чтобы опрос мог затронуть большую аудиторию, необходимо распространить его на всех возможных и доступных площадках. Можно поделиться голосованием в группе, в беседах, попросить друзей сделать репост записи. Но, есть так же возможность добавить голосование на свой сайт или блог. Рассмотрим на визуальном примере, как это делается.

  1. Нужно внизу публикации с голосованием кнопку «Получить код» и нажать на нее.
  2. Затем откроется окно, в котором можно выделить и скопировать код, который будет вставлен на сайт.
  3. Следующий шаг – вставка скопированного кода голосования на свой сайт или же в блог. Код нужно скопировать в неизмененном виде и точно так же вставить – тогда голосование будет корректно отображаться.
  4. Теперь все готово, нужно только опубликовать. После этого голосование будет отображено на сайте или в блоге в неизменном виде и посетители смогут не только проголосовать, но и поделиться ним.

Дополнительные возможности голосования

Чтобы максимально эффективно управлять опросами, нужно узнать их возможности и дополнительные функции, которые будут полезными не только администраторам сообществ, но и рядовым пользователям социальной сети. Есть еще несколько особенностей, которые помогут устроить голосование максимально эффективно и просто. Рассмотрим дополнительные возможности опросов.

  1. В опросе можно изменить свое мнение, если, например, ошиблись при выборе ответа или нажали на него случайно. Внизу есть кнопка «Переголосовать».
  2. Можно проводить открытое голосование, где будет видно, кто и за какой вариант оставил свой голос. Но, так же при создании можно установить галочку «Анонимное голосование», и тогда не будет видно, кто и в каких вариантах оставлял свой голос.
  1. Для тех опросов, в которых проголосовало больше 50 человек, доступна статистика и графики. Можно увидеть не только процентное соотношение голосов в ответах, но также и другие данные. Внизу появляется кнопка «Показать график», а также меню для сортировки голосов по региональным и возрастным параметрам.

Опросы – инструмент для повышения эффективности

Использовать опросы для привлечения внимания или развлечения – это, конечно же, очень удобно и интересно. Однако, можно направить потенциал этой функции на улучшение площадки. Интересуясь мнением и потребностями аудитории можно вовремя вносить изменения, добавлять то, чего не хватает и устранять недостатки. Это самый простой способ поднять свою площадку на новый уровень!

Опросы в Твиттере – как создать и как проголосовать

Создать опрос в Твиттере

Шаг 1

Коснитесь значка создания твита  

Шаг 2

Коснитесь значка Добавить опрос

Шаг 3

Введите вопрос для опроса в основное поле ввода. Вы можете использовать максимальное количество символов в вопросе опроса.

Шаг 4

Вставьте первый вариант опроса в поле Choice 1 , а второй вариант опроса — в поле Choice 2  . Вы можете использовать до 25 символов для каждого варианта.

Шаг 5

Коснитесь + Добавить вариант , чтобы добавить в опрос дополнительные параметры. Ваш опрос может иметь до четырех вариантов.

Шаг 6

Продолжительность вашего опроса по умолчанию составляет 1 день. Вы можете изменить продолжительность опроса, нажав 1 день и задав дней , часов и минут . Минимальное количество времени на опрос — 5 минут, максимальное — 7 дней.

Шаг 7

Коснитесь Твитнуть , чтобы опубликовать опрос.

Шаг 1

Коснитесь Создание твита значок 

Шаг 2

Коснитесь значка Добавить опрос

Шаг 3

Введите вопрос для опроса в основное поле ввода. Вы можете использовать максимальное количество символов в вопросе опроса.

Шаг 4

Вставьте первый вариант опроса в поле  Choice 1  , а второй вариант – в поле  Вариант 2 коробка. Вы можете использовать до 25 символов для каждого варианта.

Шаг 5

Коснитесь + Добавить вариант , чтобы добавить в опрос дополнительные параметры. Ваш опрос может иметь до четырех вариантов.

Шаг 6

Продолжительность вашего опроса по умолчанию составляет 1 день. Вы можете изменить продолжительность опроса, нажав 1 день и отрегулировав дней , часов и минут . Минимальное количество времени на опрос — 5 минут, максимальное — 7 дней.

Шаг 7

Коснитесь Твитнуть , чтобы опубликовать опрос.

Шаг 1

Нажмите на поле создания твита в верхней части домашней временной шкалы или нажмите кнопку Твит на левой панели навигации.

Шаг 2

Щелкните значок Добавить опрос  

Шаг 3

Введите вопрос для опроса в основное поле ввода. Вы можете использовать максимальное количество символов в вопросе опроса. Чтобы опубликовать опрос, в твит должен быть включен текст.

Шаг 4

Вставьте первый вариант опроса в поле Вариант 1 , а второй вариант опроса — в поле Вариант 2 9Коробка 0008. Вы можете использовать до 25 символов для каждого варианта.

Шаг 5

Нажмите + Добавить вариант , чтобы добавить дополнительные параметры к вашему опросу. Ваш опрос может иметь до четырех вариантов.

Шаг 6

Продолжительность вашего опроса по умолчанию составляет 1 день. Вы можете изменить продолжительность вашего опроса, нажав 1 день и отрегулировав дней , часов и минут . Минимальное количество времени на опрос — 5 минут, максимальное — 7 дней.

Шаг 7

Нажмите Твитните , чтобы опубликовать опрос.

Бесплатные опросы и голоса в WhatsApp

Где проводить опросы?

FAQ

Часто задаваемые вопросы

📄 Как создать опрос в WhatsApp?

Отправьте слово Создайте на номер wa.me/48735062996. Далее вам нужно будет выполнить 4 шага:

  • Введите тему вашего опроса. Например: «Куда пойти на выходных?»
  • Укажите количество возможных ответов. Здесь вы должны отправить число от 2 до 10.
  • Введите возможные ответы, по одному на сообщение.
  • Укажите, можно ли голосовать более чем за один ответ.

Далее вы получите сообщение с текстом вашего опроса, вашими ответами и префиксами. Скопируйте или перешлите его своим потенциальным избирателям в групповые чаты WhatsApp или лично. Таким образом избиратели получат ссылку на чат с вашим опросом.

Чтобы скопировать сообщение с опросом, нажмите и удерживайте сообщение, чтобы выбрать его — вверху появится меню. Нажмите значок со стрелкой вправо и выберите свой групповой чат.

Имейте в виду, что ваш текущий опрос будет завершен после того, как вы начнете новый.

Войти в чат с опросом и проголосовать можно по ссылке: wa.me/48735062996.

📢 Как проголосовать в Whatsapp?

Для голосования избиратель должен отправить префикс опроса и номер ответа на номер WhatsApp +48 735 062 996. Эту информацию можно найти в сообщении, отправленном избирателям создателем опроса.

Например, если опрос был создан с префиксом b, голосующий должен отправить b1, b2, b3 и т. д. на указанный номер WhatsApp, чтобы проголосовать за 1-й, 2-й или 3-й ответ соответственно.

Войти в чат с опросом и проголосовать можно по ссылке: wa.me/48735062996.

💡 Как избиратели узнают тему и варианты ответов?

1. Если у Вас ЕСТЬ контакты избирателей:

После начала опроса создатель получает сообщение с вопросом, ответами на него и префиксами. Затем он или она пересылает сообщение избирателям лично или в групповые чаты. Голосующие переходят по ссылке в чат с номером +48 735 062 996.

2. Если у Вас НЕТ контактов избирателей:

  • Покажите номер на экране или сообщите устно.
  • Разместите QR-код со ссылкой на опрос. Скачать изображение с QR-кодом можно здесь.

После создания опроса организатор получит всю информацию: вопрос, ответы и префиксы. Затем он должен сообщить об этом избирателям через групповой чат или лично.

В чат с опросом можно войти по ссылке: wa.me/48735062996.

📲 Как узнать результаты?

Создатель опроса будет получать отчет в WhatsApp после каждого нового голосования. Все участники получат отчет после завершения опроса или по номеру Статус 9.Команда 0008.

Другое

Почему это бесплатно?

Наш основной продукт — Chat2Desk. Это чат-центр для делового общения с клиентами. Опросы WhatsApp основаны на Chat2Desk и демонстрируют наши технологии широкой аудитории.

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

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

Закрыть
Menu