Discord Webhookでお天気&タスクbot
https://gyazo.com/d3cc6269abc5f15fd8b410f450df57bf
三行で
Discordにwebhookでbotに投稿させることができる。
IFTTTを使えばプログラミングが不要だが、複雑なことはできない。
GASを使うといろいろ出来る。
目的
人間に向いてないので定期的になにかをするということができない
BOTに通知させる
一番見るのはDiscord
Discord Webhookで定期的に通知させる
やらせたいこと
天気確認
できた
タスク確認
できた
メール通知
まだ
まずはGithubと連携
DiscordのWebhookを試すためにGithubと連携させてみる。
といっても公式の記事をなぞるだけ
Webhookに正しくメッセージを表示させるには、最後に '/github''を付けることがとてもとてもとても重要です。はい、それは本当に重要なんです。
だそうです。
triggerをpush eventに設定していればpushするたびにメッセージが来る。
https://gyazo.com/f9a22d55d472dd8966d6ed8e19f82c4f
webhookの動作が確認できた。
投稿内容をカスタマイズする
BOTの投稿内容を指定する。
BOTのアカウント名
アイコン
テキスト
埋め込みテキスト
サムネイル
リスト表示
参考記事
ここを一通りやる。
code:json
{
"content": "Hi"
}
embed
埋め込みでいい感じのテキストを表示させるもの
https://gyazo.com/ca3f4d84c0fe7db0af1d8e77921dbb99
こんな感じに文字やサムネイル画像をまとめて投稿できる。
ツールがあった。
メッセージの装飾方法がわかった。
IFTTTと連携する(ボツ)
先に結論
結局IFTTTじゃなくてGASを使いました
細かく投稿を編集できない
IFTTT
イフト
Webサービス同士を連携できるサービス
スマートスピーカーとかも連携できるらしい
プログラミングが不要
天気予報をする
if
this :トリガー
then
that:叩くAPI(今回はWebhook)
まずthisにweather undergroundを選択する
https://gyazo.com/3712bb99dd3df965cad6b1da5c775d6c
Today's weather reportで今日の天気予報
トリガーの設定
time of day
通知する時間
Location
予報する場所
次にthatにwebhookを設定する。
https://gyazo.com/b0bcc8f17cba8ecf8c261241d777ccbe
今までと同様にやる
URL
discordのWebhook
Method
POST
ContentType
application/json
Body
code:json
{"content":"{{TodaysCondition}} today! Temp: Max{{HighTempCelsius}}C - Low{{LowTempCelsius}}C"}
結果
https://gyazo.com/2cc02c53f06592bf8b2128a2c82bc119
なんかShowersとか言われてもよくわからない
日本語版は見つからなかった
GASでやろう。
GASで天気予報
Google Apps Script
GAS
自動化したりAPIにしたりできるすごいやつ
あーくまのちーからー
googleのサービスといろいろ連携できる
今回はあんまり関係ない
6分の制限時間がある
光の巨人
参考
まずはソース(正確にはjsじゃないらしいけど、ハイライト目的)
code:js
function getWeatherPost() {
var DISCORD_WEBHOOK = PropertiesService.getScriptProperties().getProperty("DISCORD_WEBHOOK");
var json=JSON.parse(response.getContentText());
var icon = getIcon(weather);
var data = {
"content": "今日の天気予報だよ。",
"embeds": [
{
"title": title,
"color": 5620992,
"thumbnail": {
"url": img
},
"fields": [
{
"name": "天気",
"value":icon +" : "+ weather,
},
{
"name": "最高気温",
"value": max + " ℃",
"inline":true
},
{
"name": "最低気温",
"value": min + " ℃",
"inline":true
}
]
}
]};
var options =
{
"method" : "POST",
'contentType': 'application/json',
'payload' : JSON.stringify(data)
};
UrlFetchApp.fetch(DISCORD_WEBHOOK, options);
}
function getIcon(weather){
icon = {"晴":":sunny:", "曇":":cloud:", "雨":":cloud_rain:", "雪":":snowman2:"};
state = {"時々":":left_right_arrow:", "のち":":arrow_right:"};
if(weather.length > 2){
}
else{
}
}
天気予報を取得
livedoorのサービスを利用する
基本URL + 都市のID
東京は130010
UrlFetchApp.fetch()で取得したjsonを利用する
気温が取得できない
当日の予報だと最低気温や両方の気温がnullだったりする。
条件がよくわからない
(today["temperature"]["max"] && today["temperature"]["max"]["celsius"]) || "-";
とりあえず"-"を表示させる。
getIcon()
天気に合わせてアイコンを表示する
参考
var DISCORD_WEBHOOK = PropertiesService.getScriptProperties().getProperty("DISCORD_WEBHOOK");
webhookのURLを公開すると誰でもチャンネルに投稿させることができてしまう。
GoogleAppsScriptのスクリプトのプロパティをつかって定数を登録する
DISCORD_WEBHOOKにwebhookのURLを設定する。
実行する
関数を指定で getWeatherPost()を指定し再生ボタンを押す。
指定時間に起動する。
自分のプロジェクトからプロジェクトを選択のsしトリガーを選択
getWeatherPost()を選択
イベントのソースを時間主導型
トリガーのタイプを日付ベースのタイマー
時刻を好きな時刻に
https://gyazo.com/5ecfa12f4a3d2700a40df702bdd8ed5e
結果
https://gyazo.com/7200f66ded3a009241791373eb9186c1
夜の8時に通知されても…
GASでTodoistと連携
Todoist
Todoistはシンプルなタスク管理アプリ
ブラウザ版やWin版モバイル版もある。
IFTTTにも連携しているのでそっちでもできる。
Todoistでその日のタスクを通知したい
TodoistのAPIを使う。
今のAPIはv8だった
v7でやってしまった
一応動く
参考
ソース
code:js
function todoistPost() {
var DISCORD_WEBHOOK = PropertiesService.getScriptProperties().getProperty("DISCORD_WEBHOOK");
var TODOIST_TOKEN = PropertiesService.getScriptProperties().getProperty("TODOIST_TOKEN");
var projectID = "1215957920"
var formData = {
"token": TODOIST_TOKEN,
"project_id": projectID
};
var response = UrlFetchApp.fetch(url, {
"method" : "post",
"payload" : formData
}).getContentText()
var data = JSON.parse(response);
var messages = [];
var tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1)
for(index in data.items){
var utc = data.itemsindex.due_date_utc; if(utc != null){
var date = new Date(utc)
if(date.getTime() < tomorrow.getTime()){
messages.push(task2message(data.itemsindex)); }
}
else{
messages.push({
"name":":small_orange_diamond:"+data.itemsindex.content, "value":"期日なし"
});
}
}
Logger.log(messages);
var discordMessage = {
"content": "今のタスクはこんな感じ。",
"embeds": [
{
"title": "Todoist",
"color": 15748929,
"fields": messages
}
]};
var options =
{
"method" : "POST",
'contentType': 'application/json',
'payload' : JSON.stringify(discordMessage)
};
UrlFetchApp.fetch(DISCORD_WEBHOOK, options);
}
function task2message(task){
var message ={
"name":":small_orange_diamond:" + task.content,
"value":task.date_string
};
return message
}
TodistのAPIトークン
設定
連携機能
API トークン
projectID
参照するタスクのプロジェクトのprojectID
トークンもプロパティに登録する。
var TODOIST_TOKEN = PropertiesService.getScriptProperties().getProperty("TODOIST_TOKEN");
現在時刻から期日が24時間以内か、期日なしのタスクを通知する。
よく期日を設定し忘れるため
指定時間に起動
一日二回とかの場合はトリガーを二つ登録する
もしくは12時間ごととか
結果
https://gyazo.com/c54275f28f6f9f53e29ad52360c4a780
まとめ
Discordはいいぞ
Webhookもいいぞ
slackbotとかを流用できる。
GASもいいぞ
鯖代かからない
ke456.icon以上