Ruby × RMagick에서 트위터 팔로워 아이콘을 늘어놓은 빙고 스타일 이미지 만들기

이 절차로 할 수있는 일



팔로워 씨의 아이콘을 5x5-1(가운데를 제외하기 위해-1)에 늘어놓은 빙고 이미지를 자동 생성할 수 있다.



・실행마다 줄지어 있는 사람은 바뀐다(완전 랜덤. 아무 데이터도 고려하지 않는다)
・중심에는 항상 자신의 화상이 표시된다

「얽힌 계기 만들기」에 부디.
이름은 병기하지 않기 때문에, 우선은 「아이콘과 이름을 일치시키는 곳으로부터」라고 해도 좋지만, 그것은 조금 엄격한 인용으로, 이름의 리스트를 텍스트로 출력하도록(듯이) 하고 있다.

개요도





대상 독자



환경 구축이 어느 정도 아는 사람용(각종 설치·등록 순서 생략을 위해)
※개별로의 문의 대응은 가능

필요한 것



· Twitter 계정
・개발용 PC
(Windows는, RMmagick로 손잡이 같기 때문에, Mac나 Linux를 추천)
· 원하는 텍스트 편집기 또는 통합 개발 환경
・영문의 읽고 쓰기에 견딜 수 있는 멘탈(Twitter Developer 등록이 아직의 경우)

0.환경 구축



다음을 설치합니다. 절차는 할애. 기본은 apt라든가 brew라든지 yum, gem으로 갈 수 있을 것이다. Ruby는, 앞으로도 사용한다면, rbenv라든지 rvm로 넣는 것이 좋을지도.

・Ruby
・Twitter Gem
・RMagick

※[참고]필자 환경(MacOS X 10.10.5/Ruby 2.4.1/Twitter Gem 6.2.0/RMagick 2.16.0)

· SSL 인증서 작성 또는 설치
자신의 증명서를 만들 필요가 있지만, 조금 시험하고 싶은 것 뿐이라면, 일단 CA certificates extracted from Mozilla 의 cacert.pem 를 보존해 사용하는 것도 있다.

1.Twitter Developer 등록



TwitterAPI를 사용하려면 개발자 등록이 필요합니다.

등록되지 않은 사람은 Twitter Developer Platform 에서 등록을.
Twitter 계정으로 로그인하여 오른쪽 상단의 "Apply"로.

돈은 들지 않고, 개인정보도 쓰지 않기 때문에, 부담없이 등록해도 좋다고 생각한다.
영어로 어떤 일을 하고 싶은지의 설명이 요구되므로, Google 번역을 사용해 노력하자.
또는, 제 적당 영어를 그대로 부디.

I want to makes a follower's bingo image from Twitter APIs. It is used to increase communication opportunities between us and followers by reply, like and retweet.Since followers are chosen randomly, we will have opportunities to communica

번역 : 내가 트위터 API에서 팔로워의 빙고 이미지를 생성하고 싶은 쿠포. 이것은 립이나 좋아, 리트윗에 의해, 우리와 팔로워씨의 교류 기회를 늘리기 위해서 사용되는 쿠포야. 팔로워 씨는 랜덤으로 선택되기 때문에 다양한 팔로워 씨와의 교류 기회가 늘어나는 쿠포네.

2.Twitter 응용 프로그램 만들기



「Twitter Developer 등록」이 끝나면,

사용자 이름 옆의 화살표에서 "Apps"를 선택하고 "Create an App"에서 새 응용 프로그램을 만듭니다.



작성이 끝나면, 어플리케이션의 Detail의 화면에서 「Keys and tokens」탭을 선택해, 거기에 기재되어 있는 「Consumer API keys」를 2종류 어딘가에 메모해 둔다.



프로그램에서 API를 이용하는 경우에는 Access token이 필요하므로 "Access token & access token secret"의 "Create"버튼을 누른다.

그러면 token과 secret이 표시되므로 이쪽도 「Consumer API keys」와 같이 어딘가에 메모해 둔다.

3. 프로그램 작성



다음의 코드를 작성한다. twitterID, 각종token, token secret 는 자신용으로 바꾸는 것.

make_follower_bingo.rb
require "twitter"
require 'rmagick'

### 設定ここから ###
# SSL証明書へのパス
ENV["SSL_CERT_FILE"] = "SSL証明書へのパスを記載"

