В наши дни роботы – это новое понятие, включающее в себя возможность возложить свои труды на машину. В этой записи мы будем делать робота для развлечения. Кому-то эта публикация покажется очень исчерпывающей, и я буду верить, что, если вы тоже активны в этой теме, поделитесь информацией о своих открытиях в этой сфере. Так же я выражаю благодарность автору этой публикации за проявленный интерес к этой теме. Его публикация натолкнула меня на мысль улучшить работу с помощью новейших технологий ВКонтакте. Итак, перейдём непосредственно к теме.

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

Шаг 1. Подготовка.


Здесь ничего сложного. Сможет осознанно сделать каждый.

Группа в ВК


Для робота нам понадобится завести группу ВКонтакте. Обозвать её названием робота и провести некоторые операции.

Для начала получим вечный access_token для работы с сообществом. Можно расставить все права на случай, если вы будете улучшать мой код.

настройки бота

Ещё надо не забыть включить сообщения сообщества. Это всё сделать нетрудно через кнопку Управление сообществом. Я думаю, это все умеют, поэтому описывать слишком досконально смысла нет.

Создание робота-инфа


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

робот

Не стоит забывать этот личный кабинет, здесь можно редактировать ответы вашего робота, когда с ним поговорят. Так же его можно сразу заполнить контентом на различные темы. Конечно, вариант немного детский (а он и создан для детей), но этот вариант не хуже, чем ничего. При токной настройке робот может очень неплохо вам прослужить.

Шаг 2. Выбор оборудования


Я не знаю, где вы будете держать робота: дома ли у себя, или на круглосуточном сервере. Лично у меня робот будет находиться на сервере, поэтому рассматриваю именно этот случай. Что касается домашнего варианта — достаточно установить Python на ваш Windows и проделать относительно те же шаги.

Шаг 3. Кодинг


Небольшое лирическое отступление
Вот тут начинается моё самое любимое… Ах! Как я обожаю кодинг. Там, где я живу, ни один человек не знает о программировании ничего, кроме этого:
Переустанови винду, тыж программист!

Мне не с кем в школе поделиться своими достижениями, поэтому пишу сюда. Надеюсь, что эта публикация позволит мне получить малейший шансик стать не только read, но и write пользователем. Тогда буду делиться с вами разного рода уникальной информацией значительно чаще. Спасибо, что прочитали это.

Код исполняется постоянно. Его работа прекратится только в случай критической ошибки или завершения процесса. Работать над ним можно вечность и сделать в итоге настоящую личность с автопостингом из разных парс-ресурсов. Я этим буду заниматься в дальнейшем. А сейчас выложу рабочую версию. Есть вся необходимая сила для общения. Если понадобится — можно по примеру дописать реакции и на другие действия. Всё зависит от вашей фантазии.

#!/usr/bin/python
# coding: utf-8

# необходимые пакеты
import base64
import hashlib
import json
import requests
from urllib import urlencode, unquote

# ID инфа
InfId = "вставьте ID"
# access token паблика ВКонтакте
AccessToken = "access_token вписываем сюда"
# кодовая фраза для iii.ru API (изменять нельзя)
Key = "some very-very long string without any non-latin characters due to different string representations inside of variable programming languages"
# оперативная память сессий
Memory = []

# выключаем ненужные предупреждения от urllib3
requests.packages.urllib3.disable_warnings()

# шифратор по технологии поразрядного исключающего ИЛИ
# Вход =====
# message - строка для шифрования
# key - ключ, который использовался для шифровки
# Выход =====
# newmsg - зашифрованная строка
def XOR_encrypt(message, key):
    ml = len(message)
    kl = len(key)
    newmsg = u""
    for i in range(0, ml):
        newmsg = newmsg + chr(ord(message[i]) ^ ord(key[i % kl]))
    return base64.b64encode(newmsg)

# дешифратор по технологии поразрядного исключающего ИЛИ
# Вход =====
# encrypted_message - зашифрованное сообщение
# key - ключ, который использовался для шифровки
# Выход =====
# newmsg - расшифрованная строка
def XOR_decrypt(encrypted_message, key):
    msg = base64.b64decode(encrypted_message)
    ml = len(msg)
    kl = len(key)
    newmsg = u""
    for i in range(0, ml):
        newmsg = newmsg + chr(ord(msg[i]) ^ ord(key[i % kl]))
    return newmsg

