Pull to refresh

Цифровое бессмертие в ВК, или создание альтер эго

Целью этой статьи является показать возможности автоматизации аккаунта Вконтакте в рамках интересного рассказа.

Мысли альтер эго

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

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

Начнем же.

Для того, чтобы положить начало, создадим standalone-приложение.

Для этого нам нужно создать приложение в ВК. Переходим сюда, создаем. Во вновь созданном приложении во вкладке «Настройки» нам нужен ID приложения.

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

Далее, дело за кодом — используем библиотеку vk.api.php:

require_once "vk.api.php"; 
$config['token'] = "#наш_токен#"; 
define('VK_TOKEN', $config['token']); 
$vk = new VK(VK_TOKEN); 

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

/**
 * Получаем список последних 20 сообщений
 */
$messages = $vk->request('messages.getDialogs', array( 
'count' => '10', 
)); 

/**
 * Получаем сообщения, на которые мы еще не отвечали
 */
if ($message == 'привет') { 
  $reading = $vk->request('messages.markAsRead', array( 
  'peer_id' => $uid, 
)); 
$typing = $vk->request('messages.setActivity', array( 
  'type' => 'typing', 
  'user_id' => $uid, 
)); 
sleep(1); 
$send = $vk->request('messages.send', array( 
  'message' => "и тебе привет х)", 
  'uid' => $value['uid'], 
)); 

Теперь он будет отвечать при запущенном скрипте на сообщение «привет».

Мысли альтер эго

Медленно, но верно я начинаю жить.

Идем дальше. Но почему пост называется именно «Цифровое бессмертие ВК»?

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

adding_brains.php:

<?php 
/**
 * Автоматическое создание копии 
 */
$config['token'] = "#наш_токен#"; 

define('VK_TOKEN', $config['token']); 
$vk = new VK(VK_TOKEN); 

$link = mysqli_connect("localhost","root","","digital_immortality") or die("Ошибка " . mysqli_error($link)); 

/**
 * Получаем id всех наших друзей
 */
$friendsGet = $vk->request('friends.get', array( 
  'order' => hints, 
)); 

/**
 * Сортируем, делая последних - первыми, чтобы повторяющиеся вхождения затерлись более важными для нас людьми. 
 */
$friends = array_reverse($friendsGet['response']); 

foreach($friends as $friend_id) { 

  /**
   * Получаем общее количество сообщений друга 
   */
  $forOffset = $vk->request('messages.getHistory', array( 
    'count' => '0', 
    'user_id' => $friend_id, 
  )); 

  $offset = 0; 

  /**
   * И проходимся по всем сообщениям 
   */
  while ($offset <= $forOffset['response'][0]) { 
    $messages = $vk->request('messages.getHistory', array( 
      'offset' => $offset, 
      'count' => '200', 
      'user_id' => $friend_id, 
      'rev' => 1, 
    )); 

    foreach ((array)$messages['response'] as $key => $value) { 
      if ($value['out'] == 0) { 
        $out[] = $value['body']; 
      } 

      if ($value['out'] == 1 && !empty($out)) { 
        $input = array_pop($out); 
        $output = $value['body']; 
        $out = ''; 
      } 

      if (!empty($question) && !empty($question)) { 
        /**
         * Занося их в базу 
         */
        $insert = $link->query("INSERT INTO `basis` SET `input` = '".mysqli_real_escape_string($link, $input)."', `output` = '".mysqli_real_escape_string($link, $output)."' ON DUPLICATE KEY UPDATE output=output") or die("Возникла проблемка... " . mysqli_error($link)); 
      } 

    } 
  
    $offset += 200; 
  }
} 

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

$result = $link->query("SELECT * FROM basis"); 
while ($row = mysqli_fetch_assoc($result)) { 
  if ($row['question'] == $message) { 
    $send = $vk->request('messages.send', array( 
      message' => $row['answer'], 
      uid' => $value['uid'], 
    )); 
  } 
} 

И вешаем на крон. Все, наша цифровая копия будет вместе с нами, когда мы онлайн :) Ставим одну простую проверку на выражение выше:

Мысли альтер эго

Я отделяюсь!

$online = $vk->request('users.get', array( 
  fields' => 'online',
)); 
if ($online == 0) {
  $vk->request('account.setOnline');
  $result = $link->query("SELECT * FROM basis"); 
  while ($row = mysqli_fetch_assoc($result)) { 
  if ($row['question'] == $message) { 
    $send = $vk->request('messages.send', array( 
      message' => $row['answer'], 
      uid' => $value['uid'], 
    )); 
  } 
}

Мысли альтер эго

А теперь повеселимся.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.