如何用ruby写自动按赞的脚本

in cn •  7 months ago

ruby.png

发现这里很多Python的教材,却很少Ruby 的教材,但本人又是比较常写Ruby 脚本的程序员, 所以就写了一个。

要用Ruby 在Steemit 帮忙自动在适当的时间按赞,可以用 @inertia 开发的 radiator 库

https://github.com/inertia186/radiator

以下来讲解大概如何使用radiator 写一个简单的自动按赞脚本。

require 'radiator'

首先,需要instantiate 一个 stream 的object

stream  = Radiator::Stream.new

因为要setup 一个stream operation 的event loop 如下

stream.operations(:comment) do |op|

end

那么有新帖子就会进入上面那个block, op 的properties里会有包含作者,时间,标题,等等的讯息。


接下来,我们要检查 op["parent_author"] 是否是空, 因为不要vote comment,
如果不是comment,我们再检查作者 op["author"] 是否是我们要vote 的对象。

遇到可以vote的帖子后,
先不要急着vote, 因为我们要等帖子至少要 25分钟的熟度,不然作者拿完 (但又不可以太迟,因为会被别人抢先 ), 所以牺牲5分钟无所谓。

我们先把帖子塞进一个queue 里, 待会而在 process_votequeue 时检查queue的头是否到钟vote 了。

if op["parent_author"] == "" && @popular_fellows.index(op["author"]) != nil 
                    
    votable = {}
    votable[:author]    = op["author"] 
    votable[:permlink]  = op["permlink"]

    # To vote after 25 minutes
    votable[:votetime]  = Time.now.to_i + 25 * 60 
    @vote_queue << votable

    puts "#{ Time.now().strftime("%Y%m%d.%H%M%S") } (#{ Time.now.to_i }) : Queued : #{ votable.inspect }"
end
process_votequeue(api)


然后我们的 process_votequeue 如下, 基本上每次只需要检查queue 的头是否到钟了。 如果到钟就vote ,还没到就什么都别做。
如果有做什么, 就把做掉的element 从 queue 里 shift 掉

def process_votequeue( api )

    if @vote_queue.length > 0

        votable = @vote_queue[0]
        
        if Time.now.to_i >= votable[:votetime]
            @voters.each { |v|
                vote( votable[:author], v["user"], v["wif"], votable[:permlink] )
                sleep 3
            }
            @vote_queue.shift
        end 
    end             
end

然后我们的 vote 的函数如下。 这个函数是可以独立使用的。

def vote( author, voter, voter_wif , permlink )  

    puts "#{voter} to vote for #{author}"

    begin
        tx = Radiator::Transaction.new(wif: voter_wif)
        vote = {
          type: :vote,
          voter: voter,
          author: author,
          permlink: permlink,
          weight: 10000
        }

        tx.operations << vote
        tx.process(true)

    rescue Exception => ex
        puts "\n Failed to vote for #{author}. Error #{ex.to_s}"
    end 
end

接下来要写一个 config file 放们所有要用到账号的wif 。所以准备一个config.json 如下。 把user01 和 wif 改成你自己的,
还有popular_fellows 改成你想vote 的对象。

{
    "voters":[
        {
            "user":"user01",
            "wif":"wif"
        },
        {
            "user":"user02",
            "wif":"wif02"
        }
    ],
    "popular_fellows": [
        "sweetsssj",
        "stan",
        "dollarvigilante",
        "ats-david",
        "kingscrown",
        "jerrybanfield"
    ]
}

在写一个简单读取config 的函数

def populate_voters
    
    @voters = []
    @popular_fellows = []

    begin
        config = JSON.parse( open("config.json").read() )
        @voters             = config["voters"]
        @popular_fellows    = config["popular_fellows"]

    rescue Exception => ex
        puts ex.to_s
    end

end

完成了。 完整的代码可以在我的github 找到

https://github.com/tensaix2j/steemit_star_bot


要跑的话, 用

ruby vote_popular_fellow.rb 

就可以了。 要放在background 可以用 nohup。

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

@tensaix2j, 程序猿改变世界!

Thank you tensaix2j for making a transfer to me for an upvote of 4.32% on this post!

Half of your bid goes to @budgets which funds growth projects for Steem like our top 25 posts on Steem!

The other half helps holders of Steem power earn about 60% APR on a delegation to me!

For help, will you please visit https://jerrybanfield.com/contact/ because I check my discord server daily?

To learn more about Steem, will you please use http://steem.guide/ because this URL forwards to my most recently updated complete Steem tutorial?

You got a 0.72% upvote from @postpromoter courtesy of @tensaix2j!

Want to promote your posts too? Check out the Steem Bot Tracker website for more info. If you would like to support the development of @postpromoter and the bot tracker please vote for @yabapmatt for witness!