Изучаем NODEJS (1), анализ постов и комментирование
Сейчас передо мной стоит задача - найти (понять) то, что будет полезно для участников сообщества. Какую именно функцию, свойство можно автоматизировать.
И дальнейшая задача - реализовать эту функцию!
Для превью
Разумеется для этого в первую очередь необходимо овладеть самим инструментом. Я выбрал язык программирования для автоматизации задача в STEEMIT - nodeJS.
Я уже сделал скрипт, который на автомате публикует в комментариях вопрос по запросу. Об этом можно прочесть тут: https://steemit.com/hive-171319/@alexmove/viktorina-v-1-2beta-v-poluavtomaticheskom-rezhime-na-russkom-yazyke-or-or-quiz-in-semi-automatic-mode-in-russian
Сейчас я хочу автоматизировать анализ поста, с целью выявления наиболее упоребляемых в посте слов.
Когда это у меня получится, то можно будет анализировать все посты за текущий день в нашем сообществе и выбирать похожие. И в комментарии уведомлять человека, что есть посты с таким же перечнем наиболее употребляемых слов. Идея в том, что это может сплотить людей, пишущих об одном и том же, помочь найти единомышленников.
Я буду изучать сейчас эту тему, и паралельно описывать это в посте, таким образом вы сможете проследить этот путь и также обучиться этому процессу и навыку.
Командная строка nodejs
Итак, начинаем.
Наиболее употребляемые слова в посте.
Первое, что нужно сделать - это получить данные поста.
Затем выбрать оттуда сам текст.
Найти скрипт, который позволяет определить частоту встречания слов (потому что самому писать такой скрипт представляется трудным)
Совместить первые пункты со скриптом.
Получить результат.
Поместить результат в комментарий к посту.
Шаг 1.
Данные поста мы получаем с помощью tutorials\05_get_post_details
Это стандартный учебник. Там все готово, лишь тег указать нужно тот, который мы хотим. Я указываю "ukraine".
Шаг 2. Отладка.
Не тут-то было, ошибка! Так просто не работает.
Потому что я запускаю скрипт из консоли, а он предназначен для браузера.
Удаляю все, что относится к браузеру.
Упоминания "document"
Например:
document.getElementById('postList').style.display = 'block';
document.getElementById('postList').innerHTML = posts.join('');
Теперь работает!
Шаг 3.
Новая ошибка. Не понимаю как вывести данные мне на экран, и решаю сразу публиковать комментарий. А в комментарии написать "Привет, $автор. Длина твоего поста - хххх".
Шаг 4.
Новое препятствие
Не работает скрипт
Почему-то в переменных нет нужных значений.
Где же они?
Перенес в нужное место кода... Заработало!
Работает
Шаг 5.
Публикуем комментарий!
Заработало!
Пример комментария. Первый комментарий
https://steemit.com/hive-171319/@alexmove/20210417t102749122z
Добавим еще немного красоты)
Шаг 6.
Хм, а ведь публиковать одно и тоже думаю не надо. Теперь надо сохранять все посты, которые мы уже прокомментировали. Чтобы не было повторных комментариев.
Шаг 7
Сделано!
Вот кусочек, который проверяет в файле и записывает новый permalink
const fs = require("fs");
console.log("Синхронное чтение файла")
let bd = fs.readFileSync("bd.txt", "utf8");
console.log(bd);
if (bd.indexOf(permlinkR) === -1)
{
bd = bd + permlinkR;
fs.writeFileSync("bd.txt",bd)
steem.broadcast.comment(
wifkey, // Your posting wif
author, // Parent Author
permlinkR, // Parent Permlink
votey,
permlink, // Your post permlink
'', // Title
body2R, // Body
{ tags: ['thanks'], app: 'ganeshaway' }, // Json Metadata
function(err, result) {
console.log(err, result)});
sleep(20000);
console.log(body2R);
} else
console.log('УЖЕЕЕЕ');
Шаг 8
Проверяем на 10 постах
const query = {
tag: 'ukraine',
limit: 10,
truncate_body: 1,
};
Сработало на 2... Хм.. почему...
Ага, ясно. Не сработала пауза.
"STEEM_MIN_REPLY_INTERVAL_HF20: You may only comment once every 3 seconds."
Увеличиваю паузу, и снова проверяю.
Снова не работает.... не понятно. Вот оно... программирование...
И ошибки не выдает. Просто не реагирует.
Разбираюсь.
Шаг 9.
Переделываю на это.
console.log('comment broadcast object', comment);
client.broadcast.comment(comment, privateKey).then(
function(result) {
console.log('comment broadcast result', result);
document.getElementById(
'postLink'
).innerHTML = <br><p>Included in block: ${ result.block_num }</p><br><br><a href="http://condenser.steem.vc/@${parent_author}/${parent_permlink}">Check post here</a>
;
},
function(error) {
console.error(error);
}
);
Шаг 10.
Готово!
Работает!
Выдает комментарии... фууух.
Полный код:
debugger;
const dsteem = require('dsteem');
const steem = require('steem');
steem.api.setOptions({ url: 'https://api.steemit.com' });
steem.api.streamOperations(function (err, ops) {
});
let opts = {};
//connect to production server
opts.addressPrefix = 'STM';
opts.chainId =
'0000000000000000000000000000000000000000000000000000000000000000';
//connect to server which is connected to the network/production
const client = new dsteem.Client('https://api.steemit.com');
let wifkey = 'хххх posting key xxxx';
let votey = "alexmove";
let lenght;
var author;
var permlinkR;
var bodyR;
var body2R;
let bd = 's';
//fetch list of trending posts
function sleep(milliseconds) {
const date = Date.now();
let currentDate = null;
do {
currentDate = Date.now();
} while (currentDate - date < milliseconds);
}
const fs = require("fs");
async function main() {
const query = {
tag: 'ukraine',
limit: 20,
truncate_body: 1,
};
client.database
.getDiscussions('trending', query)
.then(result => {
var posts = [];
result.forEach(post => {
// console.log(post);
const json = JSON.parse(post.json_metadata);
const image = json.image ? json.image[0] : '';
const title = post.title;
author = post.author;
permlinkR = post.permlink;
const created = new Date(post.created).toDateString();
//console.log("Синхронное чтение файла"+permlinkR+":");
let bd = fs.readFileSync("bd.txt", "utf8");
// console.log(bd);
console.log(bd.indexOf(permlinkR) === -1);
if (bd.indexOf(permlinkR) === -1)
{
bd = bd + permlinkR;
fs.writeFileSync("bd.txt",bd);
lenght = post.body_length;
//body2R = `Привет, @${author}. Длина твоего поста `+lenght+'! :)';
body2R = `Привет, @${author}. Длина твоего поста `+lenght+'! :)';
let permlink = new Date().toISOString().replace(/[^a-zA-Z0-9]+/g, '').toLowerCase();
sleep(10000);
steem.broadcast.comment(
wifkey, // Your posting wif
author, // Parent Author
permlinkR, // Parent Permlink
votey,
permlink, // Your post permlink
'', // Title
body2R, // Body
{ tags: ['thanks'], app: 'ganeshaway' }, // Json Metadata
function(err, result) {
console.log(err, result)});
}
});
})
.catch(err => {
console.log(err);
alert('Error occured, please reload the page');
});
}
//catch error messages
main().catch(console.error);
//get_content of the post
client.database.call('get_content', [author, permlinkR]).then(result => {
// sleep(5000);
});
Тестируем разбор постов. Ищем наиболее встречающиеся слова. Подробнее в моем блоге)
Cлово - встречается 6 раз
Cлово что встречается 7 раз
Cлово в встречается 14 раз
Cлово на встречается 5 раз
Cлово и встречается 9 раз
Cлово не встречается 7 раз
Cлово встречается 1457 раз
Cлово = встречается 33 раз
Cлово const встречается 8 раз
Cлово bd встречается 7 раз
Cлово
встречается 8 раз
Cлово // встречается 17 раз
Cлово {
встречается 14 раз
test
this-is-a-test
Тестируем разбор постов. Ищем наиболее встречающиеся слова. Подробнее в моем блоге)
Cлово "-" встречается 6 раз
Cлово "что" встречается 7 раз
Cлово "в" встречается 14 раз
Cлово "на" встречается 5 раз
Cлово "и" встречается 9 раз
Cлово "не" встречается 7 раз
Cлово "" встречается 1457 раз
Cлово "=" встречается 33 раз
Cлово "const" встречается 8 раз
Cлово "bd" встречается 7 раз
Cлово "
" встречается 8 раз
Cлово "//" встречается 17 раз
Cлово "{
" встречается 14 раз
20210418t205542911z
20210418t210650981z
20210418t210817494z
20210418t211005435z
Тестируем разбор постов. Ищем наиболее встречающиеся слова. Подробнее в моем блоге)
Тестируем разбор постов. Ищем наиболее встречающиеся слова. Подробнее в моем блоге)
Cлово "of" встречается 12 раз
Cлово "this" встречается 6 раз
Cлово "" встречается 33 раз
Cлово "I" встречается 5 раз
Cлово "to" встречается 5 раз
Cлово "and" встречается 6 раз
Cлово "will" встречается 6 раз
Cлово "be" встречается 5 раз
Cлово "the" встречается 19 раз
Cлово "in" встречается 8 раз
Cлово "✓" встречается 9 раз
Cлово "и" встречается 6 раз
Cлово "не" встречается 6 раз
Cлово "в" встречается 7 раз
Cлово "на" встречается 5 раз