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

Подписка сразу на несколько тэгов Голоса в боте телеграм, урок 3

Почему назрела такая тема. В топе много постов с фотографией, но раскиданы они по нескольким тэгам, это:
#фотография
#фото
#фотографии
#фотоголосище
Давайте попробуем их объединить.
В рамках задачи будем выводить по 10 материалов, которые привязаны хотя бы к одному тэгу.
Давайте определим ещё две группы тэгов.

Образование

#образование
#наука
#советы

Творчество

#стихи
#музыка
#книги
#творчество
Я продолжу развивать бота, которого делал в предыдущих уроках. Урок 1 и Урок 2. И сразу ссылка на бота.
Для удобства сделаем навигацию в виде клавиатуры.
Ранее я объяснял как бот посылает информацию пользователю, происходит это отправкой вашим сервером боту массива вида:

$data = array(
  'text' => 'Текст ответа',
  'parse_mode' => 'Markdown',
);

Чтобы бот отобразил клавиатуру - нужно добавить в ответ ключ reply_markup.
В нём будет массив кнопок клавиатуры. Давайте сделаем клавиатуру с тремя кнопками.
Для начала немного изменим функцию getUserRequest

//обработка запроса от пользователя
function getUserRequest($text, $chat_id) {
  $resp = [];
  $resp['chat_id'] = $chat_id;
  $resp['text'] = 'Приветствую вас';
  $data = commIsHello($text);
  if (!empty($data)) {
    $resp = array_merge($resp, $data);
    requestToTelegram($resp);
    return TRUE;
  }
  $data = commIsUser($text);
  if (!empty($data)) {
    $resp = array_merge($resp, $data);
    requestToTelegram($resp);
    return TRUE;
  }

  requestToTelegram($resp);
}

Теперь я по-умолчанию добавляю в ответ id чата и text(без него работать не будет), а затем проверяю запрос от пользователя на приветствие(если он сыграет-здороваюсь в ответ и работа функции заканчивается), затем на инфо о пользователе.
Если ни то, ни другое условие не сработало - отправляю только id чата и приветствие. Такой ответ поприветствует пользователя. Я проверил код, всё корректно работает. Теперь по-умолчанию, после ключа text, добавим клавиатуру.

  $menu = array(
    'keyboard' => array(
      array(
        array('text' => json_decode('"\uD83C\uDF04"') . ' Фотография')
      ),
      array(
        array('text' => json_decode('"\uD83D\uDCDD"') . ' Образование')
      ),
      array(
        array('text' => json_decode('"\uD83C\uDFA8"') . ' Творчество')
      ),
    )
  );
  $resp['reply_markup'] = json_encode($menu);

Полностью функция getUserRequest будет выглядеть вот так:

function getUserRequest($text, $chat_id) {
  $resp = [];
  $resp['chat_id'] = $chat_id;
  $resp['text'] = 'Приветствую вас';
  $menu = array(
    'keyboard' => array(
      array(
        array('text' => json_decode('"\uD83C\uDF04"') . ' Фотография')
      ),
      array(
        array('text' => json_decode('"\uD83D\uDCDD"') . ' Образование')
      ),
      array(
        array('text' => json_decode('"\uD83C\uDFA8"') . ' Творчество')
      ),
    )
  );
  $resp['reply_markup'] = json_encode($menu);
  $data = commIsHello($text);
  if (!empty($data)) {
    $resp = array_merge($resp, $data);
    requestToTelegram($resp);
    return TRUE;
  }
  $data = commIsUser($text);
  if (!empty($data)) {
    $resp = array_merge($resp, $data);
    requestToTelegram($resp);
    return TRUE;
  }

  requestToTelegram($resp);
}

Проверяем.

Смайлики я взял отсюда

Кликайте на нужный смайл на колонку Unicode и там из колонки Surrogates берёте две четырёхбуквенные строки. Добавляете к каждой \u вначале и всё это пишите слитно.

Давайте добавим ещё одну функцию commIsTag

//проверка на тэг
function commIsTag($text) {
  $text = trim($text);
  if (in_array(
    $text,
    array(
      json_decode('"\uD83C\uDF04"') . ' Фотография',
      json_decode('"\uD83D\uDCDD"') . ' Образование',
      json_decode('"\uD83C\uDFA8"') . ' Творчество'
    )
  )) {
    $data = array(
      'text' => 'Выбран тэг: ' . $text,
    );
    return $data;
  }
  return NULL;
}

И добавим её в getUserRequest

