13
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

YahooNewsが毎朝届くLINEBOT

Last updated at Posted at 2022-03-11

はじめに

日々の学習での気づきや制作物があればアウトプットしようと思い始めてみました。
Qiita初心者なので見辛い点があると思いますがご了承ください。
pythonの勉強も3ヶ月程なので冗長なコードがありますが、暖かく見守ってください(笑)

作成の経緯

定期的にLINEがお知らせをしてくれるBOTを作りたいなと思い立った。
以前スクレイピングの練習で、YahooNewsサイトのデータを取得していたため、それを利用して作成に至った。

機能紹介

毎朝7時になると注目のニュースが送られてくる。
line_img.PNG
このように笑顔の素敵な男の子が注目のニュースを発信してくれます。

コード解説

コード全文はGitHubに公開しています。
https://github.com/motty00/yahoo_lineBot

herokuでpythonを実行するにあたって必要なファイルを用意します。

Procfile
worker: python run.py

run.pyを実行するための、おまじない的なやつ。

requirements.txt
bs4
line-bot-sdk
schedule

使用する外部ライブラリを指定。

import urllib.request as req
import datetime
import schedule
import time
import os
from bs4 import BeautifulSoup
from linebot import LineBotApi
from linebot.models import (
    TextSendMessage
)

必要なライブラリをimportします。

run.py
    CHANNEL_ACCESS_TOKEN = os.environ['CHANNEL_ACCESS_TOKEN']
    # USER_ID = os.environ['USER_ID']
    line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN)

LINEのチャンネルアクセストークンとユーザーIDをherokuの環境変数として登録しています。
1行目でチャンネルアクセストークンを取得します。
今回ユーザーIDは使用しないので取得はしていません。

run.py
    dt = datetime.datetime.now()
    dt_now = dt + datetime.timedelta(hours = 9)

まず、現在の時間を取得します。
UTC時間を取得するみたいなので、9時間プラスします。
:追記(6/30)
herokuの時間を日本に合わせてますので、+9時間する必要はないですね....

run.py
    url = "https://news.yahoo.co.jp/ranking/access/news"
    response = req.urlopen(url)
    parse_html = BeautifulSoup(response,'html.parser')
    title_lists = parse_html.select('.newsFeed_item_title')
    url_lists = parse_html.select('.newsFeed_item_link')

スクレイピングするURLを指定します。
3行目でBeautifulSoupを使いHTMLを解析し取得しています。
4行目でタイトルのclass、5行目でURLのclassを取得しています。

run.py
    title_list = []
    url_list = []
    for t in title_lists:
        title_list.append(t.string)
    for i in url_lists:
        url_list.append(i.attrs['href'])

タイトルとURLの配列を用意してfor文で1つずつ追加していきます。

run.py
    messages = TextSendMessage(text = "おはようございます\n" + str(dt_now.month) + "" + str(dt_now.day) + "日のニュースはこちら!!")
    line_bot_api.broadcast(messages=messages)

挨拶文と今日の日付をメッセージとして送信します。
line_bot_api.broadcast とすると友だち登録している人に送信できるみたいです。
特定のユーザーのみに送信したいならUSER_IDを使うのかな。

run.py
    title0 = title_list[0]
    title1 = title_list[1]
    title2 = title_list[2]
    title3 = title_list[3]
    title4 = title_list[4]

    message0 = url_list[0]
    message1 = url_list[1]
    message2 = url_list[2]
    message3 = url_list[3]
    message4 = url_list[4]

変数にニュースランキングの上位5件を格納します。

run.py
    messages = TextSendMessage(text=""+title0+""+"\n"+message0+"\n"+"---------------------------------\n"+title1+""+message1+"\n"+"---------------------------------\n"+title2+""+message2+"\n"+"---------------------------------\n"+title3+""+message3+"\n"+"---------------------------------\n"+title4+""+message4)
    line_bot_api.broadcast(messages=messages)

メッセージ本文を作ります。

run.py
    schedule.every().day.at("07:00").do(job)

    while True:
    schedule.run_pending()
    time.sleep(1)

最後にイベント発火するスケジュールを設定します。
今回だと毎朝7時に、このスクリプトが実行されます。

時間通りに発火しないという人はherokuの時間がUTCのままだからだと思います。
変更の仕方は、herokuにログインして以下のコマンドでできます。

heroku config:add TZ=Asia/Tokyo --app アプリ名

感想

気をつけなきゃと思ったことが、機密情報(APIキー等)をGitにそのまま上げてしまい「ヤベッ!」ってなりました。
みなさんは気をつけてくださいね。個人開発だったのでよかったもの、業務だったら大問題になり得ますからね。
セキュリティに関しては改めなくてはと思いました。
よく理解できていない所もまだまだあるのでアウトプットを通じ勉強していけたらと思います。

最後に

今回初めてpythonでアプリを作ってデプロイまで行いましたけど、ライブラリが豊富で意外と簡単に実装することができました。難しそうと思うより実際にやってみることが大事ですね。
これからも何かあれば記事を投稿していきたいと思います。
ご意見、質問等があればコメントをください!

13
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?