루비로 트위터 로봇 구축
빠른 시작과 실행을 위해 Twitter API를 사용합니다.
배경.
나는 지금 트위터에서 매우 활발하게 활동하고 있다. 나는 로봇이 #100일의 코드를 전달하는 것을 많이 보았다.많은 초보자들이 자바스크립트를 시도하고 JS 커뮤니티에서 도움을 받는다.젠장, 지금은 아무도 루비를 안 쓴다고 생각했어.그러나 사실은 그렇지 않다. 그렇다. 그것을 사용하는 사람은 점점 적어지고 있지만, 그것은 여전히 인기가 있다.그래서 나는 로봇을 만들어서 라벨'루비'나'rails'로 모든 트윗을 전달할 계획이다.이 로봇의 목적은 루비와 라일스 커뮤니티를 단결시키고 초보자들이 루비를 사용하도록 격려하며 서로 돕도록 하는 것이다.
본 강좌에 필요한 기술을 따르다
중급:
너는 마땅히
층계
첫 번째 단계: 루비 파일 만들기
먼저 re tweet service라는 루비 파일을 만듭니다.rb, 우리는 코드/스크립트를 작성하여 트위터에 우리가 원하는 라벨을 전달하도록 지시할 것입니다.
# create a folder to save the bot service
$ mkdir ruby-twitter-bot
# create ruby file
$ cd ruby-twitter-bot
$ mkdir app/services/twitter
$ cd app/services/twitter
$ touch re_tweet_service.rb
무슨 일이 있었죠?app/services/twitter
에 저장합니다.re_tweet_service.rb
을 만들었습니다. 그 다음에 코드를 추가할 것입니다.re_tweet_service.rb
에서 위쪽에 다음 코드를 추가합니다.require 'rubygems'
require 'bundler/setup'
require 'twitter'
무슨 일이 있었죠?require 'twitter'
를 통해 Ruby 응용 프로그램이 트위터gem을 사용하도록 지도하고 있습니다.기밀과 키는git 메모리 라이브러리에 추가할 수 없기 때문에 프로젝트 루트 디렉터리에 폴더
config
를 만들고 트위터 프로그램을 설정할 때 얻은 기밀과 키를 저장할 파일 application.yml
을 추가합니다.# create config folder
$ mkdir config
# create application.yml
$ cd config
$ touch application.yml
이 파일에 다음을 추가합니다.defaults: &defaults
CONSUMER_KEY: '' # API KEY
CONSUMER_SECRET: '' # API KEY SECRET
ACCESS_TOKEN: ''
ACCESS_TOKEN_SECRET: ''
production:
<<: *defaults
현재 설정되지 않은 값의 파일에 트위터 프로그램을 설정한 키와 기밀을 추가합니다.4단계: figaro gem을 사용하여 프로그램을 불러옵니다.yml
Rails를 사용한 적이 있다면, Figarogem에 익숙해져야 합니다. 만약 그렇지 않다면, 다음은 Rails의 기능입니다. 모든 키를
application.yml
에 저장하고 ENV
접근 가능한 프로그램에서 사용할 수 있도록 도와줍니다.다음 코드를
re_tweet_service.rb
에 추가하겠습니다.require 'figaro'
Figaro.application = Figaro::Application.new(
environment: 'production',
path: File.expand_path('config/application.yml')
)
Figaro.load
무슨 일이 있었죠?Figaro.application
코드는 응용 프로그램 불러오기application.yml
폴더에 있는 config
를 알려 줍니다. 그러면 이전 단계에서 설정한 키를 사용할 수 있습니다.다음 항목 추가
re_tweet_service.rb
module Twitter
class ReTweetService
attr_reader :config
def initialize
@config = twitter_api_config
end
def perform
rest_client = configure_rest_client
stream_client = configure_stream_client
end
private
def twitter_api_config
{
consumer_key: ENV['CONSUMER_KEY'],
consumer_secret: ENV['CONSUMER_SECRET'],
access_token: ENV['ACCESS_TOKEN'],
access_token_secret: ENV['ACCESS_TOKEN_SECRET']
}
end
def configure_rest_client
puts 'Configuring Rest Client'
Twitter::REST::Client.new(config)
end
def configure_stream_client
puts 'Configuring Stream Client'
Twitter::Streaming::Client.new(config)
end
end
end
너는 이곳에서 갑자기 무슨 일이 일어났는지 알고 싶을 것이다.Twitter API를 사용하는 두 가지 방법이 있는데 첫 번째는 Rest 클라이언트입니다. Rest 클라이언트는 Twitter, retweet 등 단점을 제공하여 한 번의 작업을 수행합니다. 두 번째는 스트리밍 클라이언트입니다. 스트리밍 클라이언트는 모든 트윗을 실시간으로 처리하고 저희가 잠시 후에 설정한 탭을 관찰합니다. 즉, 스트리밍 클라이언트는 #ruby와 #rails 탭이 있는 트윗을 제공합니다.코드에서 무슨 일이 일어났습니까?
perform
는 Dell이 서비스에서 공개하는 유일한 공통 접근 방식이며 기타 모든 접근 방식을 개인화6단계: 볼 태그 구성
루비와 rails와 관련된 세 가지 라벨을 주목하여 서비스에 다음과 같은 내용을 추가합니다
private
HASHTAGS_TO_WATCH = %w[#rails #ruby #RubyOnRails]
우리는 로봇이 전송하기 시작하면 라벨을 바꿀 필요가 없기 때문에 여기서 상수를 사용한다.7단계: 구성된 태그를 사용하여 트윗 전달
다음 코드를 서비스에 추가합니다. 각 코드 블록을 하나하나 검사하고, 각 코드 블록이 무엇을 하는지 보겠습니다.
def perform
rest_client = configure_rest_client
stream_client = configure_stream_client
while true
puts 'Starting to Retweet 3, 2, 1 ... NOW!'
re_tweet(rest_client, stream_client)
end
end
private
MAXIMUM_HASHTAG_COUNT = 10
def hashtags(tweet)
tweet_hash = tweet.to_h
extended_tweet = tweet_hash[:extended_tweet]
(extended_tweet && extended_tweet[:entities][:hashtags]) || tweet_hash[:entities][:hashtags]
end
def tweet?(tweet)
tweet.is_a?(Twitter::Tweet)
end
def retweet?(tweet)
tweet.retweet?
end
def allowed_hashtags?(tweet)
includes_allowed_hashtags = false
hashtags(tweet).each do |hashtag|
if HASHTAGS_TO_WATCH.map(&:upcase).include?("##{hashtag[:text]&.upcase}")
includes_allowed_hashtags = true
break
end
end
includes_allowed_hashtags
end
def allowed_hashtag_count?(tweet)
hashtags(tweet)&.count <= MAXIMUM_HASHTAG_COUNT
end
def sensitive_tweet?(tweet)
tweet.possibly_sensitive?
end
def should_re_tweet?(tweet)
tweet?(tweet) && !retweet?(tweet) && allowed_hashtag_count?(tweet) && !sensitive_tweet?(tweet) && allowed_hashtags?(tweet)
end
def re_tweet(rest_client, stream_client)
stream_client.filter(:track => HASHTAGS_TO_WATCH.join(',')) do |tweet|
puts "\nCaught the tweet -> #{tweet.text}"
if should_re_tweet?(tweet)
rest_client.retweet tweet
puts "[#{Time.now}] Retweeted successfully!\n"
end
end
rescue StandardError => e
puts "=========Error========\n#{e.message}"
puts "[#{Time.now}] Waiting for 60 seconds ....\n"
sleep 60
end
무슨 일이 있었죠?def perform
rest_client = configure_rest_client
stream_client = configure_stream_client
while true
puts 'Starting to Retweet 3, 2, 1 ... NOW!'
re_tweet(rest_client, stream_client)
end
end
while true
를 사용하고 있습니다.def should_re_tweet?(tweet)
tweet?(tweet) && !retweet?(tweet) && allowed_hashtag_count?(tweet) && !sensitive_tweet?(tweet) && allowed_hashtags?(tweet)
end
def re_tweet(rest_client, stream_client)
stream_client.filter(:track => HASHTAGS_TO_WATCH.join(',')) do |tweet|
puts "\nCaught the tweet -> #{tweet.text}"
if should_re_tweet?(tweet)
rest_client.retweet tweet
puts "[#{Time.now}] Retweeted successfully!\n"
end
end
rescue StandardError => e
puts "=========Error========\n#{e.message}"
puts "[#{Time.now}] Waiting for 60 seconds ....\n"
sleep 60
end
stream_client.filter(:track => HASHTAGS_TO_WATCH.join(','))
각 트윗을 반복적으로 탐색합니다.should_re_tweet?
방법은 트위터 클라이언트로부터 받은 주어진 트윗을 전송해야 하는지 확인하기 위해 다른 방법을 사용합니다.def tweet?(tweet)
tweet.is_a?(Twitter::Tweet)
end
def retweet?(tweet)
tweet.retweet?
end
def sensitive_tweet?(tweet)
tweet.possibly_sensitive?
end
단계 8:'perform'방법을 실행하여 서비스를 실행합니다
서비스 전체에 다음 코드를 추가합니다.
Twitter::ReTweetService.new.perform
9단계: 로봇 실행
프로젝트 루트의 명령줄에서 루비 파일을 실행하면 로봇이 전송을 시작해야 합니다.
$ ruby app/services/twitter/re_tweet_service.rb
예!이제 앉아서 트위터를 퍼뜨리는 걸 보면 돼.최종 코드
require 'rubygems'
require 'bundler/setup'
require 'twitter'
require 'figaro'
require 'pry-byebug'
Figaro.application = Figaro::Application.new(
environment: 'production',
path: File.expand_path('config/application.yml')
)
Figaro.load
module Twitter
class ReTweetService
attr_reader :config
def initialize
@config = twitter_api_config
end
def perform
rest_client = configure_rest_client
stream_client = configure_stream_client
while true
puts 'Starting to Retweet 3, 2, 1 ... NOW!'
re_tweet(rest_client, stream_client)
end
end
private
MAXIMUM_HASHTAG_COUNT = 10
HASHTAGS_TO_WATCH = %w[#rails #ruby #RubyOnRails]
def twitter_api_config
{
consumer_key: ENV['CONSUMER_KEY'],
consumer_secret: ENV['CONSUMER_SECRET'],
access_token: ENV['ACCESS_TOKEN'],
access_token_secret: ENV['ACCESS_TOKEN_SECRET']
}
end
def configure_rest_client
puts 'Configuring Rest Client'
Twitter::REST::Client.new(config)
end
def configure_stream_client
puts 'Configuring Stream Client'
Twitter::Streaming::Client.new(config)
end
def hashtags(tweet)
tweet_hash = tweet.to_h
extended_tweet = tweet_hash[:extended_tweet]
(extended_tweet && extended_tweet[:entities][:hashtags]) || tweet_hash[:entities][:hashtags]
end
def tweet?(tweet)
tweet.is_a?(Twitter::Tweet)
end
def retweet?(tweet)
tweet.retweet?
end
def allowed_hashtags?(tweet)
includes_allowed_hashtags = false
hashtags(tweet).each do |hashtag|
if HASHTAGS_TO_WATCH.map(&:upcase).include?("##{hashtag[:text]&.upcase}")
includes_allowed_hashtags = true
break
end
end
includes_allowed_hashtags
end
def allowed_hashtag_count?(tweet)
hashtags(tweet)&.count <= MAXIMUM_HASHTAG_COUNT
end
def sensitive_tweet?(tweet)
tweet.possibly_sensitive?
end
def should_re_tweet?(tweet)
tweet?(tweet) && !retweet?(tweet) && allowed_hashtag_count?(tweet) && !sensitive_tweet?(tweet) && allowed_hashtags?(tweet)
end
def re_tweet(rest_client, stream_client)
stream_client.filter(:track => HASHTAGS_TO_WATCH.join(',')) do |tweet|
puts "\nCaught the tweet -> #{tweet.text}"
if should_re_tweet?(tweet)
rest_client.retweet tweet
puts "[#{Time.now}] Retweeted successfully!\n"
end
end
rescue StandardError => e
puts "=========Error========\n#{e.message}"
puts "[#{Time.now}] Waiting for 60 seconds ....\n"
sleep 60
end
end
end
Twitter::ReTweetService.new.perform
장점: 원격 서버에서bot 실행
이렇게 하면 너는 현지 기계에서 이 로봇을 운행할 수 있다.만약 기계가 꺼진 상태에서 그것을 계속 운행하게 하려면, 코드를 원격 서버에 배치해야 한다.
원격 서버 사용에 대해 잘 알고 서버를 설정했다고 가정합니다.
서버를 이미 구성한 경우 다음 절차에 따라 서버에서bot을 실행할 수 있습니다.
단계 1: 코드를 git로 밀어넣기
현재 폴더를git repo로 전송하면 서버에 다운로드하고bot을 실행할 수 있습니다.
2단계: 클론 프로젝트
서버 내
git clone
프로젝트3단계: 프로젝트 폴더에서 이동
$ cd ruby-twitter-bot # assuming your project is named ruby-twitter-bot
4단계: 새 셸 만들기
$ screen -S twitter-bot
5단계:루비 트위터 로봇 실행$ ruby app/services/twitter/re_tweet_service.rb
6단계: 셸을 분리하고 원래 셸로 이동
$ CTRL + a + d
서버가 꺼지거나 트위터 앱이 트위터 제한에 도달하지 않는 한 영원히 실행될 로봇을 가져야 한다.결론
이제 루비로 트위터 로봇을 만드는 법을 배웠으니 트위터에 힘을 보여줘라.당신이 로봇을 사용하여 지역 사회를 행복하게 하기를 바랍니다.
다음 위치에서 전체 코드 및 폴더 구조를 볼 수 있습니다.
읽어주셔서 감사합니다. 다음 블로그에서 뵙겠습니다.
참고 문헌: Run ruby script in the background (Stack Overflow)
사진 출처: 표지 사진 작성자Sergei Tokmakov, Esq.가 Pixabay
Reference
이 문제에 관하여(루비로 트위터 로봇 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/truemark/build-twitter-bot-with-ruby-1fb2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)