LINE Messaging API를 사용하여 임의의 사진 보내기

15463 단어 botLine

하고 싶은 일



사진은 스마트 폰으로 자주 찍히기 때문에 쌓이지만 수가 많아지면 과거의 사진이 묻혀 갑니다.

그래서 Google 포토의 특정 앨범에서 무작위로 사진을 선택하고 LINE의 토크로 보내는 기능을 bot에 구현했다. 그렇게하십시오.



준비


  • LINE Messaging API를 사용할 수 있는 상태로 만들기
  • 공식적으로 여기 ぇぺぺrs. 네. Me / Messagin g-Api / Getchin g-s r d
  • 이 블로그 LINE의 Messaging API 사용 메모: 사전 지식 및 등록편 에 일본어로 친절하게 쓰여 있다
  • LINE의 토크와 관계없이 일방적으로 사진을 보내면 webhook은 필요하지 않습니다

  • Google API를 사용할 수 있는 상태로 만들기

  • htps : // 이런. 로 ごぉぺrs. 오, ぇ. 이 m 에서 프로젝트 등록, 자격 증명 취득

  • h tp // w w. 요헤이 m. 네 t/bぉg. php? q=20160411 당을 참고로
  • Google 포토 API는 특별히 활성화하지 않아도 사용할 수 있습니다 (API 목록에 나오지 않음)
  • Oauth2 access token의 취득은 ぃ tp // m / gaiko_ / ms / b0b2 ~ f41dfb0 a 62d628b 를 참고로 했다


  • 구현



    루비로 해. LINE, Google 모두 다양한 언어로 라이브러리가 나와 있으므로, 좋아하는 것을 사용하면 좋다고 생각한다.

    Google 포토에서 무작위로 사진 가져오기



    Picasa Web Album Data API

    이 느낌 ...
    require 'signet/oauth_2/client'
    require 'picasa'
    require 'dotenv'
    
    Dotenv.load
    
    class PicasaClient
    
      def initialize
        @client = nil
      end
    
      def client
        @client ||= Picasa::Client.new(user_id: ENV['GOOGLE_USER_ID'], access_token: access_token)
      end
    
      def access_token
        signet = Signet::OAuth2::Client.new(
          client_id: ENV['GOOGLE_CLIENT_ID'],
          client_secret: ENV['GOOGLE_CLIENT_SECRET'],
          token_credential_uri: "https://www.googleapis.com/oauth2/v3/token",
          refresh_token: ENV['GOOGLE_REFRESH_TOKEN']
        )
        signet.refresh! 
    
        # Use access token with picasa gem
        puts "access_token:" + signet.access_token
        signet.access_token
      end
    
      def get_random_photo_url
        album = client.album.list.entries.find{  |a| a.title == ENV['GOOGLE_PHOTO_ALBUM_NAME'] } 
        photo = client.album.show(album.id).entries.sample
        photo.content.src
      end
    end
    
    

    LINE Bot에서 이미지 보내기



    일방적으로 사진을 보내는 명령을 만들어 보자. 이런 느낌. 같은 모양을 하고 있다. (이것은 어디에서 취하는 것이 편하겠지.
    require 'line/bot'
    require 'dotenv'
    
    Dotenv.load
    
    def line_send_image(target, image_url)
      line_client = Line::Bot::Client.new { |config|
        config.channel_secret = ENV['LINE_CHANNEL_SECRET']
        config.channel_token = ENV['LINE_CHANNEL_TOKEN']
      }
      message = {
        type: "image",
        originalContentUrl: image_url,
        previewImageUrl: image_url
      }
      line_client.push_message(target, message)
    end
    
    log = Logger.new(STDOUT) # !> assigned but unused variable - log
    picasa = PicasaClient.new
    line = LineClient.new
    photo_url = picasa.get_random_photo_url
    res = line.send_image(ENV['LINE_SEND_TARGET'], photo_url)
    

    대화에 반응하여 이미지 보내기



    Bot의 webhook URL에서 지정한 URL에 웹서버를 세우게 된다. 하자.
    require "sinatra/base"
    require 'line/bot'
    require 'dotenv'
    
    module MyBotserver
      class Server < Sinatra::Base
        Dotenv.load
    
        helpers do
          def client
            @client ||= Line::Bot::Client.new { |config|
              config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
              config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
            }
          end
        end
    
        post '/line' do
          request.body.rewind
          body = request.body.read
          events = client.parse_events_from(body)
          events.each do |event|
            case event
            when Line::Bot::Event::Message
              when Line::Bot::Event::MessageType::Text
                message = {}
                case event.message['text']
                when /^p$/
                  logger.info "Sending photo"
                  picasa = PicasaClient.new
                  photo_url = picasa.get_random_photo_url
                  message = {
                    type: 'image',
                    originalContentUrl: photo_url,
                    previewImageUrl: photo_url
                  }
                  res = client.reply_message(event['replyToken'], message)
                  logger.warn "Message send error: " + res.body unless res.is_a?(Net::HTTPOK)
                end
                unless message.empty?
                  logger.info "Sending message #{message}"
                  client.reply_message(event['replyToken'], message)
                end
              end
           end
         end
      end
    end
    
    
    

    요약



    LINE Messaging API를 사용하여 Google 포토에서 랜덤한 사진을 LINE 토크로 전송하는 기능을 구현해 보았다. 꽤 재미 있습니다.

    아이의 옛날 사진을 보내거나 배고픈 시간을 목표로 밥 이미지를 보내거나 놀면 좋을 것입니다.

    좋은 웹페이지 즐겨찾기