Ruby2.5.0 × AWS LamdbaでFeedlyの未読記事をSlackに通知する

Ruby2.5.0 × AWS LamdbaでFeedlyの未読記事をSlackに通知する:

今回はタイトルにある通りRSSリーダーであるFeedlyを使って未読記事をSlackに通知する方法を共有したいと思います!

Feedlyを使っていない人でもLambdaをRubyで使ったりと応用の効く記事にしたつもりなので良かったら読んで行ってください!


経緯

Feedly開いて登録してあるWebサイトに新着記事がないか確認して、なかったら閉じて...

と短期間に何回も確認するのはめんどくさい!! でも新着が気になる!!

と思った怠惰な僕は、新着記事があったらSlackで教えてくれるものがあったらなと思ったので、タイトルにある通りSlackに未読記事を通知するスクリプトを作りました。

Lambdaの言語選択ですが、普段から使っていて昨年12月からサポートされたRubyを使います。


必要なもの

  • AWSのアカウント
  • Slackのアカウント
  • WebhookのURL(Slack)
    参考記事
  • Feedlyのaccess_tokenとuser_id
    参考記事
以上です。揃っていない方は参考記事からお願いします!


実装


Feedly API 調査

まずFeedly APIの公式サイトを見ると


スクリーンショット 2019-02-02 15.06.38.png


沢山ありますね:sweat:

APIのカテゴリー(画像右)を見ていくとStreamsにありそうですね!

中を見ていくとそれらしき記載が!



スクリーンショット 2019-02-02 15.10.20.png


とりあえず書いてある通り 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が返ってきた:sob:

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にアップロードします!


スクリーンショット 2019-02-02 16.51.12.png


Handlerの箇所で fetch_unread_article.lambda_handler となっているか注意してください。

ここは 実行ファイル名.実行関数名 となっているので、自分でファイル名や実行関数を任意の値にする事もできます!

lambdaに設定したらSaveしてください。

その後テストを押してみて下さい。

スクリーンショット 2019-02-02 17.00.59.png

このように通知が来ていたら成功です!

その後、定期実行する為に、CloudWatch Eventを使います。

Cloudwatch Eventの説明はこちら記事が分かりやすいので参照してください。

以上です!

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)