##今回作るもの
友達とのグループLINEに対して、
定刻になるとバズってるツイートを送信する仕組みをつくります。
##LINE Notify API
LINE Notifyと連携を行うことで、LINEユーザーが簡単にサービスの通知を受信できるようになります。
【引用元】:LINE Notify
らしいです。
実際に使うとこんな感じでLINE Notify
というアカウントからメッセージが届きます。
##LINE Notifyの下準備
下記リンクの手順通り、LINE Notify
が使える状態にします。
[超簡単]LINE notify を使ってみる
##バズってるツイートの取得
バズってるツイートもTwitter API
使って頑張ろうか迷いましたが、
辛そうだったので既存のランキングサイトからスクレイピングしてくることにしました。
Twitter人気ランキングサイト →【TwTimez】
##コード(Python)
import requests
from bs4 import BeautifulSoup
#一番勢いのあるツイートを取得
def bazz_get():
# アクセスするURL
url = "http://www.twtimez.net/index.html"
# URLにアクセスする
html = requests.get(url)
# htmlをBeautifulSoupで扱う
soup = BeautifulSoup(html.text, "html.parser")
try:
for detalis in soup.find(class_="details details2"):
print(detalis.get("href"))
return str(detalis.get("href"))
except:
return "なんかしらのエラー"
#Lineにメッセージを送る
def send_line(Bazz):
notify_url = "https://notify-api.line.me/api/notify"
token = "アクセストークン"
headers = {"Authorization": "Bearer " + token}
message = "\r\n" + Bazz
payload = {"message": message}
requests.post(notify_url, headers=headers, params=payload)
if __name__ == "__main__":
send_line(bazz_get())
##スクレイピング
何気にちゃんとやる?の初めてです。
BeautifulSoup
ってのを使えばちょちょいのちょいでした。
下記の箇所でhtmlの中から欲しい情報を持つクラスやタグを引っ張ってきてます。
for detalis in soup.find(class_="details details2"):
print(detalis.get("href"))
return str(detalis.get("href"))
欲しい情報を持つクラスやタグはGIFでやっているような手順で突き止めます。
F12 Key
を押せばページのhtmlを見れます。
ここまで問題なければ、実行後にLINEへメッセージが送られます。
##AWS
AWSのサービスを利用して定刻になるとメッセージを自動で送る仕組みを作ります。
多分無料です。後で請求書来たら勉強料を支払って速攻で止めます。
###AWS Lambda
サーバーについて検討することなくコードを実行できます。お支払いいただくのは、実際に使用したコンピューティング時間に対する料金のみです。
らしいです。ここに今回書いたコードをぶち込みます。
###Amazon CloudWatch
AWS とオンプレミスにおける AWS のリソースとアプリケーションのオブザーバビリティ
らしいです。なるほどわからん。
要するに自分で作った何かしらを簡単に監視していろいろできますってことだと思います。
設定した時刻にLambda上で作成した関数を定期的に実行可能です。
##実際の手順
Lambda
のコンソールにサインインして関数の作成
を選択し、
適当に名前をつけて次に進みます。
Zipでフォルダ毎アップすることもできるみたいですが、
そこまで大したものを作ってないので、関数に先程のコードをコピペして貼り付けます。
モジュールを利用しているのでダメでした。
さらに言うと、コードを追加、もしくは修正する必要があります。
また、コードをインラインで編集
ではなく、.zipファイルでアップロード
します。
###AWS用に変更したコード
import requests
from bs4 import BeautifulSoup
def bazz_get():
# アクセスするURL
url = "http://www.twtimez.net/index.html"
# URLにアクセスする
html = requests.get(url)
# htmlをBeautifulSoupで扱う
soup = BeautifulSoup(html.text, "html.parser")
try:
for detalis in soup.find(class_="details details2"):
print(detalis.get("href"))
return str(detalis.get("href"))
except:
return "なんかしらのエラー"
def send_line(Bazz):
notify_url = "https://notify-api.line.me/api/notify"
token = "アクセストークン"
headers = {"Authorization": "Bearer " + token}
message = "\r\n" + Bazz
payload = {"message": message}
requests.post(notify_url, headers=headers, params=payload)
def bot(event, lambda_context):
send_line(bazz_get())
下記がLambdaで実際に呼び出される関数です。
実行だけを担うScriptを別途用意しても良かったのですが、
問題なく動いてくれて、今後拡張する予定もないので下記のようにしました。
Lambdaで呼び出すためには引数が必要です。
def bot(event, lambda_context):
send_line(bazz_get())
アップロード先のハンドラにPython Script名と呼び出したいメソッド名を.
で繋いで書いておきます。
###モジュール入りのZipファイルをLambdaにアップロード
まずは、モジュールを任意のディレクトリに保存します。
まずは保存したいディレクトリまで移動します。
cd 任意のディレクトリ
あとは、カレントディレクトリにPython Script内で使用したモジュールを保存します。
pip install beautifulsoup4 -t .
pip install requests -t .
次はZip圧縮です。
アップロードしたいPython Scriptとモジュールを圧縮します。
全てを格納したフォルダに対してZip圧縮行うと一階層分余計なフォルダができてしまうので
GIF画像のように全選択して圧縮します。
##CloudWatch Events
次はトリガーを追加
を選択してCloudWatchと連携します。
(CloudWatchのコンソールにサインインして別途設定を行うアプローチでも可能です。)
##スケジュールの設定
スケジュールの設定方法(いつコードを実行するか)は下記リンクが参考になります。
Schedule Expressions for Rules
CloudWatchにコンソールからサインインして
ルールの新規作成
をした場合は下記画像のように
どのタイミングで実行するか表示されるのでわかりやすいです。
##UTC(GMT)とJST
先程の画像を見ればわかりますが、GMTという文字が実行時間の後ろに書かれています。
日本の時間と9時間差があるそうなので、その時差を考慮した時間で設定しないとダメなようです。
【参考リンク】:【AWS】CloudWatch cron 式 または rate 式の書式について解説
##グループLINE内のみんなの感想
全員フルシカトでした。なんで?
2019/12/07 追記
実際にRT数、ファボ数が多いツイートってキャンペーン系ばっかりなんですね。。。
毎日ローソンのRTキャンペーンがグループラインに流れてくるので怒られました。
##参考リンク
朝イチで知りたいことをLINEで教えてくれるプログラム(Python)
【Python】BeautifulSoupの使い方・基本メソッド一覧|スクレイピング
AWS LambdaをPythonで使ってみた ライブラリの読み込みや環境変数の注意点について解説