Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
tristamoff
8 лет назад

Подключаем бота телеграм к блокчейну, урок 2

В прошлом уроке я показал как создать бота и загрузить его на сервер.
Если вы пропустили - вот предыдущий урок и сам бот.
Мы научили бота здороваться. Теперь давайте научим его показывать информацию о пользователях Голоса.
Сделаем всё максимально просто - мы пишем боту ник, начиная с @ и получаем в ответ информацию о пользователе, если он найден.
Немного исправим функцию getUserRequest. Функционал приветствия вынесем в отдельную функцию commIsHello.

Листинг commIsHello

function commIsHello($text) {
  $hello = array();
  $hello[] = 'привет';
  $hello[] = 'хай';
  $hello[] = 'здорова';
  $hello[] = 'здравствуйте';
  $hello[] = 'здрасьте';
  $hello[] = 'йо';

  $bot_hello = array();
  $bot_hello[] = 'И тебе привет';
  $bot_hello[] = 'Привет от голоса';
  $bot_hello[] = 'Доброго времени суток';
  $bot_hello[] = 'Привет привет';

  if (in_array(mb_strtolower($text), $hello)) {
    //пользователь поздоровался.
    //случайная фраза привет от бота
    $bot_resp = $bot_hello[rand(0, (count($bot_hello) - 1))];
    $data = array(
      'text' => $bot_resp,
    );
    return $data;
  }
  return NULL;
}

В эту функцию передаём только текст от пользователя и если это приветствие - то функция commIsHello вернёт массив для ответа, в который мы потом добавим chat_id.

Функция getUserRequest тоже станет короче.

function getUserRequest($text, $chat_id) {
  $resp = commIsHello($text);
  if (!empty($resp)) {
    $resp['chat_id'] = $chat_id;
    requestToTelegram($resp);
    return TRUE;
  }
}

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

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

Вызывать их будем так-же в функции getUserRequest, после проверки на приветствие.

Давайте создадим функцию commIsUser.

В ней проверим, что в запросе нет пробелов и он начинается со знака @.
Заготовка функции будет выглядеть так.

function commIsUser($text) {
  $text = trim($text);//обрезаем пробелы в начале и в конце
  $space = strpos($text, ' ');
  if (($space === FALSE) && (mb_substr($text, 0, 1) == '@')) {
    //возможно это ник пользователя
    
  }
  return NULL;
}

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

function commIsUser($text) {
  $text = trim($text);//обрезаем пробелы в начале и в конце
  $space = strpos($text, ' ');
  if (($space === FALSE) && (mb_substr($text, 0, 1) == '@')) {
    //возможно это ник пользователя
    $data = array(
      'text' => 'Вы указали ' . mb_substr($text, 1),
    );
    return $data;
  }
  return NULL;
}

Проверяем. Если вы нигде не ошиблись - то получите ответ:

Отлично, ник мы распознали.
Теперь можно подключиться к блокчейну и вытянуть из него информацию о пользователе. Как сделать это на PHP - я показывал в прошлом уроке
Дописываем функцию commIsUser так:

//проверка на ник
function commIsUser($text) {
  $text = trim($text);//обрезаем пробелы в начале и в конце
  $space = strpos($text, ' ');
  if (($space === FALSE) && (mb_substr($text, 0, 1) == '@')) {
    //возможно это ник пользователя
    //подключаемся к блокчейну
    require('vendor/autoload.php');
    $client = new WebSocket\Client("wss://ws.golos.io/");
    $req = json_encode(
      [
        'id' => 1, 'method' => 'get_accounts', 'params' => [[mb_substr($text, 1)]]
      ]
    );
    $client->send($req);
    $golos_resp = $client->receive();
    teleToLog(json_decode($golos_resp));
    $client->close();
  }
  return NULL;
}

Пробуем отправить ник в чат и затем смотрим лог. У вас должен появиться объект пользователя(если вы написали реальный ник.)

Если у вас код с прошлого урока - обновите функцию teleToLog, я добавил туда поддержку логирования объектов

Я сразу напишу весь код, вы можете разобрать весь ответ в логе и вытащить что-то ещё.

function commIsUser($text) {
  $text = trim($text);//обрезаем пробелы в начале и в конце
  $space = strpos($text, ' ');
  if (($space === FALSE) && (mb_substr($text, 0, 1) == '@')) {
    //возможно это ник пользователя
    //подключаемся к блокчейну
    require('vendor/autoload.php');
    $client = new WebSocket\Client("wss://ws.golos.io/");
    $req = json_encode(
      [
        'id' => 1, 'method' => 'get_accounts', 'params' => [[mb_substr($text, 1)]]
      ]
    );
    $client->send($req);
    $golos_resp = $client->receive();
    $resp_object = json_decode($golos_resp);
    if (!empty($resp_object->result)) {
      $obj = $resp_object->result[0];
      $user = array();
      $user[] = 'ID: ' . $obj->id;
      $user[] = 'Логин: ' . $obj->name;
      $user[] = 'Аккаунт создан: ' . $obj->created;
      $user[] = 'Последний раз голосовал: ' . $obj->last_vote_time;
      $user[] = 'Голосов: ' . $obj->balance;
      $user[] = 'Золота: ' . $obj->sbd_balance;
      $user[] = 'Создано постов: ' . $obj->post_count;

      //расчёт репутации
      $reputation = $obj->reputation;
      $user[] = 'Репутация: ' . round((max(log10(abs($reputation)) - 9,0) * (($reputation >= 0) ? 1 : -1) * 9 + 25), 3);

      $json_metadata = json_decode($obj->json_metadata);
      if (!empty($json_metadata->user_image)) {
        //фото
        // передавать не буду, так как у некоторых логинов "заколдованные" аватары и сообщение в телеграм не приходит
       // $user[] = 'Аватар: ' . $json_metadata->user_image;
      }
      $text = implode("\n", $user);

      $data = array(
        'text' => $text,
        'parse_mode' => 'Markdown',
      );
    }
    else {
      $data = array(
        'text' => 'Пользователь не найден.',
      );
    }
    $client->close();

    if (!empty($data)) {
      return $data;
    }
  }
  return NULL;
}

Листинг функции commIsUser на pastebin http://pastebin.com/2FndhXx6

Полный листинг function.php http://pastebin.com/ZAT62brC

Если ошибок нет - то всё должно работать

Если указать несуществующий ник - то получите соответствующую ошибку:

Вот и всё, можете проверить :)

123
848.742 GOLOS
На Golos с January 2017
Комментарии (11)
Сортировать по:
Сначала старые