# 自身のTwitterID
MY_TWITTER_ID = "Twitter IDを記載"

# 各種Token/Secret
CONSUMER_KEY         = "メモしたCONSUMER_KEYを記載" 
CONSUMER_SECRET      = "メモしたCONSUMER_SECRETを記載"
ACCESS_TOKEN        = "メモしたACCESS_TOKENを記載" 
ACCESS_TOKEN_SECRET = "メモしたACCESS_TOKEN_SECRETを記載"

### 設定ここまで ###

class TwitterClient
  NUMBER_OF_COL = 5 
  NUMBER_OF_ROW = 5 
  DEFAULT_FILE_NAME = "bingo.jpg"

  def initialize(consumer_key, consumer_secret, access_token, access_token_secret, my_twitter_id)
    @client = Twitter::REST::Client.new do |config|
      config.consumer_key        = consumer_key
      config.consumer_secret     = consumer_secret
      config.access_token        = access_token
      config.access_token_secret = access_token_secret
    end
    @my_twitter_id = my_twitter_id
    @number_of_followers = @client.user(@my_twitter_id).followers_count
  end

  def choice_followers(count)
    puts "Error: Number of follower is less than #{count}." if @number_of_followers < count 
    @chosen_followers_indexes = []
    index = -1
    count.times do
      loop do
        index = rand(@number_of_followers)
        break if !@chosen_followers_indexes.include?(index)
      end
      @chosen_followers_indexes << index
    end
    @chosen_followers_indexes
  end

  def get_followers
    is_success = false
    @chosen_follower_ids = []
    @client.follower_ids(@my_twitter_id).each_with_index do |follower, index|
      @chosen_follower_ids << follower if @chosen_followers_indexes.include?(index)

      # 全員見つかった 
      if @chosen_follower_ids.size >= @chosen_followers_indexes.size
        is_success = true
        break
      end
    end
    is_success
  end

  def generate_image(output_name = DEFAULT_FILE_NAME)
    image_urls = []
    names = []
    @chosen_follower_ids.each_with_index do |follower_id, index|
      user = @client.user(follower_id)
      puts user.name
      puts user.profile_image_uri

      image_urls << user.profile_image_uri
      names << user.name
    end

    # 真ん中に自分の画像を差し込む
    image_urls.insert((NUMBER_OF_COL * NUMBER_OF_ROW) / 2, @client.user(@my_twitter_id).profile_image_url)
    names.insert((NUMBER_OF_COL * NUMBER_OF_ROW) / 2, "★")

    # 対象者名をテキストに出力
    File.open(output_name + "_names.txt", "w") do |text|
      names.each_with_index do |name, index| 
        text.write(name)
        if (index + 1)  % NUMBER_OF_COL == 0
          text.write("\n") # 改行
        else
          text.write(" | ")
        end
      end
    end

    # 1行分の画像を行の数だけ生成
    images = []
    NUMBER_OF_ROW.times do |row_index|
      image = Magick::ImageList.new
      NUMBER_OF_COL.times do |col_index|
        image.read(image_urls[row_index * NUMBER_OF_COL + col_index])
      end
      image = image.append(false)
      images << image
    end

    # 行毎の画像を結合
    joined_image = Magick::ImageList.new
    images.each_with_index do |image, index|
      joined_image.from_blob(image.to_blob)
    end
    joined_image = joined_image.append(true) 
    joined_image.write(output_name) 
  end
end

client = TwitterClient.new(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET, MY_TWITTER_ID)

3.times do
  client.choice_followers(TwitterClient::NUMBER_OF_COL * TwitterClient::NUMBER_OF_ROW - 1)
  break if client.get_followers

  # フォロワー数の減少により、chosen_indexesの値がindexを超えてしまったら、再抽選
  puts "retrying..."
end
client.generate_image

[참고]
The Twitter Ruby Gem
RMagick 2.12.0 User's Guide and Reference#ImageList

4. 실행



Mac, Linux라면 소스 코드에 실행 권한을 붙여 실행한다.
$ chmod +x make_follower_bingo.rb 

위는 처음에만 OK.
$ ruby make_follower_bingo.rb

실행 디렉토리에 "bingo.jpg""bingo_names.txt"라는 파일이 있으면 성공!

좋은 웹페이지 즐겨찾기