Slide 1

Slide 1 text

朝起きられないので キズナアイのおはようツイートだけを 通知して起きられるBOTを作った 2021/4/28 LT大会 yama

Slide 2

Slide 2 text

2  @y_a_m_a_y_a   @kurikinton105 @y_a_m_a id:y-a-m-a-y-a yama

Slide 3

Slide 3 text

yamaのその他 ‐ 作詞曲,DTM(M3春参加,VTuberに楽曲提供など) ‐ 旅行(この前京都行った) ‐ ハッカソン ‐ Smoothie Slideの布教中(このプレゼンも使ってる) https://smoothie-slide.web.app/ ‐ 注意:VTuberガチ勢とかではないのでご注意を。。 ‐ キズナアイの曲はすごく好き 3

Slide 4

Slide 4 text

Smoothie Slide ‐ オンラインプレゼンで、スライド移動が面倒! ‐ 原稿見ながら動かすスライド係 ‐ 「次のページお願いします!」 ‐ スライド番号を同期することで解決! ‐ Smoothie Slide ‐ リモート授業やハッカソン発表で大活躍 ‐ オータムハッカソン最優秀賞 4 布教

Slide 5

Slide 5 text

アップデートしました! ‐ UIの改善!より直感的に! ‐ Googleスライドみたいな全画面共有と発表者メニュー ‐ 本番中にスライド共有しながらメモやメンバーチャット ‐ →1人の時でも使うメリット!! 5 布教

Slide 6

Slide 6 text

6

Slide 7

Slide 7 text

7 https://youtu.be/yj9-hVVcBVk

Slide 8

Slide 8 text

8 https://www.youtube.com/watch?v=7723No1oYyk

Slide 9

Slide 9 text

みなさん、朝起きれてますか??

Slide 10

Slide 10 text

生活リズム...

Slide 11

Slide 11 text

yamaの春休み ‐ 4時寝11時起き 11

Slide 12

Slide 12 text

なぜ起きられないか?? ‐ なぜ起きれないか? ‐ 起きる理由、目的がない ‐ 光などの刺激がない ‐ 起きる<寝るの欲求に負ける 12

Slide 13

Slide 13 text

どうやったら起きられるか?? ‐ 起きる理由を作る ‐ 刺激を作る ‐ 欲求は難しい 13

Slide 14

Slide 14 text

JRの人たちの工夫(先人たちの知恵) 自動起床装置「おこし太郎」
 時間になったら
 ‐ 空気が膨らみ
 ‐ 上半身が弓なりになる
 
 →完全に起きれる
 https://www.itmedia.co.jp/lifestyle/articles/0407/23/news049.html

Slide 15

Slide 15 text

メザミー(最近の例) ‐ 起きないと課金される →お金は大事!起きれる 近日中にリリースされる予定
 らしい。
 15 https://blogos.com/article/532297/

Slide 16

Slide 16 text

キズナアイのおはようツイート

Slide 17

Slide 17 text

キズナアイとは 17

Slide 18

Slide 18 text

キズナアイのおはようツイート ‐ 今日は何の日かを教えてくれる ‐ 動画の最後にじゃんけんがある ‐ だいたい6時から8時の間に多い ‐ なんかかわいい 18 起きるモチベーションに繋がる????

Slide 19

Slide 19 text

おはようツイートの例 19

Slide 20

Slide 20 text

完成形 SlackとDiscordのBotに対応している ツイートされたら、通知が入る! 20 https://youtu.be/REUN8x0V5wg

Slide 21

Slide 21 text

Googleフォームから簡単に使えます! ‐ webhookURLを送信すると使えるようになる!! ‐ 利用の停止、変更、新規登録が楽! https://docs.google.com/forms/d/e/1FAIpQLScrBF_1cD_vNB3E18jl-2FWkd8REe6OMfvs5YeIG_DsQ6vcyg/viewform

Slide 22

Slide 22 text

使用技術 22 ● Python ● Heroku ● TwitterAPI ● Googleフォーム ● Googleスプレットシート(SheetsAPI)

Slide 23

Slide 23 text

1. キズナアイのツイートが あったら通知を送る

Slide 24

Slide 24 text

“ どうやったらできるか?? 24

Slide 25

Slide 25 text

Heroku Scheduler ‐ 10分に一度実行してくれる公式アドオン ‐ 10分ごとに新しいツイートがあるか調べるコード ‐ カードの登録が必要だけど、基本無料 25

Slide 26

Slide 26 text

仕組み1 ‐ TwitterAPIを使って、キズナアイのツイートを取得する ‐ (TwitterAPIにはAPI申請が必要) ‐ tweepyライブラリを利用 ‐ TweetIdより値が大きいときが新規ツイート 26

Slide 27

Slide 27 text

コード詳細 def GetUserTweet_data( Account,tweet_id,option_time =10): ... tweets = api.user_timeline(Account, count=20, page=1) BaseURL = f"https://twitter.com/{ Account }/status/" tweet_data =[] for tweet in tweets: if tweet_id < tweet.id: TweetURL = BaseURL+str(tweet.id) tweet_text = f"{tweet.text}\n{TweetURL}" tweet:dict ={"id":tweet.id , "data":tweet_text} tweet_data.append(tweet) return tweet_data https://github.com/kurikinton105/MorningKizunaAI/blob/main/MorningKizunaAI.py Accountのツイートを 20件取得する 取得したツイートが 新規ツイートか判別する

