Ruby2.5.0 × AWS Lambda에서 Feedly의 읽지 않은 기사를 Slack에 알립니다.

이번에는 타이틀에 있는 대로 RSS 리더인 Feedly를 사용해 읽지 않은 기사를 Slack에게 통지하는 방법을 공유하고 싶습니다!

Feedly를 사용하지 않는 사람이라도 Lambda를 Ruby로 사용하거나 응용이 효과적인 기사로 한 생각이므로 좋으면 읽어 가 주세요!

경위



Feedly 열려 등록된 웹사이트에 최신 기사가 있는지 확인하고, 없으면 닫아서...
그리고 단기간에 여러 번 확인하는 것은 귀찮습니다! ! 하지만 새로운 도착이 신경이 쓰인다! !
라고 생각한 게으른 나는, 신착 기사가 있으면 Slack에서 가르쳐 주는 것이 있다고 생각했기 때문에, 타이틀에 있는 대로 Slack에 미독 기사를 통지하는 스크립트를 만들었습니다.
Lambda의 언어 선택입니다만, 평상시부터 사용하고 있어 작년 12월부터 서포트된 Ruby를 사용합니다.

필요한 것


  • AWS 계정
  • Slack 계정
  • 웹 후크 URL (슬랙)
    참고 기사
  • Feedly access_token 및 user_id
    참고 기사

  • 이상입니다. 갖추어지지 않은 분은 참고 기사로부터 부탁합니다!

    구현



    Feedly API 조사



    우선 Feedly API 공식 사이트를 보면

    많이 있습니다

    API의 카테고리(화상 오른쪽)를 보면 Streams에 있을 것 같네요!

    안을 봐 가면 그들 흔들림 기재가!



    우선 써 있는 거리 unread=true 옵션을 붙여 주면 취득할 수 있는 것이 아닌가! 생각
    
    `curl -H 'Authorization:[取得したuser_id]' https://cloud.feedly.com/v3/streams/contents?streamId=[取得したuser_id]/unreadOnly=true 
    

    실행 한 곳
    {"errorCode":400,"errorId":"ap8int-sv2.2019020122.1070524","errorMessage":"invalid stream id"}
    

    400이 돌아왔다

    stream_id에 user_id는 사용할 수 없는 것일까라고 생각하고 구구한 곳 돈피샤 기사을 발견!

    이 기사대로
    curl -H 'Authorization:[取得したuser_id]' https://cloud.feedly.com/v3/streams/contents?streamId=user/[取得したuser_id]/category/global.all&unreadOnly 
    

    한 곳, 취득할 수 있었습니다!

    응답을 가공할 필요가 있으므로 그 로직을 Ruby로 짜서 Lambda에서 정기 실행합니다!

    Gemfile에 작성



    이번에는 http_client와 slack의 Gem을 사용하기 때문에 Gemfile에

    Gemfile
    source "https://rubygems.org"
    
    git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
    
    gem 'httpclient'
    gem 'slack-notifier'
    
    

    라고 기술하고,
    bundle install --path vendor/bundle
    

    을 실행하고 vendor 아래에 경로를 지정하십시오 (lamdba에 업로드 할 때 사용)

    실행 파일 작성



    그리고 실행 파일에

    fetch_unread_article.rb
    require 'httpclient'
    require 'json'
    require 'slack-notifier'
    
    # APIから未読記事を取得する
    def get_unread_articles
      client = HTTPClient.new
      query = { unreadOnly: true }
      response = client.get("https://cloud.feedly.com/v3/streams/contents?streamId=user/#{ENV['STREAM_ID']}/category/global.all", query: query, header: [["Authorization", "#{ENV['ACCESS_TOKEN']}"]])
      response.status == 200 ? create_message(set_articles(response)) : post_slack('APIのエラーで記事を正常に取得できませんでした!')
    end
    
    # responseから未読記事のタイトルとURLを取得
    def set_articles(response)
      article_title_and_url = []
      body = JSON.parse response.body
      body['items'].each do |item|
        article = []
        article.push(item['title'])
        article.push(item['originId'])
        article_title_and_url.push(article)
      end
      article_title_and_url
    end
    
    
    def create_message(title_and_urls)
      message = ''
      title_and_urls.each do |c|
        message << "\rタイトルは#{c[0]}\rURLは#{c[1]}です。\r"
      end
      post_slack(message)
    end
    
    def post_slack(message)
      notifier = Slack::Notifier.new("#{ENV['WEB_HOOK_URL']}")
      message.empty? ? notifier.ping('未読の記事はありません!') : notifier.ping(message)
    end
    
    def lambda_handler(event:, context:)
      get_unread_articles
    end
    
    

    라고 기술해, lambda에 올리기 위해 vendor의 부하와 실행 대상 파일을 zip화합니다.
     zip -r fetch_unread_article.zip fetch_unread_article.rb vendor/
    

    lambda에 업로드



    그리고 lambda에 업로드합니다!


    Handler의 부분에서 fetch_unread_article.lambda_handler가 되어 있는지 주의해 주세요.
    여기는 実行ファイル名.実行関数名이므로, 스스로 파일명이나 실행 함수를 임의의 값으로 할 수도 있습니다!

    lambda로 설정하면 Save하십시오.
    그런 다음 테스트를 눌러보십시오.



    이렇게 알림이 오면 성공입니다!

    그런 다음 정기 실행을 위해 CloudWatch Event를 사용합니다.
    Cloudwatch Event에 대한 설명은 이쪽 기사을 이해하기 쉽기 때문에 참조하십시오.

    이상입니다!

    좋은 웹페이지 즐겨찾기