function getUserRequest($text, $chat_id) {
  $resp = [];
  $resp['chat_id'] = $chat_id;
  $resp['text'] = 'Приветствую вас';
  $menu = array(
    'keyboard' => array(
      array(
        array('text' => json_decode('"\uD83C\uDF04"') . ' Фотография')
      ),
      array(
        array('text' => json_decode('"\uD83D\uDCDD"') . ' Образование')
      ),
      array(
        array('text' => json_decode('"\uD83C\uDFA8"') . ' Творчество')
      ),
    )
  );
  $resp['reply_markup'] = json_encode($menu);
  $data = commIsHello($text);
  if (!empty($data)) {
    $resp = array_merge($resp, $data);
    requestToTelegram($resp);
    return TRUE;
  }
  $data = commIsUser($text);
  if (!empty($data)) {
    $resp = array_merge($resp, $data);
    requestToTelegram($resp);
    return TRUE;
  }
  $data = commIsTag($text);
  if (!empty($data)) {
    $resp = array_merge($resp, $data);
    requestToTelegram($resp);
    return TRUE;
  }

  requestToTelegram($resp);
}

Давайте проверим

Всё получилось.
Теперь нужно подключиться к блокчейну и вытянуть последние материалы по тэгам.
Я приведу целиком функцию commIsTag с комментариями внутри:

//проверка на тэг
function commIsTag($text) {
  $text = trim($text);
  if (in_array(
    $text,
    array(
      json_decode('"\uD83C\uDF04"') . ' Фотография',
      json_decode('"\uD83D\uDCDD"') . ' Образование',
      json_decode('"\uD83C\uDFA8"') . ' Творчество'
    )
  )) {
    $data = array(
      'text' => 'Выбран тэг: ' . $text,
    );

    //Превращаем слово из запроса в тэги блокчейна
    if ($text == json_decode('"\uD83C\uDF04"') . ' Фотография') {
      $golos_tags = array('ru--fotografiya', 'ru--foto', 'ru--fotografii', 'ru--fotogolosishche');
    }
    if ($text == json_decode('"\uD83D\uDCDD"') . ' Образование') {
      $golos_tags = array('ru--obrazovanie', 'ru--nauka', 'ru--sovety');
    }
    if ($text == json_decode('"\uD83C\uDFA8"') . ' Творчество') {
      $golos_tags = array('ru--stikhi', 'ru--muzyka', 'ru--knigi', 'ru--tvorchestvo');
    }

    //подгружаем библиотеку для подключения к блокчейну
    require('vendor/autoload.php');
    $client = new WebSocket\Client("wss://ws.golos.io/");

    //массив для материалов
    $links = array();
    foreach ($golos_tags as $golos_tag) {
      //перебираем все тэги группы тэгов
      $req = json_encode(
        [
          'id' => 1, 'method' => 'get_discussions_by_created', 'params' =>
          [
            [
              'tag' => $golos_tag,
              'limit' => 10,
            ]
          ]
        ]
      );
      $client->send($req);
      $golos_resp = $client->receive();
      $resp_object = json_decode($golos_resp);
      if (!empty($resp_object->result)) {
        foreach ($resp_object->result as $post) {
          //ключем элементов массива будет id поста. Он уникален, поэтому не будет дублей
          $links[$post->id] = array(
            'title' => $post->title,
            'url' => 'https://golos.io' . $post->url,
            'created' => $post->created,
          );
        }
      }
    }
    //сортируем массив по дате
    usort($links, function($a, $b){if ($a['created'] == $b['created']) return 0;return $a['created'] > $b['created'] ? -1 : 1;});

    //обрезаем первые 10 элементов
    $links = array_slice($links, 0, 10);

    //превращаем массивы в строки
    $links_strings = array();
    foreach ($links as $link) {
      $links_strings[] = '<a href="' . $link['url'] . '">' . $link['title'] . '</a>';
    }

    $data['text'] = implode("\n", $links_strings);
    $data['parse_mode'] = 'HTML';
    $data['disable_web_page_preview'] = true;

    return $data;
  }
  return NULL;
}

Проверяем:

Вуаля))

Аналогичным образом можно делать и другие подборки тэгов.

Ссылки на Урок 1 и Урок 2
Листинг полного файла functions.php http://pastebin.com/sxWmAJ3i

Не стесняйтесь задавать вопросы :)
0
182.338 GOLOS
На Golos с January 2017
Комментарии (10)
Сортировать по:
Сначала старые