Slide 28

Slide 28 text

仕組み2BOT編 def WebhookApp(webhook_url,comment, username,image_URL): if "discord" in webhook_url: ... elif "slack" in webhook_url: ... else: return Exception("Not found:Webhook") 28 DiscordとSlack両方 のWebhookに対応

Slide 29

Slide 29 text

2. おはようツイートか判別する

Slide 30

Slide 30 text

“ 意外と難しい???? おはようと言っているだけではない 30

Slide 31

Slide 31 text

判別が大変そうな例 ‐ 31 https://twitter.com/aichan_nel/status/1323747817538510848 https://twitter.com/aichan_nel/status/1343703270808666113

Slide 32

Slide 32 text

おはよーじゃない時 ‐ 32 https://twitter.com/aichan_nel/status/1332806976850411521 https://twitter.com/i/web/status/1333161311341985793

Slide 33

Slide 33 text

げつようび系 ‐ 33 https://twitter.com/aichan_nel/status/1335698153857720321 https://twitter.com/aichan_nel/status/1350920380383338500

Slide 34

Slide 34 text

どうしたか?? ‐ その日の一番はじめのツイート→おはようツイート ‐ 動画が付いている ‐ 6時から11時までの間に投稿されている 34

Slide 35

Slide 35 text

5時から12時までのツイートを取得した例 35

Slide 36

Slide 36 text

コード解説 def isMorningTweet(tweet,time_now,isTest=False): isMorningTweet = False # 5時にリセットする! if int(time_now.hour)== 5: ... # 5時代は、0にリセットする elif 6 <= int(time_now.hour) and int(time_now.hour) < 12 : # 時間での判別 if tweet['data'].find("https://t.co") != -1 and tweet['data'] not in "RT": # 動画のツイート&RTじゃない ... 動画ツイートの取得 return isMorningTweet 36

Slide 37

Slide 37 text

3. スプレットシートを データベースとして使う

Slide 38

Slide 38 text

なぜスプレットシート?? ‐ 利点 ‐ Googleフォームとの連携ができる ‐ フロント側を作る必要がない ‐ 来月まで無料 ‐ スマホから簡単に見れる ‐ 欠点 ‐ GCPで設定が必要 ‐ SQLが使えない ‐ アクセス制限など 38 登録、更新、削除は Googleフォームに おまかせ!

Slide 39

Slide 39 text

実際にどんな形か? 39

Slide 40

Slide 40 text

ついでにログも取ってみた 40

Slide 41

Slide 41 text

実際のコード 41 https://github.com/kurikinton105/MorningKizunaAI/blob/main/SheetsAPI/sheet.py スプレットシートの認証 (ほぼドキュメント通り) スプレットシートのシートを選 択

Slide 42

Slide 42 text

実際のコード get_all_values()関数を使う 42 辞書型で返される https://github.com/kurikinton105/MorningKizunaAI/blob/cb83c6ef4f8c23205cbc166dfabb0b3 f112a0109/SheetsAPI/sheet.py#L28

Slide 43

Slide 43 text

4. テストを書いてみた

Slide 44

Slide 44 text

背景 ‐ 脳死でコードを書いていた ‐ Herokuで遊んでたので、Herokuのプロジェクト以外にも なんか動いていた。 ‐ SheetsAPI.pyを使いまわしていたりなど →今回発表するようにコードを公開する。 プロジェクトの移行が必要!! 44

Slide 45

Slide 45 text

テスト設計 ‐ Pythonのunittestを利用 テスト一覧 1. おはようツイートの探索を行い通知が入るかの確認 2. おはようツイートではないと判別する 3. ツイートがない場合に何も行わない 45

Slide 46

Slide 46 text

テスト書く上での壁 1. テストしたい時に、キズナアイが おはようツイートしてくれるわけではない 2. 本番環境のスプレットシートに接続するとやばい 46

Slide 47

Slide 47 text

テスト書いた 1. おはようツイートの探索を行い通知が入るかの確認 →テスト用のスプレットシート  テスト用のアカウントでツイート  朝の時間に設定 2. おはようツイートではないと判別する →もう一度ツイート 2個目以降なので通知が入らない 3. ツイートがない場合に何も行わない 47

Slide 48

Slide 48 text

簡単にコード https://github.com/kurikinton105/MorningKizunaAI/blob/main/TestAI.py 48 時刻の変更 スプレットシートのリ セット テスト用の アカウントで ツイート 実行&出力の確認

Slide 49

Slide 49 text

終わり

Slide 50

Slide 50 text

Googleフォームから簡単に使えます! ‐ webhookURLを送信すると使えるようになる!! ‐ 利用の停止、変更、新規登録が楽! https://docs.google.com/forms/d/e/1FAIpQLScrBF_1cD_vNB3E18jl-2FWkd8REe6OMfvs5YeIG_DsQ6vcyg/viewform