# инициализатор посетителя
# Вход =====
# vkid - ID посетителя ВКонтакте
# key - секретный ключ от API iii.ru
# botid - ID робота iii.ru
# Выход =====
# Строка - ID инициализированной сессии
def initme(vkid, key, botid):
    getuid = requests.get("http://iii.ru/api/2.0/json/Chat.init/%s/%s" % (botid, vkid))
    jsonparam = json.loads(base64.b64decode(XOR_decrypt(getuid.text, Key)))
    return jsonparam["result"]["cuid"]

# получаем доступ к longpoll-серверу
# Вход =====
# Не требует переменных
# Выход =====
# response - словарь, содержащий ===
# server - сервер для подключения
# key - ключ доступа
# ts - штамп времени, с которого мы ждём
def new_longpoll():
    r = requests.get("https://api.vk.com/method/messages.getLongPollServer?use_ssl=1&need_pts=0&access_token=%s" % AccessToken)
    db = json.loads(r.text)
    return db["response"]

# сбрасывает накопленную оперативную память в файл, чтобы не потерять
# Вход и выход =====
# Не требует переменных
def mem_dump():
    f = open("memory.txt", "w")
    res = ""
    for m in Memory:
        res = res + "%s=%s=%s" % (str(m[0]), str(m[1]), str(m[2]))
    f.close()

# Вызываем longpoll в первый раз и записываем данные
longpoll = new_longpoll()
server_ip = longpoll["server"]
server_key = longpoll["key"]
server_ts = longpoll["ts"]

# инициализируем оперативную и файловую память
# если робот "далеко зайдёт" - пишите доп. код на сегменты
f = open("memory.txt", "w+")
for line in f:
    try:
        l = line.split("=")
        Memory.append(l)
    except:
        Memory = []
f.close()

# бесконечный цикл
while True:
    # подключаемся к longpoll серверу
    r = requests.get("https://%s?act=a_check&key=%s&ts=%s&wait=25&mode=2&version=1" % (server_ip, server_key, server_ts))
    db = json.loads(r.text)
    # перезаписываем временной штамп из longpoll отчёта
    server_ts = db["ts"]
    # если изменений нет - заново подключаемся к серверу
    if db["updates"] == 0:
        continue
    # иначе листаем все изменения
    for item in db["updates"]:
        print(item)
        # 4 - код нового сообщения от юзеров
        if item[0] == 4:
            # получаем vk id и само сообщение
            msgid = int(item[1])
            sender = item[3]
            message = item[6]
            # если сообщением является вложением или стикером - игнорируем
            if message == u'':
                continue
            session = None
            # ищем сессию. если нет - создаём
            for lst in Memory:
                if lst[0] == sender:
                    session = lst[1]
                    mgid = lst[2]
            try:
                if mgid and mgid == msgid:
                    continue
            except:
                mgid = msgid
            if session is None:
                session = initme(sender, Key, InfId)
                Memory.append([sender, session, msgid])
            # формируем JSON запрос
            whattosend = u'["%s","%s"]' % (session, unquote(message))
            # ... и зашифровываем
            hashed = XOR_encrypt(base64.b64encode(whattosend.encode("utf-8")), Key)
            # отправляем iii.ru
            headers = {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Referer': 'http://iii.ru/static/Vishnu3.swf?v=3',
            'Origin': 'http://iii.ru/'
            }
            req = requests.post("http://iii.ru/api/2.0/json/Chat.request", data=hashed, headers=headers)
            # расшифровываем ответ
            answer = json.loads(base64.b64decode(XOR_decrypt(req.text, Key)))
            otvet = answer["result"]["text"]["value"]
            # отправляем ответ в ВКонтакте
            r = requests.get(u"https://api.vk.com/method/messages.send?user_id=%s&message=%s&access_token=%s" % (sender, otvet, AccessToken))
            # присваиваем ID ответа, чтобы робот не отвечал сам себе
            for lst in Memory:
                if lst[0] == sender:
                    lst[2] = int(json.loads(r.text)["response"])
            # опять ждём у моря погоды
            continue
        # 6 - код прочтения сообщений. продолжаем...
        # elif item[0] == 6:
        #     continue
        # 61 - код набора текста. просто ждём...
        # elif item[0] == 61:
            # print("User writing message...")
            # continue

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

И, да, спасибо за внимание.
Поделиться с друзьями
-->

Комментарии (0)