Картинка из интернет
Добрый день голосяне.
Ковыряясь на голосе, набрел на блог пользователя @vik. В постах которого много уроков по javascript с "живыми" примерами работы. Там же я и нашел уроки по созданию самого простого бота. Вдохновленный уроками по написанию бота , решил и сам написать такого себе. Самоцелью было не просто подставить переменные, а немного научиться и понять как это работает.
Ну и г...но код же у меня вышел. )))
В сети я встретил не один пример написаного уже готового бота, бери да используй.Но нет. Целью сего эспиримента боло именно научиться, понять и усовершенствовать(если до этого вообще "доживу").
Единственным опытом работы вообще с какими-либо скриптами у меня был Powershell. Мягко говоря синтаксис отличаеться. Но хуже всего стало, когда я столкнулся с неожиданной для меня вещью - асинхронность 8(!
Хочу поблагодарить тех кто отзывчиво помог и подсказывал когда я спрашивал.
Отдельное спасибо @vik и @ropox.
Итак, что делает бот:
- проверяет пользователя на наличие в подписчиках у пользователя (сейчас @djimirji)
- выбирает по 3 последних постов у выше выбранных пользователей
- проверяет каждый выбраный пост на наличие в нем вызова бота ( @djimirji up! )
Особую сложность вызвали вложеные коментари - проверяет не голосовал ли ранее за пост
- голосует за пост в котором был вызов бота с силой от 50% до 100%
- отвечает на коментарий-вызов бота
Пока так..
Но повторюсь - такого ужасного кода у меня еще не было... Я в нем наверное не разберусь.. Буду писать наново и добавлять разные "примочки" ))
А пока пусть покрутиться.
Если будут баги - сильно не пинайте.
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
sape4000, vadbars, vika-teplo, mp42b, irisworld
Поэтому я тоже проголосовал за него!
Так как Вы голосуете за мои посты, я проголосовал на 100% сильнее!
Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!
Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой "!нехочу"
dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:
Картинка про меня
)))))))) Ну как, получается теперь?
Из-за асинхронности, немогу нормально выставить таймауты на коментарии (можно раз в 20 сек.). Бьюсь уже который день над этим. А так вцелом бот готов.
Поборю таймауты и будет работать штатно )
Удачи!
Спасибо.
@djimirji, Поздравляю!
Ваш пост был упомянут в моем хит-параде в следующих категориях:
@djimirji, поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за Количество комментариев
Вы можете нажать на любой бейдж, чтобы увидеть свою страницу на Доске Почета.
Чтобы увидеть больше информации о Доске Почета, нажмите здесь
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
const REBLOGGER = "djimirji"
// Постинг ключ аккаунта, который будет делать реблоги
const postingkey = "5J........."
// Логин аккаунта на который должены подписываться пользователи, что бы их имена попали в белый список!
const following = 'djimirji';
const UpVoteCall = '@djimirji up!';
//const UpVoteCall = '@djimirji';
//Дата
const fromdate = 0;
// Текст комментария под постом, которому вы сделали реблог
const COMMENT =
💡 **${REBLOGGER} сделал реблог :)**
;//Задержка для заполнения глобальных переменных, из-за асинхронной работы апи
var pause = 0;
// ======================= Коннект ==========================
// Если у вас не установлена локальная нода, адрес следует изменить на адрес публичной ноды.
// Например "wss://api.golos.cf" - нода @vik
//const GOLOSNODE = "ws://localhost:9090"
const GOLOSNODE = "wss://api.golos.cf";
// Подключение JavaScript библиотеки для работы c API голоса
const golos = require('golos-js');
// Указываем ноду, к которой будет подключен скрипт
golos.config.set('websocket', GOLOSNODE);
// =====================================================================
// =================== Фунуции =========================
// =====================================================================
// =================== Удаление дублей =========================
function removeDuplicates(arr){
let unique_array = []
for(let i = 0;i < arr.length; i++){
if(unique_array.indexOf(arr[i]) == -1){
unique_array.push(arr[i])
}
}
return unique_array
}
// =================== Конец удаления дублей =========================
// =================== Добавление коментария =========================
let body = '';
function CommentAdd (parentAuthor,parentPermlink,body,VOTEPOWER) {
/**
comment() add a comment
@param {Base58} wif - private posting key
@param {String} parentAuthor - for add a comment, author of the post
@param {String} parentPermlink - for add a comment, url-address of the post
@param {String} author - author of the comment
@param {String} permlink - unique url-address of the comment
@param {String} title - for create a comment, empty field
@param {String} body - text of the comment
@param {String} jsonMetadata - meta-data of the post (images etc.)
*/
var author = REBLOGGER;
var permlink = 're-' + parentAuthor + '-' + parentPermlink + '-' + Date.now(); // re-epexa-test-url-1517333064308
var title = '';
let jsonMetadata = {
"tags": ["djimirji"],
"app": "djimirji upvote bot"
}
//console.log(body);
golos.broadcast.comment(postingkey, parentAuthor, parentPermlink, author, permlink, title, body, jsonMetadata, function(err, result) {
if (!err) {
console.log("comment", parentAuthor, parentPermlink);
}
else console.error(err);
});
pause = pause - 21000;
};
// =================== Конец добавления коментария =========================
// =================== Голосование =========================
let VOTEPOWER = null;
function Vote (parent_author,parent_permlink,voted,author,permlink) {
VOTEPOWER = (Math.floor((Math.random() * 51) + 50));
golos.broadcast.vote(postingkey, REBLOGGER, parent_author, parent_permlink, VOTEPOWER * 100, function(err, result) {
//console.log(err,result);
if (!err) {
console.log("voting", parent_author, parent_permlink);
};
});
if (voted == 0) {
body = "💡 @" + parent_author + " получил апвоут на " + VOTEPOWER +"% :)";
CommentAdd(author,permlink,body,VOTEPOWER);
}
else if (voted == 1){
body = "💡 Уже up-нуто :)";
CommentAdd(author,permlink,body,VOTEPOWER);
}
else{
console.log("А что я тут делаю?");
}
}
// =================== Конец голосования =========================
// =================== Проверка на апвоут =========================
function UpVoteCheck (author,permlink,url) {
let upvoted = null;
let str = url.split('#')[0];
str = str.split('@')[1];
let pauthor = str.split('/')[0];
let plink = str.split('/')[1];
// console.log(upvoted);
pause = pause + 21000;
Vote (pauthor,plink,upvoted,author,permlink);
};
// =================== Конец проверки на апвоут =========================
//=================== Проверка на ответ коментария =========================
function CheckReply (parentAuthor,parentPermlink,author,permlink){
golos.api.getContentReplies(parentAuthor, parentPermlink, function(err, result) {
//console.log(err,result);
if (!err) {
for (let f of result) {
if ((f.author == REBLOGGER) && (f.json_metadata.indexOf("djimirji upvote bot") >= 0)) {
// console.log("Уже коментарий есть");
// pause = pause - 21000;
}
else {
setTimeout(() => {
UpVoteCheck(author,permlink,f.url);
},21000);
console.log("Пишу коментарий",pauthor,plink);
};
};
};
};
//=================== Конец проверки на ответ коментария =========================
// =================== Проверка коментариев =========================
//let i_comments = [];
function CommentsCheck (CommCheckAuthor, CommCheckLink) {
// console.log("Нужен камент", f.author,f.permlink);
// pause = pause + 21000;
setTimeout(() => {
UpVoteCheck(f.author,f.permlink,f.url);
}, 21000);
// console.log("Нужна проверка не оставлялся ли камент",f.author,f.permlink);
// UpVoteCheck(f.author,f.permlink,f.url);
// pause = pause + 21000;
CheckReply (f.author,f.permlink,f.url);
CommentsCheck (f.author,f.permlink);
}
else {
CommentsCheck (f.author,f.permlink);
};
};
});
};
// =================== Конец проверки коментариев =========================
// =================== Получение блогов =========================
var d = new Date();
d.setDate((d.getDate() - fromdate));
var dt = d.toISOString().split('.')[0];
function getEachBlog(follower) {
let author = follower;
let startPermlink = '';
let beforeDate = dt;
let limit = 3;
};
// =================== Конец получения постов из блогов =========================
function getblogs (i_followers)
{
for (i=0;i<i_followers.length;i++)
{
getEachBlog(i_followers[i]);
}
i_followers = null;
}
// =================== Получения подписчиков =========================
/**
*/
var startFollower = '';
var followType = 'blog';
var limit = 100;
let i_followers = [];
let lastFollower = '';
const getfollowers = (startFollower) =>
{
golos.api.getFollowers(following, startFollower, followType, limit, function(err, result)
{
if ( ! err)
{
for (let f of result)
{
i_followers.push(f.follower);
};
//pause = pause + 1000;
}
else
{
getfollowers(lastFollower);
};
// =================== Конец функции получения подписчиков =========================
// =====================================================================
// =====================================================================
// ============= Программа ============================
function runBot () {
getfollowers();
console.log("Пауза", pause);
/*
setTimeout(()=>{
if (i_comments.length != 0) {
*/
setTimeout(runBot, pause + 20000 );
}
runBot();
Ничего себе!!! Попробуй разберись!
Выкладывайте исходники в опенсорс. Добавим вашего бота сюда - chainstore.io
Спасибо. Стыдно мне такой код куда-либо добавлять )))
Коллективно допилим))
Спасибо.. Я учусь, потому так кострубато.. Больше всего доставляют проблем асинхронные функции в апи. Надеюсь я их поборю )))
@djimirji Поставлю Ап! Старайся пиши, по больше разрабов приложений и ботов в голос, выложи исходники на гитхаб, может коллективно придумаем что)
Спасибо.
Желаю удачи. Буду следить за успехами.
Спасибо. На тесте работало... Сейчас пробую, гдето косячит (((
@vik 100%