Вы можете получить безвоздмездно 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.io/@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();