feedlyでタグ付けした記事を自動でメール配信する
feedlyを使っていて、良記事や知っておいて欲しい記事とかを部門とかチームとかにまとめて配信するのですが、これも手でやってると結構面倒なので、APIを使って毎日自動配信する事にしました。
公式のAPI情報はこちらです。
http://developer.feedly.com/v3/
コードはGitHubで公開しています。
feedly-mail
目次
トークン
https://cloud.feedly.com/v3/auth/devのリンク先で普段ログインしている方法でログインします。
facebookとGoogleの場合はメールで、Twitterの場合はダイレクトメッセージでURLが届きますのでそれをクリックします。
これでアクセストークンがとれるのでUSER IDと一緒に記録しておきます。
各パラメータ
各パラメータは下記を設定します。
私の場合はGmailで送信しています。
1 2 3 4 5 6 7 8 9 10 11 |
ADDRESS = SMTPメールアドレス PASSWARD = SMTPパスワード SMTP = SMTPサーバホスト名かIPアドレス PORT = SMTPポート to_addr = 宛先メールアドレス to_ccs = [CCがあれば配列で] WEATHERMAP_CITY = 天気が知りたい都市名 WEATHERMAP_API_KEY = OpenWeatherMap APIのアクセスキー FEEDLY_TOKEN = Feedlyのトークン FEEDLY_USER_ID = FeedlyのユーザーID(メールアドレスではない) |
メール送信
smtplibでメールを送信します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
def create_message(from_addr, to_addr, subject, body, to_ccs, encoding): msg = MIMEText(body ,'plain', encoding) msg["From"] = from_addr msg["To"] = to_addr msg["Cc"] = ",".join(to_ccs) msg["Date"] = formatdate() msg["Subject"] = Header(subject, encoding) return msg def send(from_addr, to_addrs, msg): smtpobj = smtplib.SMTP(SMTP, PORT) smtpobj.ehlo() smtpobj.starttls() smtpobj.ehlo() smtpobj.login(ADDRESS, PASSWARD) smtpobj.sendmail(from_addr, to_addrs, msg.as_string()) smtpobj.close() |
天気情報の取得
記事情報だけもなんだか味気ないのでついでに天気情報も送信します。
OpenWeatherMAP APIで現在の指定した都市の天気情報を取得します。
1 2 3 4 5 6 |
def weather_string(): response_weather = requests.get("http://api.openweathermap.org/data/2.5/weather?q=" + WEATHERMAP_CITY + "&appid=" + WEATHERMAP_API_KEY) weather_data = json.loads(response_weather.text) condition_code = weather_data["weather"][0]["id"] return condition_string(condition_code) |
天気情報のコードを日本語に直しています。
1 2 3 4 5 6 7 8 9 10 |
def condition_string(condition_code): return_str = "分かりません。" if condition_code == 200: return_str = "軽い雷雨です。" elif condition_code == 201: return_str = "雷雨です。" ~中略~ return "今の天気は" + return_str |
実行関数
AWS Lambdaで実行していますのでこのように書いています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
def lambda_handler(event, context): try: now = datetime.now() subject = "ここ1週間の気になった記事です - " + now.strftime("%Y/%m/%d") body = "皆様\nおはようございます。xxです。\n\n" + weather_string() + "\n\n1週間以内の気になった記事を共有します。\n\n通勤中や寝る前などお暇な時にぜひどうぞ。\n新着記事から順に上に表示しています。\n\n" last_week_time=now-timedelta(7) unix_time = int(time.mktime(last_week_time.timetuple()))*1000 headers = {'Authorization': FEEDLY_TOKEN} response_stream = requests.get('https://cloud.feedly.com/v3/streams/contents?streamId=user/' + FEEDLY_USER_ID + '/tag/global.saved&count=100&newerThan=' + str(unix_time), headers=headers) stream_data = json.loads(response_stream.text) stream_data_array=stream_data["items"] for stream in stream_data_array: tag_string="" tag_div="" for tag in stream["tags"]: if tag["label"] != "" and tag["label"] != "global.read": tag_string = tag_string + tag_div + "[" + tag["label"] + "]" tag_div = "," body = body + tag_string + "\n" + stream["title"] + "\n" + stream["alternate"][0]["href"] + "\n\n" msg = create_message(ADDRESS, to_addr, subject, body, to_ccs, 'utf-8') send(ADDRESS, [to_addr], msg) except Exception as e: print(e) raise e |
https://cloud.feedly.com/v3/streams/contents
Feedを取得しています。
- streamId global.saveというタグを指定してSaved For Laterに入れたFeed一覧を取得します。
- count 指定しなければデフォルトが10なので一応100にしています。
- newerThan 指定した日時よりも新しいFeedを取得しています。
- headers ‘Authorization’にトークンを設定しています。
※当初は全タグをタグごとに呼んでメール本文を整理していたのですが、Feedlyの1日のコール回数上限が250回でテストとかしているとすぐに上限にいっちゃってたので、1回しかコールしないようにこのやり方にしています。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
SQLAlchemyのModelクラスをMySQLから自動生成する
SQLAlchemyのMySQLモデルを書くのが面倒で、きっと何かツールがあるの …
-
Python openpyxlで結合セルを含むExcelファイルを開くと罫線が消える
PythonのExcelを読み書きするためのライブラリ、openpyxlで結合セ …
-
Linux Mint 17 MATE 64bit にIPython Notebookをインストールする
今日行く勉強会でIPython Notebookの環境が必要なため、手持ちのLi …
-
SQLAlchemyでjoinする
PythonのSQLAlchemyでMySQLのテーブルをjoinするときの覚書 …
-
pythonのsqlalchemyで嵌った話
エラーメッセージ InvalidRequestError: SQL expres …
-
「神戸Pythonの会 #2 meetup」に行ってきました
「神戸Pythonの会 #2 meetup」に行ってきました。 所感など Ato …
-
Redmine REST APIを操作するpython_redmineを試してみた
Redmine のGUIの登録が面倒なのでコマンドで登録、更新、時間の記録が出来 …
-
PyCharmでテキストを折り返す
超小ネタです。 コーディングしているときは1行でそんなに長いコードを書かないので …
-
Apple Silicon M1 MacBook ProにJupyter Notebookをインストールしました
Python – Jupyter NotebookをMac M1 搭 …
-
Feedlyのフィードを自動でSlackへ投稿する(AWS Lambda , Amazon DynamoDB)
やりたいこと Feedlyで共有したいフィードに特定のタグを付けます。 特定のタ …