📌 Reblogger.JS - Скрипт для автоматического реблога подписчиков с учетом выбранных тегов (Исходный код + Урок)
Скрипт был написан по просьбе @siberianshamen для аккаунта @upvote50-50 но может применяться для любых аккаунтов на голосе или steem
Алгоритм работы
Владелец указывает желаемые теги, аккаунт-фильтр, текст комментария, силу голоса и блог в который будут совершаться реблоги.
Далее скрипт автоматически получает список пользователей на которых подписан аккаунт-фильтр и делает реблоги их постов в котором есть один из указанных тегов. После реблога бот оставит комментарий с указанным текстом и проголосует за пост с указанной силой.
Установка и настройка
Вы можете разместить скрипт на моем сервере или запустить на собственном пк
Просто скачайте reblog.js с репозитория https://github.com/vikxx/RebloggerJS-
У вас должен быть установлен nodejs
Далее в консоли nodejs, в папке со скриптом, выполните команду для
установки JavaScript библиотеки голоса:
npm install golos-js
Отредактируйте файл Reblogger.JS добавив сосбственные параметры:
Постинг ключ аккаунта, который будет делать реблоги
const postingkey = "5***********************************************************"
Фильтр тэгов, "REBLOGGER" будет делать реблог, только если в посте будут указанные тэги
Массив можно оставить пустым - [], тогда будут учтены любые тэги в постах
const TAGS = ['ru--golos','ru--apvot50-50','ru--interesnoe']
Белый список авторов, постам которых мы будет делать реблог в блог "REBLOGGER"!
К этому списку будут автоматически добавлены все, на кого будет подписан "accountfilter"!
let blogs = ['vik','robot']
Логин аккаунта который будет делать реблоги в свой блог
const REBLOGGER = "upvote50-50"
Логин аккаунта который должен подписывать на пользователей, чтобы их имена попали в белый список!
Можно оставить пустым, тогда белый список будет браться из переменной выше - "blogs"
const accountfilter = "upvote50-50"
Текст комментария под постом, которому вы сделали реблог. Можно использовать markdown
const COMMENT = "💡 **${REBLOGGER} сделал реблог :)**"
Заголовок комментария - виден в уведомлениях и при приямой ссылке на комментарий
const TITLE = "Тест работы реблоггера"
Вес голоса за пост которому вы сделали реблог. 100% = 10000 , 50% = 5000 и т.д.
const VOTEPOWER = 10000
Адрес ноды для связи с блокчейном голоса
Если у вас не установлена локальная нода, адрес следует изменить на адрес публичной ноды.
Например "wss://api.golos.cf" - нода @vik
const GOLOSNODE = "ws://localhost:9090"
После указания настроек вы можете запустить скрипт в консоли командой
node reblog.js
Автоматизировать реблоги можно добавив скрипт в CRON (или в PM2 предварительно обернув в setInterval).
P.S. вы так же можете добавить ноду Steem , chain_id и префикс и скрипт будет работать на STEEM
Результат работы:
Исходный код и урок по созданию
Ниже я последовательно буду приводить фрагменты кода с подробным описанием функций, но сначала, для простоты восприятия приведу весь код в виде скриншота
Описание кода
Подключение JavaScript библиотеки для работы API голоса
const golos = require('golos-js')
Указываем ноду, к которой будет подключен скрипт
golos.config.set('websocket', GOLOSNODE)
Глобальная переменная в которой будут хранится все ссылки на реблоги из блока Аккаунта, для дальнейшей сверки с постами. Это нужно для исключения из процесса реблогинга старых постов, которым аккаунт уже сделал реблог ранее
let urls = []
Если задан аккаунт для формирования белого списка из подписок выполним следующее:
if (accountfilter) {
Узнаем на какое количество пользователей подписан аккаунт-фильтр
golos.api.getFollowCount(accountfilter, (err, count) => {
Если запрос не удался - прервем работу с ошибкой
if (err) return console.warn(err)
Зададим пустую переменную вне цикла
let last = null
Создадим функцию c передаваемым параметром lastname для цикла запросов всех на кого подписался аккаунт-фильтр
const getfollowings = (lastname) => {
Запрашиваем список подписок
Параметр "blog" - указывает на подписки. (Если указать вместо этого параметр ignore - получим тех, кого аккаунт-фильтр добавил в игнор.)
У запроса getFollowing в отличии от getFollowers лимит всего в 100 пользователей, а не 1000. Но если мы запомним последнее имя lastname мы сможем аызвать getFollowing
снова указав стартовое имя. Таким образом циклами по 100 имен мы можем получить список любого количества подписок без лимита
golos.api.getFollowing(accountfilter, lastname, "blog", 100, (errs, followings) => {
Если ошибка - выведем лог в консоль и прервем работу
if (errs) return console.warn(errs)
Если переменая last (есть выше, пока пустая) будет равна имени последнего пользователя из сотни запрошенных в очередном цикле, значит все подписки обработаны и запускаем следующую функцию checkReblogs
if (last === followings[followings.length - 1].following) {
return checkReblogs("", "")
}
IF условие выше сработает только если подписок больше нет
Если подписки есть, то они будут сохраняться в массив blogs
Для этого запустим петлю for of и запишем массив blogs каждого на кого подписался аккаунт-фильтр
for (let z of followings) blogs.push(z.following)
Каждый раз вызавая новую сотню имен - будем записывать последнее имя в переменную last
last = followings[followings.length - 1].following
Когда очередная сотня обработана , запросим следующую сделав отправным именем для запроса последнее имя из переменной last
getfollowings(last)
})
}
Ниже первый запуск функции getfollowings, переменная last в нем еще пустая
getfollowings(last)
})
Если аккаунт-фильтр не задан, то просто запустим функцию checkReblogs
} else {
checkReblogs("", "")
}
Создаем функцию checkReblogs с возможностью передавать в нее при запуске две переменные lastauthor,lastpermlink
let checkReblogs = (lastauthor, lastpermlink) => {
Создадим параметры для запроса к api в котором укажем переменные с аккаунтом реблогера, выбранными тегами, максимальным для этого запроса лимитом - 100
А так же стартового автора и стартовую ссылку поста
let query = {
"select_authors": [REBLOGGER],
"select_tags": TAGS,
"limit": 100,
"start_author": lastauthor,
"start_permlink": lastpermlink
}
Теперь отправляем запрос с указанными парамертами используя API вызов getDiscussionsByBlog
Это позволит получить нам до 100 записей из блогов select_authors в которых есть select_tags начиная с start_author и start_permlink, они пока что пустые и запрос нам выдаст последние 100 постов. Чтобы получить 101 и так далее посты, мы будем шагать циклами по 100
Каждый раз указывая start_author и start_permlink последнего автора и ссылку из прошлого запроса
golos.api.getDiscussionsByBlog(query, (e, blogposts) => {
if (e) return console.warn(e)
Если в блоге реблоггера нет постов и реблогов - сразу вызовем функция реблогинга
if (!blogposts[0]) return reblog(blogs)
А иначе будет проверять и запоминать содержимое блога
Зададим переменную "c" c нулем
let c = 0
Создадим петлю при каждом цикле которой мы будем получать данные одного отдельного поста и сохранять их в переменную u
for (u of blogposts) {
Мы возмем данные поста url и будем добавлять их в массив urls
urls.push(u.url)
*Ниже за пределами функции есть переменная с плюсами "c++" - это увеличивает значение в ней на 1 при каждом витке
Это помогает считать количество ссылок, которые мы сохранили в urls
Ниже условие if помогает нам реагировать на то, когда наш "с" будет равна последней ссылке.
Это будет значить, что мы обработали очередную порцию ссылок из нашего лимитированного запроса (лимит был 100)
if (c === blogposts.length - 1) {
**Пропустите вглядом строки ниже до функции checkReblogs(u.author,u.permlink)
С ее помощью мы рекурсивно запускаем снова функцию checkReblogs на этот раз передав в нее последнее имя и ссылку автора и следующий виток в 100 ссылок будет начинать уже с последнего автора и ссылки в прошлом витке, таким образом мы можем просмотреть все ссылки в блоге аккаунта реблоггера не смотря на лимит в 100 постов.
Чтобы определить когда мы достигнем последнего поста и перестать прервать бесконечный цикл checkReblogs мы проверим, когда последние ссылка и автор последнего запроса будет такие же как и первые автор и ссылка следующего запроса
if (lastauthor + lastpermlink === u.author + u.permlink) {
Если они равны - стало быть мы просмотрели весь блог и можно приступать к следующей функции. reblog(blogs)
В переменной blogs мы передали список логинов из белого списка посты которых подлежат реблогам
reblog(blogs)
Не забываем остановить отслужившую нам функцию checkReblogs с помощью return
return
**Запуск checkReblogs описанный ранее
checkReblogs(u.author, u.permlink)
}
Увеличение на +1 (*Было описано ранее)
c++
}
})
}
Описание функции которую мы вызвали выше
В переменную users мы записали содердимое переменной blogs -reblog(blogs)
const reblog = users => {
Делаем знакомый запрос на получение постов
Но теперь select_authors у нас содержит всех users и мы получим 100 последних постов авторы которых есть в списке users и в которых есть тег из указанной переменной TAGS
golos.api.getDiscussionsByBlog({
"select_authors": users,
"select_tags": TAGS,
"limit": 100
}, (err, blog) => {
if (err) return console.log(err)
Создаем глобальную переменную с нулем, это пригодится нам в будущем для учета количества репостов и формирования отсрочки комментария
let count = 0
Создаем цикл для обработки каждого поста из полученной сотни
for (post of blog) {
const author = post.author
const permlink = post.permlink
const title = post.title
const link = post.url
Проверяем есть ли ссылка текущего поста в блоге реблоггера.
if (urls.includes(link)) {
Если ссылка есть - стало быть мы уже делали реблог, в этом случае не будет ничего делать
Если же ссылки нет, тогда будет делать реблог с помощью кода ниже
} else {
Сначала запишем немного JSON который будет отправлять в ноду, чтобы сделать реблог
Мы расставим переменные так, чтобы в json был аккаунт реблогера + логин и ссылка на пост которому нужно сделать реблог.
const json = JSON.stringify(
["reblog", {
account: REBLOGGER,
author: author,
permlink: permlink
}]
)
Далее используем функцию бродкаста в Golos API и отправим операцию custom_json в блокчейн
golos.broadcast.customJson(postingkey, [],
[REBLOGGER], "follow", json, (err, result) => {
if (err) return
После того, как мы сделали репост, отправим комментарий пользователю и проголосуем за его пост
Но здесь проблема, если делать реблоги мы можем сотням аккаунтов в секунду, то оставлять комментарии, не более раза в 20 секунд.
Таким образом нам нужно задать острочку в 20 секунд для каждого комментария
setTimeout(() => {
Подпишем в jsonmetada наш скрипт, это полезно для аналитики платформы
let jsonMetadata = {
"tags": ["vik"],
"app": "vik reblogger script ✉️ t.me/@chain_cf"
}
Cохраним временной штамп в переменную, его будем делать "хвостом ссылки"
Это необходимо, чтобы сделать каждую ссылку уникальной
let timestamp = Date.now();
Отправляем комментарий с зараннее подготовленными в настройках скрипта параметрами
golos.broadcast.comment(postingkey, author,
permlink, REBLOGGER,
'comment-from-' + REBLOGGER + timestamp,
TITLE,
COMMENT,
jsonMetadata, (err, result) => {
if (err) return
При каждом сработанном комментарии увеличиваем переменную на +1
Голосуем за пост, которому сделали репост
golos.broadcast.vote(postingkey, REBLOGGER,
author, permlink, VOTEPOWER);
})
Увеличиваем отсрочку каждого комментария, чтобы публиковать его не чаще, чем 1 раз в 21 секунду
}, count * 21000)
count++
})
}
}
})
}