Вы можете получить безвоздмездно UpVote. Для этого достаточно подписаться на меня @djimirji (и не только) и в коментарии к своему посту указать @djimirji up!
Ух и много же времени у меня заняло написание такого бота.
Первая версия ( https://golos.io/ru--golos/@djimirji/kak-ya-pytalsya-napisat-bot ) оказалась работоспособной, но "глючной". Бот нормально отрабатывал только тогда, когда в промежуток поиска вызова попадал только один запрос. В случае же с попаданием более одного запроса асинхронность вступала в действие ((( Побороть ее к сожалению у меня пока не хватает умения и знаний. Понимание как работает async await пришло, а вот как работать с Promise так до меня и не дошло... Возможно из этого апи https://github.com/GolosChain/golos-js/ заюзать Promise и нельзя.. Но опять же я не смог разобраться.
Логика мне подсказывает, что node.js на асинхнронность и заточен, и выходить из асинхронно кода в синхронный не особо правильно. Но моих навыков пока не хватает оставаться в асинхронном коде до конца. Ну что же пока так.
В итоге куча костылей и пауз и сумашедший код готов!
// У вас должен быть установлен nodejs
// Установите зависимости для скрипта командой npm install golos-js
// =====================================================================
// Автор
https://golos.id/@djimirji/
// =====================================================================
// Логин и пароль(постинг ключ) аккаунта который будет делать реблоги в свой блог
const votersSemiBot = [
{user:"1", userpwd:"5.........................."},
{user:"2", userpwd:"5.........................."},
{user:"3", userpwd:"5.........................."}
];
// Логин аккаунта на который должены подписываться пользователи, что бы их имена попали в белый список!
const mainBot = 'djimirji';
//Вызов бота
const UpVoteCall = '@djimirji up!';
// ======================= Коннект ==========================
//const GOLOSNODE = "ws://localhost:9090"
const GOLOSNODE = "wss://api.golos.cf"; //нода
@vik
// Подключение 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
}
// =================== Конец удаления дублей ========================
//##########################################################################
// =================== Получение блогов =========================
function getEachBlog(follower) {
let d = new Date();
let dt = d.toISOString().split('.')[0];
let author = follower;
let startPermlink = '';
let beforeDate = dt;
let limit = 3;
return golos.api.getDiscussionsByAuthorBeforeDate(author, startPermlink, beforeDate, limit, async function(err, result) {
});
};
// =================== Конец получения постов из блогов =========================
//##########################################################################
//##########################################################################
// =================== Получения подписчиков =========================
var startFollower = '';
var followType = 'blog';
var limit = 100;
let i_followers = [];
let lastFollower = '';
const getfollowers = (startFollower) => {
golos.api.getFollowers(mainBot, startFollower, followType, limit, function(err, result) {
if ( ! err) {
for (let f of result){
i_followers.push(f.follower);
};
lastFollower = i_followers[i_followers.length - 1];
};
if (startFollower === i_followers[i_followers.length - 1]) {
//console.log("Всех выбрали");
i_followers = removeDuplicates(i_followers);
setTimeout(() => {
getblogs(i_followers);
},1000);
}
else {
getfollowers(lastFollower);
};
});
};
// =================== Конец функции получения подписчиков =========================
//##########################################################################
// =================== Получение коментариев =========================
function CallCommFromBlog (CommCheckAuthor, CommCheckLink) {
async function GetComments (CommCheckAuthor, CommCheckLink, commchildren) {
function i_GetComments (Author, Link) {
return golos.api.getContentReplies(Author, Link,function(err, result) { });
};
let FirstLevel = await i_GetComments (CommCheckAuthor, CommCheckLink);
if (FirstLevel != null) {
for (let i of FirstLevel){
//console.log(i.author, i.body);
if (i.children == 5){
await GetComments (i.author, i.permlink, i.children + 10);
//console.log("5 дочерних каментов");
}
else if (i.children > 0){
await GetComments (i.author, i.permlink, commchildren);
//console.log("дочерних каментов", i.children);
}
else {};
if (i.body.toLowerCase().search(UpVoteCall) != '-1'){
//console.log("Найден запрос", i.url, commchildren);
let findedcall = '';
if (commchildren > 10){
findedcall = await i_GetComments (i.parent_author, i.parent_permlink);
add_comm_to_array = {
url: i.url,
author: i.parent_author,
permlink: i.parent_permlink,
body: i.body
}
}
else {
findedcall = await i_GetComments (i.author, i.permlink);
add_comm_to_array = {
url: i.url,
author: i.author,
permlink: i.permlink,
body: i.body
}
}
if ( findedcall != '' ) {
let checkanswer = [];
let str = "";
for (let f of findedcall ){
str = f.json_metadata.split(',"app":')[1];
str = str.substring(0, str.length - 2);
str = str.substring(1)
checkanswer.push(str);
}
if (checkanswer.includes("djimirji upvote bot")){
//console.log("Прокоментировано");
}
else {
all_Comments_From_Blog.push(add_comm_to_array);
//console.log("Коментарий не оставлен");
};
}
else {
all_Comments_From_Blog.push(add_comm_to_array);
//console.log("Коментарий не оставлен");
};
}
}
}
else {
return;
};
}
GetComments (CommCheckAuthor, CommCheckLink, 0);
};
//CallCommFromBlog('lilia', 'start-kotofoto-estafeta');
//CallCommFromBlog('first1by', 'streamity-obzor');
//
https://golos.io/ico/@first1by/streamity-obzor#comments
let all_Comments_From_Blog = [];
function fill_call_bot (fill) {
all_Comments_From_Blog.push(fill);
};
// =================== Конец получения коментариев =========================
// =================== Проверка на апвоут ================================
function UpVoteCheck (url) {
let str = url.split('#')[0];
str = str.split('@')[1];
let pauthor = str.split('/')[0];
let plink = str.split('/')[1];
return golos.api.getActiveVotes(pauthor, plink, function(err, result) {
});
};
// =================== Конец проверки на апвоут =========================
//##########################################################################
// =================== Коментарий ================================
function CommentAdd (parentAuthor, parentPermlink,body,p) {
let postingkey = votersSemiBot[0].userpwd;
let permlink = 're-' + parentAuthor + '-' + parentPermlink + '-' + Date.now();
let title = '';
let jsonMetadata = {
"tags": ["djimirji"],
"app": "djimirji upvote bot"
}
setTimeout(() => {
console.log("Коментирую",parentAuthor,body);
return golos.broadcast.comment(postingkey, parentAuthor, parentPermlink, mainBot, permlink, title, body, jsonMetadata, function(err, result) {
});
},p);
};
// =================== Конец кометария =============================
// =================== Голосование =========================
function Vote (parent_author,parent_permlink,VOTEPOWER,postingkey,author,p) {
setTimeout(() => {
console.log("ГОЛОСУЮ",author, parent_author);
return golos.broadcast.vote(postingkey, author, parent_author, parent_permlink, VOTEPOWER * 100, function(err, result) {
});
},p);
};
// =================== Конец голосования =========================
//################################################################################
//##########################################################################
//##########################################################################
//##########################################################################
var end_of_check_all_comments = '';
async function getblogs (i_followers) {
let allblogs = [];
for (i=0;i<i_followers.length;i++){
let carentBlog = await getEachBlog(i_followers[i]);
if (carentBlog != null) {
carentBlog.forEach(function(item){
//console.log(item.author);
blg = {
author: item.author,
permlink: item.permlink
}
allblogs.push(blg);
});
}
if (i == i_followers.length -1 ){
i_followers = []; //Чистим массив подписчиков
//console.log("Всего блогов",allblogs.length);
for (k=0;k < allblogs.length;k++){
CallCommFromBlog(allblogs[k].author, allblogs[k].permlink);
if (k == allblogs.length - 1){
//console.log(allblogs);
allblogs = []; //Чистим массив блогов
end_of_check_all_comments = 'end';
};
};
};
};
}
//getblogs(['faalex']);
function runBot() {
getfollowers();
async function BroadcastCommentAndVote () {
let p = 0;
for (z=0;z < all_Comments_From_Blog.length;z++){
p = z * 21000;
let upvoted = '';
let body = '';
let VOTEPOWER = '';
let str = all_Comments_From_Blog[z].url.split('#')[0];
str = str.split('@')[1];
let pauthor = str.split('/')[0];
let plink = str.split('/')[1];
let votecheck = await UpVoteCheck (all_Comments_From_Blog[z].url);
let voters = [];
votecheck.forEach(function(item) {
voters.push(item.voter);
})
if (voters.includes(mainBot)) {
upvoted = 1;
}
else {
upvoted = 0;
}
votersSemiBot.forEach(function (v) {
console.log(p);
if ((upvoted != 0) && (v.user == mainBot)){
body = "💡 Этот пост уже получал upvote ранее :)";
CommentAdd (all_Comments_From_Blog[z].author, all_Comments_From_Blog[z].permlink,body,p);
return console.log(`\x1b[31m☹️ ${body} - ${all_Comments_From_Blog[z].author} - ${all_Comments_From_Blog[z].permlink} \x1b[0m`);
}
else {
if (v.user == mainBot){
VOTEPOWER = (Math.floor((Math.random() * 50) + 50));
body = "💡 @" + pauthor + " получил апвоут на " + VOTEPOWER +"% :)";
CommentAdd (all_Comments_From_Blog[z].author, all_Comments_From_Blog[z].permlink,body,p);
Vote(pauthor,plink,VOTEPOWER,v.userpwd,v.user,p);
return console.log(`\x1b[96m💬 ${v.user} коментирует и голосует за ${pauthor}, по ссылке - ${plink} \x1b[0m`);
}
else {
VOTEPOWER = 100;
Vote(pauthor,plink,VOTEPOWER,v.userpwd,v.user,p);
return console.log(`\x1b[32m🔗 Голосует доп.аккаунт: ${v.user} силой ${VOTEPOWER}, за ${pauthor}, статья: ${plink} \x1b[0m`);
}
};
});
};
pause = all_Comments_From_Blog.length * 21000;
setTimeout(() => {
all_Comments_From_Blog = [];
end_of_check_all_comments = '';
console.log("Пауза", pause);
runBot();
}, pause + 70000);
}
function checkArrayEmptines (){
if (end_of_check_all_comments == 'end') {
//console.log("Коментарии обработаны");
setTimeout(() => {
BroadcastCommentAndVote();
}, 5000);
}
else {
setTimeout(checkArrayEmptines, 1000);
//console.log("Не все проверено, ждем");
}
}
checkArrayEmptines();
}
runBot();
Бот - это клево.
Но код трудночитаемый получился
Может хотя бы Pastebin?
Спасибо.
Не знал о таком.
https://pastebin.com/ABvGxwA9
Вот теперь совсем другое дело же!
Спасибо, за подсказку. Когда добавлял в едиторе выглядело боль мень. А на самом деле все слилось.
Используйте теги маркдаун для написания постов
Спасибо. В будущем буду использовать. Проблема в том, что при создании поста все выглядело приемлемо, а потом скоряжело все в то что имеем.
Я выложил код сюда https://pastebin.com/Cu2Q6tBR
Добавлю, что, тут дело не только в трудности чтения. Если бы это был просто текст то можно было бы пережить. Но проблема в том. что часть символов в коде может быть принята сайтом за разметку и не будет показана. А это уже чревато.
Например:
один два три - вы увидите курсив, но на самом деле тут написано
*один два три*
Но то что были звездочки вы никогда не узнаете. Так и из кода может что то пропасть
Я понимаю. Еще раз простите.
Полный код, если кому нужен, можно взять тут https://pastebin.com/Cu2Q6tBR
да я прочитала, но можно же редактировать :))
Это только так кажеться. У меня кнопка "Редактировать" работает для коментариев, но не работает для постов. Проверено в разных браузерах и 2-х компах.
@djimirji Поздравляю с удачным запуском!) Успехов больших!!!
Спасибо )
Хочу еще написать бота возвращающего награды за апвоты, но столкнулся с проблемой https://golos.id/ru--golos/@djimirji/kuda-ukhodyat-zolotoye ... Грядут какие то перемены на голосе, но я пока не понимаю куда и в какую сторону копать.
Вроде хотят на линейку перейти. Прочитала статью. У меня такая же история с одним из постов. Да и не только у меня((
@djimirji Вот статья ещё одна, очень полезная от умнички lindsay: https://golos.id/ru--golos/@lindsay/prokachka-postov-na-golos-io-i-raspredelenie-vyplat
@lilia, а что такое линейка?
Спасибо. Почитал.
Все, что понял - никто не знает куда бежать и что делать.
Но @ropox молодец. Он хоть понимает, что непременно нужно менять систему и даже больше - он пытаеться.
@djimirji На Голосе работает квадратичная функция расчета выплат, а на Стимите линейная функция расчета выплат.
Может статья от гороха поможет разобраться:
https://golos.id/hf/@ropox/khardfork-ot-gorokha
@djimirji, Поздравляю!
Ваш пост был упомянут в моем хит-параде в следующих категориях:
@djimirji Вот это да, попробуй, разберись)
Да, код получился не особо читабелен (https://pastebin.com/ABvGxwA9)
Зато работает )
@djimirji, поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за Количество комментариев
Вы можете нажать на любой бейдж, чтобы увидеть свою страницу на Доске Почета.
Чтобы увидеть больше информации о Доске Почета, нажмите здесь
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
frodogrodno, mp42b, astramar, osra111, odyvanchik
Поэтому я тоже проголосовал за него!
Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!
Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой "!нехочу"
dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:
@djimirji, поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за количество голосов
Вы можете нажать на любой бейдж, чтобы увидеть свою страницу на Доске Почета.
Чтобы увидеть больше информации о Доске Почета, нажмите здесь
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
call @tr1n1t1
Селеба местного разлива)
А как работает этот @tr1n1t1 ?
Какой у него принцип?
Оу, вы меня опередили)
@tr1n1t1
А боту создавшему https://t.me/gacinfobot и иногда пишущему и про программирование, можно в белый список? :-)
Боту?)) Если он, как любят боты, мой призыв на автомат поставит и батарейка будет на дне у меня постоянно, то не) Но если без этого, то да, gacinfobot - оч клевая штука.
А что за бот?)
а вот и она, легка на помине))
Ага.. оказываеться гуг по запросу "golos call @tr1n1t1" выдает первой ссылкой этот пост )
Спасибо. На новых постах обязательно опробую )
А еще вопрос: этот вызов можно сделать из коментария любой вложености или он должен быть первым в цепочке?
Мне интересно, потому как я убил кучу времени на то что бы побороть эту вложеность )
Добавила вас в белый только что, можете попробовать юзнуть)
Буду очень признательна за использование для тех, кто пишет полезности, особенно про программирование - и я буду в курсе, и небольшой подарочек им)
вот она, известность!
да, @tr1n1t1? ;)
а это же бот вика, через телеграм который
вернее @tr1n1t1 не бот, а она сама захотела чтобы ее так могли вызывать
Спасибо. Нашел вот статейку https://golos.id/ru--golos/@tr1n1t1/call-tr1n1t1-teperx-menya-mozhno-prizvatx-i-ya-progolosuyu-na-33
Но как я понял, не все могут вызывать тринити:
Тоесть, я например не могу вызывать ее. Но идея классная. Мне понравилось. )
Согласен.
Ну так и твой бот не все могут вызвать, а только подписчики.
Если выбросить блок логики с подпиской, а вручную добавлять в белый список, будет тоже самое
@vik 100%
@valorin up!
💡 Этот пост уже получал upvote ранее :)