40 代おっさんPythonを使って自分あてに指定したLINEを送る

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## 参考資料

<https://www.udemy.com/course/python-kaizen/learn/lecture/26849736#overview>

## 目標

LINE Notifyを使い、Webスクレイピングを行って、明日の天気予報を自分のLINEに送る。

## 環境

以前はCloud9を使用していましたが、今回はExcelのため変えることにしました
Windows 10
Jupyter Notebook
そのため構文に少し違いがあります。
気を付けてください

## LINE Notify

LINE Notifyとは
LINEと外部のWebサービスやアプリを連携し、ユーザーがカスタマイズされた好みの情報を受け取ることができる機能

### アクセストークン発行

自分が書くより説明がしっかりなされていたのでこちらを参照してください

<https://qiita.com/iitenkida7/items/576a8226ba6584864d95>

コピーしてメモ帳へ

### エンドポイントURLを取得

こちらはマイページに行って
トークン発行の下にある
LINE Notify API Documentをクリック
そちらの通信系（認証系もあるので注意）のPOSTから先の部分をコピーしてメモ帳へ

### Jupyter上でトークンとエンドポイントURLを記述

発行したトークンと
エンドポイントURL
Jupyter上で

```python
token="ご自身のアクセストークン"
url="https://notify-api.line.me/api/notify"
```

実行する

### requestsをインポート

requestsとは
PythonのHTTP通信ライブラリです。
使い方は
こちらのほうがわかりやすいので
<https://hibiki-press.tech/python/requests_module/1882>

#### 実際にLINEに送ってみる

```python
auth={"Authorization":"Bearer "+token}
content={"message":"利樹大好き"}
requests.post(url,headers=auth,data=content)
```

LINE NotifyからLINEが来たと思います。

## 天気予報をWebスクレイピングする

### BeautifulSoup4

BeautifulSoup4とは
HTMLファイルやXMLファイルからデータを抽出するためのPythonライブラリ

#### BeautifulSoup4インストール

```python
!pip install BeautifulSoup4
```

#### BeautifulSoup4インポート

```python
from bs4 import BeautifulSoup
```

### 天気の情報を取ってくる

今回はYahoo天気を使います
urlを変数に格納

```python
tenki_url="https://weather.yahoo.co.jp/weather/jp/1b/1400.html"
```

urlの情報を変数に格納

```python
response=requests.get(tenki_url)
```

今のままではtext情報がすごい分かりずらくなるので
BeautifulSoupを使いわかりやすくする。
そしてそれを変数に格納

```python
html=BeautifulSoup(response.text,"html.parser")
```

#### 必要な情報を取ってくる

このままだと情報がありすぎるので必要な情報を精査する
find_allメソッドを使う
attrsで属性を指定
リストの中にあるので必要な個所を取り出す[]を使って配列を指定
変数に格納

```python
forecast=html.find_all("div",attrs={"class":"forecastCity"})[0]
```

明日の天気が欲しいのでそれも精査する

```python
tomorrow=forecast.find_all("div")[1]
```

必要な個所に限定し余計な文字、スペースを取る
textで情報を取得
余計な文字は
replaceで除去
変数に格納

```python
weather=tomorrow.find_all("p",attrs={"class":"pict"})[0].text.replace("\n","").replace(" ","")
```

同じ要領で必要個所の抽出

最高、最低気温

```python
high=tomorrow.find_all("li")[0].text
low=tomorrow.find_all("li")[1].text
```

書く時間の降水確率

```python
rain_06=tomorrow.find_all("td")[4].text
rain_0612=tomorrow.find_all("td")[5].text
rain_1218=tomorrow.find_all("td")[6].text
rain_1824=tomorrow.find_all("td")[7].text
```

## LINEに天気の情報を送る

### messageに天気の情報を格納する

\nで改行する方法もあるのだが水らくなるため
""""""を使って改行する

```python
message="""
明日の天気は{}
最高気温{}
最低気温{}
降水確率は
0-6時{}
6-12時{}
12-18時{}
18-24時{}
です。""".format(weather,high,low,rain_06,rain_0612,rain_1218,rain_1824)
```

### 送ってみる

```python
auth={"Authorization":"Bearer "+token}
content={"message":message}
requests.post(url,headers=auth,data=content)
```

できました～～
分かりにくいのでまとめたコードを作って見ました

```python
import requests
from bs4 import BeautifulSoup

#LINEにつなげるトークン
token="ご自身のアクセストークン"
#エンドポイント
url="https://notify-api.line.me/api/notify"
#Yahoo天気のURL
tenki_url="https://weather.yahoo.co.jp/weather/jp/1b/1400.html"

#天気情報を取ってくる
response=requests.get(tenki_url)
html=BeautifulSoup(response.text,"html.parser")
forecast=html.find_all("div",attrs={"class":"forecastCity"})[0]
tomorrow=forecast.find_all("div")[1]

#各情報を文字化
weather=tomorrow.find_all("p",attrs={"class":"pict"})[0].text.replace("\n","").replace(" ","")
high=tomorrow.find_all("li")[0].text
low=tomorrow.find_all("li")[1].text
rain_06=tomorrow.find_all("td")[4].text
rain_0612=tomorrow.find_all("td")[5].text
rain_1218=tomorrow.find_all("td")[6].text
rain_1824=tomorrow.find_all("td")[7].text

#LINEに送るメッセージを作る
message="""
明日の天気は{}
最高気温{}
最低気温{}
降水確率は
0-6時{}
6-12時{}
12-18時{}
18-24時{}
です。""".format(weather,high,low,rain_06,rain_0612,rain_1218,rain_1824)

#LINEに送る
auth={"Authorization":"Bearer "+token}
content={"message":message}
requests.post(url,headers=auth,data=content)
```