Почему назрела такая тема. В топе много постов с фотографией, но раскиданы они по нескольким тэгам, это:
#фотография
#фото
#фотографии
#фотоголосище
Давайте попробуем их объединить.
В рамках задачи будем выводить по 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
...Нииичееего не понимаю, кроме одного - это - поможет)
Такая штукенция мне бы в golos.io очень понравилась, группировка тэгов.
Суть понял)
Мне тоже понравится - такое будет, кажется, по словам Сергея.
НО!
Код в посте - нииичееегоо не понимаю)))
Я потом оформлю так, что любой сможет к себе утащить.
=)
Нашёл
@golos_helper_bot
Спасибо, что развиваете данное направление, возможно в перспективе добавим какой либо функционал в нашего основного бота @golosnotifybot
Тут убедительная просьба изменить ссылку с веб телеграма на ссылку вида
t.me/golosnotifybot
Спасибо, сменил.
Поддерживаю ваши старания и инициативы! :)
Спасибо, стараюсь))