루비로 트위터 로봇 구축

37717 단어 twittertutorialrubybot
오늘 우리는 트위터를 위해 로봇을 구축할 것이다. 트위터는 #ruby나 #rails와 관련된 모든 라벨을 전송할 것이다.이 강좌를 사용하면 모든 탭을 전송할 수 있는bot을 만들 수 있습니다.네, 이 트위터 로봇을 루비로 구축하겠습니다.
빠른 시작과 실행을 위해 Twitter API를 사용합니다.

배경.
나는 지금 트위터에서 매우 활발하게 활동하고 있다. 나는 로봇이 #100일의 코드를 전달하는 것을 많이 보았다.많은 초보자들이 자바스크립트를 시도하고 JS 커뮤니티에서 도움을 받는다.젠장, 지금은 아무도 루비를 안 쓴다고 생각했어.그러나 사실은 그렇지 않다. 그렇다. 그것을 사용하는 사람은 점점 적어지고 있지만, 그것은 여전히 인기가 있다.그래서 나는 로봇을 만들어서 라벨'루비'나'rails'로 모든 트윗을 전달할 계획이다.이 로봇의 목적은 루비와 라일스 커뮤니티를 단결시키고 초보자들이 루비를 사용하도록 격려하며 서로 돕도록 하는 것이다.

본 강좌에 필요한 기술을 따르다
중급:
  • 루비
  • bot을 원격 서버에 배치하려면
  • 배치 기술을 사용하십시오

    너는 마땅히
  • 트위터 앱을 설정하고 트위터에서 온 네 개의 키와 비밀을 가지고 있다.만약 네가 아직 이렇게 하지 않았다면, 너는 이 설정에 따라 열쇠와 비밀을 가지고 여기로 돌아올 수 있다.

  • 층계

    첫 번째 단계: 루비 파일 만들기
    먼저 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
    
    무슨 일이 있었죠?
  • Rails 프레임워크의 폴더 구조를 따르고 서비스를 폴더app/services/twitter에 저장합니다.
  • 이후 트위터 폴더에 파일re_tweet_service.rb을 만들었습니다. 그 다음에 코드를 추가할 것입니다.
  • 2단계: Ruby 파일에 Twitter Gem 필요re_tweet_service.rb에서 위쪽에 다음 코드를 추가합니다.
    require 'rubygems'
    require 'bundler/setup'
    
    require 'twitter'
    
    무슨 일이 있었죠?
  • 앞의 두 줄은 순수한 Ruby 프로그램에서gem을 사용할 수 있도록 해 줍니다. 만약에 이전에 Rails를 사용한 적이 있다면 프레임워크가 자동으로 완성할 것입니다. 이런 상황을 겪지 않았을 수도 있습니다.
  • 통과require 'twitter'를 통해 Ruby 응용 프로그램이 트위터gem을 사용하도록 지도하고 있습니다.
  • 3단계: 응용 프로그램을 만듭니다.yml 트위터 기밀과 키 저장
    기밀과 키는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
    
    무슨 일이 있었죠?
  • 응용 프로그램
  • 에서 사용할 수 있도록figarogem이 필요합니다.
  • 사용 Figaro.application 코드는 응용 프로그램 불러오기application.yml 폴더에 있는 config를 알려 줍니다. 그러면 이전 단계에서 설정한 키를 사용할 수 있습니다.
  • 5단계: 서비스에 트위터api 설정 추가
    다음 항목 추가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 탭이 있는 트윗을 제공합니다.
    코드에서 무슨 일이 일어났습니까?
  • 저희는 저희 서비스를 초기화하고 트위터에 필요한api 설정을 초기화하고 있습니다
  • perform는 Dell이 서비스에서 공개하는 유일한 공통 접근 방식이며 기타 모든 접근 방식을 개인화
  • 합니다.
  • 그리고 rest와stream 클라이언트를 설정했습니다. 다음 단계에서 사용할 것입니다.

  • 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(',')) 각 트윗을 반복적으로 탐색합니다.
  • 오류가 있으면 트위터 로봇이 오류로 멈추지 않도록 응급처치를 하고 있습니다.그리고 우리는 로봇을 60초 동안 휴면시켰다. 이것은 냉각기일 뿐이다. 네가 옳다. 이것은 절대로 필요없다. 네가 원한다면 그것을 제거할 수 있다.
  • should_re_tweet? 방법은 트위터 클라이언트로부터 받은 주어진 트윗을 전송해야 하는지 확인하기 위해 다른 방법을 사용합니다.
  • def tweet?(tweet)
      tweet.is_a?(Twitter::Tweet)
    end
    
  • 받은 트윗이 원시 트윗인지 전송된 트윗인지 검사하고 전송되면 이 방법은false로 되돌아오고bot은 전송하지 않습니다.
  • def retweet?(tweet)
      tweet.retweet?
    end
    
  • 받은 트윗이 원시 트윗이 아니라 전송만 하는지 확인합니다. 이 방법이true로 되돌아오면bot은 이 트윗을 건너갑니다
  • 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

    좋은 웹페이지 즐겨찾기