どうもヨスケです。
最近忙しくてなかなかPythonをいじれなかったのですが、触りだすと楽しいです♪
今回はPythonプログラミングとWebサービスの連携にチャレンジします。
Pythonプログラムでする「LINEメッセージの自動送信(配信)」成果物の仕様
①Yahoo!ニュースのトピックスを
②定期的に
③LINEメッセージで送信する
作るプログラムの仕様確認
冒頭に書きましたとおり、成果物(プログラム)の仕様は以下の通りです。
①Yahoo!ニュースのトピックスを取得する。(BeautifulSoup)
②定期的に実行する。(Schedule)
③LINEメッセージで送信する。(LINE Notify)
この3つのタスクを織り込んだPythonプログラムを作成するのが今回のゴールです。
ただし、①②についてはすでに過去の記事で作成済みですので、そちらを流用いたします。
①Yahoo!ニュースをスクレイピング 【BeautifulSoup】
②タスクの定期実行 【Schedule】
LINE機能との連携 【LINE Notify】
成果物の仕様③ 「LINEメッセージの自動送信」ですが、LINEの機能との連携のため、「LINE Notify」というサービスを使用します。
LINE Notifyとは?
「LINE Notify」とは、APIにより連携することで、外部Webサービスやアプリ(プログラム)などからLINEメッセージで通知を配信できるサービスです。
使い方
LINE Notifyの使い方は非常に簡単で、3ステップです。
- LINE Notifyのサイトにアクセスしてログイン
- 送信相手先を選んで「トークン」を発行
- プログラムにトークンを指定してメッセージ送信
これだけです。
ただ前提として、LINEのアカウントが必要ですので、まだお持ちでなければまずはLINEのスマホアプリをインストールしてアカウント登録をしましょう。
LINE Notifyのサイトにアクセスしてログインする
LINE Notifyのサイトにアクセスして、右上にある「ログイン」をクリックしてログインします。
ログインしたら自分の名前が表示されたところをクリックしてマイページを選択してください。
送信相手を選んでトークンを発行する
「アクセストークンの発行(開発者向け)」の部分で
「トークンを発行する」からメッセージを送信する相手を選択します。
今回は自分にニューストピックスを送信したいため、「1:1でLINE Notifyから通知を受け取る」を選択しましょう。
プログラムにトークンを指定してメッセージ送信
発行したトークンを使ってメッセージ送信する処理をプログラムに書きます。
小難しいコードがありますが、基本的に「おまじない」だと思って道具として使うことをお勧めします。 ヨスケもそうですw
# アクセストークン
acc_token = '********************************************'
defsend_line(msg):
# サーバーに送るパラメータを用意 ---おまじないと思って使いましょう!
url = 'https://notify-api.line.me/api/notify'
headers = {'Authorization': 'Bearer ' + acc_token}
payload = {'message': msg}
requests.post(url, headers=headers, params=payload)
#LINEに抽出したニュースをメッセージで送信する
send_line('現在のトップニュースです')
send_line(today_list)
Yahoo!ニューストピックスをLINEメッセージで送信!
今回もいつもと同じでソース全部見せです☆
ソースコード
#requestsとBeautiful Soup のインポート
import requests
from bs4 import BeautifulSoup
import schedule
import time
# アクセストークン
acc_token = 'LfJME1uCi5P0W5DclQCHQvXY12xn56hJFznoTks6McV'
def send_line(msg):
# サーバーに送るパラメータを用意 ---おまじないと思って使いましょう!
url = 'https://notify-api.line.me/api/notify'
headers = {'Authorization': 'Bearer ' + acc_token}
payload = {'message': msg}
requests.post(url, headers=headers, params=payload)
def job():
#ターゲットURLの変数化
url = "https://news.yahoo.co.jp/"
# このあたりはおまじない!わからなくてもOK! 狙いのURLのhtmlをタグごとに解析します。
r = requests.get(url)
content_type_encoding = r.encoding if r.encoding != 'ISO-8859-1' else None
soup = BeautifulSoup(r.content, 'html.parser', from_encoding=content_type_encoding)
# Beautiful Soup の find() で、主要ニュースの部分のみを抽出します。
today = soup.find("section", attrs ={"id":"uamods-topics"})
# 記事のタイトルとURLがある部分を抽出
entries = today.find_all("li")
# ニューストピックス格納用リスト
today_list = []
index = 1
# あるだけ情報を取得する
for entry in entries:
# "li"の箇所のタイトルに該当するテキスト(ページ上の文章)を取得
title = entry.get_text()
# "li"の箇所のURLを取得
entry_url = entry.find("a").get("href")
# 出力用リストにタイトルとURLを格納
today_list.append([index, ' ' , str(title), ' ' ,entry_url , ' '] )
# インデックスをインクリメント
index += 1
#LINEに抽出したニュースをメッセージで送信する
send_line('現在のトップニュースです')
send_line(today_list)
#2時間毎のjob実行を登録
schedule.every(2).hours.do(job)
#登録したjobを実行。今回は無限ループで実行
while True:
schedule.run_pending()
time.sleep(1)
実行結果
実行してみました。ヨスケのスマホにメッセージが到着!
2時間おきに最新のニュースを送信してくれるプログラムが完成しました!
まとめ
以下3つの処理を織り込んだPythonプログラムが完成しました◎
①Yahoo!ニュースのトピックスを取得する。(BeautifulSoup)
②定期的に実行する。(Schedule)
③LINEメッセージで送信する。(LINE Notify)
②の「定期的に実行する。」の部分ですが、今はPCでPythonプログラムを起動しないと遅れないため、解決方法を模索中です。
サーバーサイドのプログラム?
まだまだやってみたいことがあるので、色々なことを勉強できそうです。
今後も定期的にプログラミングスキルの向上のため学習を継続します。
↓今回参考にしたPython学習書籍
ブログランキングに登録してみました。もしよければポチってください。↓