Изучаем NODEJS (1), анализ постов и комментирование

in #steemit3 years ago (edited)

Сейчас передо мной стоит задача - найти (понять) то, что будет полезно для участников сообщества. Какую именно функцию, свойство можно автоматизировать.

И дальнейшая задача - реализовать эту функцию!

image.png
Для превью

Разумеется для этого в первую очередь необходимо овладеть самим инструментом. Я выбрал язык программирования для автоматизации задача в 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

Сейчас я хочу автоматизировать анализ поста, с целью выявления наиболее упоребляемых в посте слов.

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

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

image.png
Командная строка nodejs

Итак, начинаем.
Наиболее употребляемые слова в посте.

Первое, что нужно сделать - это получить данные поста.
Затем выбрать оттуда сам текст.
Найти скрипт, который позволяет определить частоту встречания слов (потому что самому писать такой скрипт представляется трудным)
Совместить первые пункты со скриптом.
Получить результат.
Поместить результат в комментарий к посту.

Шаг 1.

Данные поста мы получаем с помощью tutorials\05_get_post_details

Это стандартный учебник. Там все готово, лишь тег указать нужно тот, который мы хотим. Я указываю "ukraine".

Шаг 2. Отладка.

Не тут-то было, ошибка! Так просто не работает.
Потому что я запускаю скрипт из консоли, а он предназначен для браузера.

Удаляю все, что относится к браузеру.
Упоминания "document"

Например:

       document.getElementById('postList').style.display = 'block';
        document.getElementById('postList').innerHTML = posts.join('');

Теперь работает!

Шаг 3.

Новая ошибка. Не понимаю как вывести данные мне на экран, и решаю сразу публиковать комментарий. А в комментарии написать "Привет, $автор. Длина твоего поста - хххх".

Шаг 4.

Новое препятствие

image.png
Не работает скрипт

Почему-то в переменных нет нужных значений.
Где же они?

Перенес в нужное место кода... Заработало!

image.png
Работает

Шаг 5.

Публикуем комментарий!
Заработало!

image.png
Пример комментария. Первый комментарий

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 &lt; milliseconds);
}
const fs = require("fs");

async function main() {
    const query = {
        tag: 'ukraine',
        limit: 20,
        truncate_body: 1,
    };

    client.database
        .getDiscussions('trending', query)
        .then(result =&gt; {
            var posts = [];
            result.forEach(post =&gt; {
               // 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 =&gt; {
            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 =&gt; {
   // sleep(5000);
    });
Sort:  

Тестируем разбор постов. Ищем наиболее встречающиеся слова. Подробнее в моем блоге)
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 раз

Тестируем разбор постов. Ищем наиболее встречающиеся слова. Подробнее в моем блоге)

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 раз

Loading...

Coin Marketplace

STEEM 0.18
TRX 0.16
JST 0.032
BTC 59087.19
ETH 2580.56
USDT 1.00
SBD 2.47