bash-скрипт для автоматической публикации фида

2 года назад

В таблице делегатов на Стимуле часто вижу, что некоторые делегаты фиды публикуют с большими задержками:

Да, может сейчас это на так важно с технической точки зрения (пока токены голоса не торгуются на бирже), но я считаю, что активные делегаты должны подавать хороший пример остальному сообществу и уже сейчас публикация фидов не должна превышать 2-3 часов.

Конечно же, каждые 2 часа заходить в cli_wallet и выполнять команду publish_feed программисту лень, поэтому я написал простенький bash-скрипт.

Закинул скрипт на github. Исходный код:

#!/bin/bash

# cli_wallet --rpc-http-endpoint url
WALLET=http://127.0.0.1:8093

# cli_wallet unlock password
PASSWORD="PASSWORD"

# publish_feed nickname:
NICKNAME="xtar"


function is_locked {
    LOCKED=`curl -s --data-binary '{"id":"1","method":"is_locked","params":[""]}' "$WALLET" | jq -r '.result'`
}

function checkLockAndExit {
    if [ "$EXITLOCK" = true ]; then
        echo -n "Locking wallet again..."
        curl -s --data-binary '{"id":0,"method":"lock","params":[]}' "$WALLET" > /dev/null
        echo ""
        echo "Locked."
    fi
}

is_locked
if [ "$LOCKED" == "true" ]; then
    EXITLOCK=true
    echo -n "Wallet is locked. Trying to unlock..."
    curl -s --data-binary '{"id":"1","method":"unlock","params":["'"$PASSWORD"'"]}' "$WALLET" > /dev/null
    echo ""
    is_locked
    if [ "$LOCKED" == "true" ]; then
        echo "Can't unlock wallet, exiting."
        checkLockAndExit        
    else
        echo "Wallet unlocked."
    fi
else
    if [ "$LOCKED" == "false" ]; then
        EXITLOCK=false
        echo "Wallet was unlocked before."
    else
        echo "Some error. Is cli_wallet running? Exit."
        exit
    fi
fi

# примерно раз в 60 минут обновлять фид
RANGE=60
number=$RANDOM
let "number %= $RANGE"
if [ $number -eq 30 ]; then
    BASE="1.000"
    QUOTE=`curl -s "http://www.steeme.ru/gf.html?mode=feed"`
    PUB=`curl -s --data-binary '{"id":"2","method":"publish_feed","params":["'"$NICKNAME"'",{"base":"'"$BASE GBG"'", "quote":"'"$QUOTE GOLOS"'"}, true],"jsonrpc":"2.0"}' "$WALLET" | jq -r '.id'`
    if [ $PUB -eq 2 ]; then
        echo "Feed was updated successfully. 'base'=${BASE} 'quote'=${QUOTE}"       
    else
        echo "Some error. Feed wasn't updated."     
    fi
fi

checkLockAndExit

Первая половина скрипта занимается разблокировкой кошелька cli_wallet (если он был до этого заблокирован) и снизу кусок кода примерно раз в час публикует фид.

Скрипт нужно засунуть в крон, на ежеминутное выполнение. Для этого добавьте в файл /etc/crontab строку

* * * * * /path/to/sh/pub.sh

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

while true ; do
    curl -s --data-binary '{"id":"1","method":"publish_feed","params":["'"$NICKNAME"'",{"base":"0.100 GBG", "quote":"1.000 GOLOS"}, true],"jsonrpc":"2.0"}' "$WALLET" > /dev/null
    # генерируем случайное число от 1 до 60
    RANGE=60
    number=$RANDOM
    let "number %= $RANGE"
    sleep "${number}m"
done

Чтоб не напрягать блокчейн одновременной отправкой десятков запросов, скрипт каждую минуту генерирует случайное число от 1 до 60. Если число = 30, то команда publish_feed выполняется.

Пока что значения base и quote фиксированы.
"base":"0.100 GBG", "quote":"1.000 GOLOS"

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

Можете свободно форкать и делать изменения.

Требования к серверу

Для парсинга json-ответов от API в скрипте используется утилита jq. Устанавливаем командой:

sudo apt-get install jq

Необходимо, чтоб был запущен cli_wallet (не обязательно его разблокировать, скрипт это сделает сам).

./cli_wallet --server-rpc-endpoint="ws://127.0.0.1:9090" --rpc-endpoint 127.0.0.1:8093

Не забудьте поменять значения переменных с паролем и ником вашего делегата.

Авторы получают вознаграждение, когда пользователи голосуют за их посты.
Голосующие читатели также получают вознаграждение за свой голос.
Порядок сортировки:  Популярное
67
  ·  2 года назад

Сейчас как раз пилю скрипт, который будет обновлять фиды исходя из собранной на ICO суммы. Отпишу тебе потом в ЛС, затестишь)
вопрос - зачем ты делаешь апдэйт витнесс?

·

Ой, то было закомментировано. Стёр, чтоб не смущало. В скрипте только разблокировка кошелька и publish_feed. Апдейт в прошлом моём скрипте задействован.

Обновил скрипт на гитхабе. Теперь берет quote из http://www.steeme.ru/gf.html?mode=feed

Спасибо @primus за сервис с актуальной ценой! Его пост о сервисе: https://golos.io/ru--golos/@primus/onlain-monitoring-kraudseila-skolko-golosov-vy-mozhete-kupit-za-1000-rublei-ili-1-btc-plyus-avtomatizaciya-prais-fidov-dlya

65
  ·  2 года назад

Хоть я сейчас и не в 19, но спасибо за скрипт :))

·
75
  ·  2 года назад

Всё равно иногда у тебя цену спрашивают. :)

·
·
65
  ·  2 года назад

:)) я ее обновляю несколько раз в сутки :))

·
·
·

Скрипт работает даже когда ты спишь)

75
  ·  2 года назад

"Скрипт нужно засунуть в крон, на ежеминутное выполнение. Либо, если не хотите связываться с кроном, можно засунуть кусок кода с публикацией в бесконечный цикл с минутной паузой."
А можно этот момент чуть подробнее для тех, кто Линукс видит первый раз? Что такое крон или как сделать цикл?

·

Эмм, думал делегаты видят линукс хотя бы второй раз) Ок, допишу подробностей.

·
·
75
  ·  2 года назад

Да, ща скрипт буду запускать - увижу второй раз. :) У меня, кстати, одна нода на винде крутится.

76
  ·  2 года назад

Пока нет автоматической подгрузки цены из внешнего источника, будет лучше вынести значения вверх в переменные настройки - что-бы ручками было удобнее цену обновлять

·

А обновлять ручками никто и не будет. Скоро ICO, цена будет вычисляться математически исходя из суммы собранных средств.

Всем - привет! Делегаты - это те, кто майнит?
Как можно помочь с майнингом для Голоса?