Python使って大学のポータルサイトのお知らせが更新されたら自動でtwitterに投稿させる

#はじめに
私の大学のポータルサイトはログイン状態を保存することができず、履修登録や抽選登録、その他諸々の情報を確認するためにいちいち学番とパスワードを入力しログインするのがめっちゃめんどいなぁとなてり

そこでpythonで定期的にお知らせが更新されていないかチェックし、更新されていればbotに呟かせるようにしてみた



#環境
python3.6.5
MacBook Pro 



#1.ポータルサイトへのログイン
お知らせが更新されているか確認するためにまずはポータルサイトへログインする必要があるがここではseleniumを使った

(seleniumが入ってないよって人はpipとかでinstallしてね)

##chromedriverをダウンロードする
seleniumでchromeを動かすためにchromeのOSにあったchrome driverを[ここ](http://chromedriver.chromium.org/downloads)からダウンロードしましょう

```example.py
from selenium import webdriver

driver_path = 'REPLACE_ME_YOUR_DRIVER_PATH'
driver = webdriver.Chrome(driver_path)
```

driverがダウンロードされたら上記のように記述することでchromeをseleniumで動かせるようになる。driver_pathにはダウンロードしたchromedriverへのパスを渡してやる



##ID/PASSWORDを入力してログインする
seleniumでIDとかパスワード聞いてくるサイトにログインするのはこちらがわかりやすかったです
https://qiita.com/shota-nekoneko/items/64bbd0c2f534d20e7b77



```example.py
#ログイン画面に飛ぶ
driver.get('ログイン画面のURL')

#ID/PASSを入力
id = driver.find_element_by_id('ユーザID入力フィールドの要素')
id.send_keys('ログインするユーザーのID')
password = driver.find_element_by_id('パスワード入力フィールドの要素')
password.send_keys('ログインするユーザーのパスワード')

time.sleep(0.5)

#ログインボタンをクリック
login_button = driver.find_element_by_name('ログインボタンの要素')
login_button.click()
```

IDとかPASSWORDの入力フィールドの要素はサイトによって違ったりするのでログイン画面のソース見て探します
ソースの見方はこの辺を参考に
・https://www.cvt-jp.com/google/3599/
・https://www.webdlab.com/mac/tips-view-source-code/

これでログインは完了です

#2.ポータルサイトからお知らせ部分を拾ってくる
ログインできたらサイトから必要な部分のテキストのみ抜き取ってくる

別にこのままseleniumでもできる気もしたがスクレイピングに関してはbeautiful soupの方がまだ触ったことがあったのでbeautiful soupを使ってテキストを抽出した

```example.py
from bs4 import BeautifulSoup

html = driver.page_source
soup = BeautifulSoup(html, "html.parser")

news_tag = soup.find("div", attrs={"class", "NEWS"})
txt = news_tag.get_text()
```

soup.find()では、お知らせが書かれてる部分のタグをざっくり取ってくるよ
[このへん](https://qiita.com/k-nasa/items/cb1927019aeff1158b33)とか参考にすると良い

```example.py
lines = [line.strip() for line in txt.splitlines()]
txt = "\n".join(line for line in lines if line)
```
こんな感じでいらない改行とか消しておく

#3.テキストファイルと比較して一致しなかったらbotに呟かせる
前もって比較用に前回スクレイピングした時のテキストをlast.txtとかなんとかとしてソースコードと同じディレクトリとかに置いておく

```example.py
f1 = open('テキストファイルのパス', 'r', encoding='utf8')
last_txt = f1.read()
f1.close()

if txt == pre_txt:
    driver.quit()
else:
    f1 = open('テキストファイルのパス', 'w', encoding='utf8')
    f1.write(txt)
    f1.close()
    ifttt_webhook()
    driver.quit()
```

前回スクレイピング時のテキストデータと比較して一致しなかったらツイートしてテキストファイルを上書きしておく

(encoding='utf8'をつけてないと後々Automatorで動かした時にエラー吐かれたので書いときました、
正直よくわかってない、)

ツイートするのには前もって作っておいた以下の関数を使用してIFTTTを叩く
(なんか同じツイートばかりするとあかんという話をどっかで聞いた気がするので現時刻も一緒に投げといた、)

```example.py
import datetime
import requests

now = datetime.datetime.now()

def ifttt_webhook():
    payload = {'value1': now}
    url = 'IFTTTのURL'
    requests.post(url, data=payload)
```

IFTTTでツイートするのは[こちら](https://chasuke.com/python_ifttt/)がわかりやすかったので参考に

#4.定期的にプログラムを動かす
ここまでで実際に動かすプログラムはできたのでこれをmacに定期的に動かさせます

[こちら](https://qiita.com/KurosawaTsuyoshi/items/425cd484e8d7759af460)を参考にしつつmacの標準アプリケーションAutomatorを使って.appにしていきます

Automatorを起動したらアプリケーションを選択します
<img width="479" alt="スクリーンショット 2019-07-23 1.09.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403716/a212362c-7403-d015-d1aa-0364d0891b93.png">

選択できたら以下のように’シェルスクリプトを起動’を選択します
<img width="1112" alt="スクリーンショット 2019-07-23 1.11.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403716/2060207a-5047-8ad5-309c-ff1243152f05.png">

ここまでできたら空白になっているテキストボックスに

```
python ~/なんとかー/example.py
```
てな感じでさっきまで書いてたプログラムへのパスを渡す
(pythonのところもpythonへのパスにしなきゃ上手くいかないこともある？らしい）

appができたら最後にmac標準搭載のカレンダー使って定期的にこのappを開かせるよ

カレンダーを開いたら新規イベントを作成し、通知の欄をカスタムにしてファイルを開くようにする
開くファイルで先ほど作ったappを選択してやれば完成！！
[この辺](http://gijutsubu.backstage.jp/?eid=87)わかりやすいので参考にー

<img width="1047" alt="スクリーンショット 2019-07-23 1.21.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403716/799c7706-a8e4-641f-908d-94247649ec11.png">

繰り返しで毎日とかにしてやれば毎日チェックしてくれて更新されてればツイートされる


あとはまあ作ったプログラムをラズパイで常時動かせたらいい感じかなぁ:smirk: