どーも最近反抗期のオーカワです。以前親に生存確認を送るBOTを作りました。
IFTTTとLINE Notiftを使い、毎朝8:00に元気ですと送信するBOTでした。
まぁ速攻でバレたんですがwwwwwwwwww
なので今回はバレないように慎重に作っていこうと思います(技術の無駄遣いが始まる)
Contents
前回バレた原因
- グループに参加させないといけない
- ぴったり8:00に送信
- アカウント名がLINE Notify
- メッセージの最初に必ず[IFTTT]
まぁこんな所だと思います。これを改善していこうと思います。
箇条書きにしてみると、ひどい内容です(笑)
BOT作成の準備
はい。今回はLINE NotifyやIFTTTなどを使わずに本格的なLINE BOTを作っていきます。企業のLINE BOTと一緒です。
BOTを作るには
- LINE Business Centerに登録
- LINE DevelopersのChannelsにアクセス
- ChannelのIDやアクセストークンを取得
結構やる事がありますね。
LINE Business Centerに登録、アカウントを作成します。
LINE@ MANAGERの設定
まずはLINE@の設定から
アカウント設定のBOT設定に行き、BOTの利用を許可します。
リクエスト設定のWebhook送信を利用すると設定します。
(ここを設定しないとBOTのプログラムが動きません)
後は自由に設定をします。僕はこんな感じに設定しました。
アカウント名やアイコンは自由に適当に
LINE Developers(Messaging API)の設定
事前に設定するものは特にありません。
LINE Developersにはプログラムで使う情報が載っています。
ここにあるWebhook URLは後に設定をします。
ボツ案
まずはボツ案から。興味のない方は下にスクロールを
Raspberry Piを用いた生存確認システム
次回予告でRaspberry Pi を使うと言ったのに、ボツに......(悲)
家にあるRaspberry Piの上に携帯を近づけると「元気です」と送信するBOT......
LINE Beaconのシステムを使用し、Bluetoothを用いて携帯が近づいたか判断をします。近づいたらメッセージを送信と......
これならBOTでも、本当に生存確認が出来ているので、バレてもいいと思っていました。
何がダメなの?
動作が不安定なんです。携帯を近づけても反応しない。と思えば10件程「元気です」と送信さたり、されなかったり。はっきり言ってゴミです。
これはネットワークが原因だと思われます。
LINE BOTと通信する為に必要なWebhook URLはSSL認証が必要です。ですが僕はSSL認証をしているアドレスを持っていなかったので、無理やりNode.jsのlocal tunnelという技術を使用し、技術的にSSL認証を偽装しました。これが無理やりすぎて不安定になっているという感じでした。
その他にもいろいろ実装しましたが、Raspberry Piを使う事がボツに。SSL認証とかダルすぎだろ、Twitterを見習えって
人工知能を利用した自動返信
Docomoさんの雑談APIを使用して、来たメッセージに自動で返信をする機能を作りました。
自分のBOTと喧嘩が始まった pic.twitter.com/42wfiAVxbI
— おーかわ(コンパス) (@okawa_compass) June 2, 2017
これだとBOTとバレてしまいますな。 pic.twitter.com/YebbofLSgl
— おーかわ(コンパス) (@okawa_compass) June 2, 2017
まぁバレますよね。ボツです。ボツー
プログラムは後ほど出てきますが、コメントアウトしています。
自分の過去ツイートを学習させたものを作っても、ほとんどが下ネタ&超ぎこちないのでボツに......(過激すぎて画像載せられない)
作成したBOT
ようやく本題ですね。
特定の単語を含む文章にのみ自動返信
今は「元気」と含まれる文章にのみ「元気」と返信するような仕組みになっております。技術レベルが一気に低くなった
親とのLINEを見返すと、親のメッセージが50件中、約40件が「元気かい」だったんですね。
もはや親BOT説ありますよね。予測変換なんでしょうが。
80%BOTが自動で返信してくれば便利ですね。残りの20%は手動BOTで対応です。
作成したプログラム
プログラムはGoogle Apps Scriptで書きました。Java Script言語だと思っていただいて大丈夫です。(正確には違いますが)
Google Apps Scriptはクラウド上でスクリプトを実行することで操作できるサービスです。
ボツ案でも話したSSL認証が、Goolge Apps Scriptを使うと簡単に回避出来まーす。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
var SLACK_API =""; var CHANNEL_ACCESS_TOKEN = ''; var DOCOMO_URL = 'docomo_url(今回はいらない)'; //webhook_urlから送られた場合 function doPost(e) { var reply_token= JSON.parse(e.postData.contents).events[0].replyToken; var add_friend = JSON.parse(e.contentLength); //友達追加された時の動作 if (add_friend == 174){ var friend_id = JSON.parse(e.postData.contents).events[0].source.userId; var send_mes = "友達が追加されました" + friend_id; postSlackMessage(send_mes); } //メッセージが無かったら殺す if (typeof reply_token === 'undefined') { return; } //きたメッセージを取得 var user_message = JSON.parse(e.postData.contents).events[0].message.text; var mother_message = "メッセージが来たよーん【" + user_message + "】"; postSlackMessage(mother_message); //メッセージに元気と含まれていたら、元気ですと返す if ( user_message.indexOf('元気') != -1 ) { //とりまdocomo_apiはコメントアウト //var user_message2 = getDialogueMessage(user_message); var user_message2 = "元気"; var bot_message = "BOT...(" + user_message2 + ")"; postSlackMessage(bot_message); var url = 'https://api.line.me/v2/bot/message/reply'; UrlFetchApp.fetch(url, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, }, 'method': 'post', 'payload': JSON.stringify({ 'replyToken': reply_token, 'messages': [{ 'type': 'text', 'text': user_message2, }], }), }); return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); } //それ以外 else{ var slack_message = ":yabasou: オーカワ様、至急メッセージに返信してください。" postSlackMessage(slack_message); } } // ドコモ雑談会話にメッセージを投げ、気の利いた回答を受け取る関数 function getDialogueMessage(mes) { var dialogue_options = { 'utt': mes } var options = { 'method': 'POST', 'contentType': 'text/json', 'payload': JSON.stringify(dialogue_options) }; // ここでドコモ雑談会話エンドポイントにメッセージを投げる var response = UrlFetchApp.fetch(DOCOMO_URL, options); // ドコモAIからの回答はJSON形式なのでオブジェクト変換 var content = JSON.parse(response.getContentText()); // ドコモAIから取得した回答部分を呼び出し元に戻す return content.utt; } //Slackに通知 function postSlackMessage(mes) { var token = PropertiesService.getScriptProperties().getProperty(SLACK_API); var slackApp = SlackApp.create(token); //SlackApp インスタンスの取得 var options = { channelId: "#program", //チャンネル名 userName: "LINE_BOT", //投稿するbotの名前 message: mes //投稿するメッセージ }; slackApp.postMessage(options.channelId, options.message, {username: options.userName}); } |
使い方
Google Driveにアクセスして人気のフォルダー(場所)で右クリックし、Google Apps Scriptを選択します。
次にプログラムをコピペし、プログラムの設定をします。
設定する箇所は
- 2行目のSLACK_API及び87~88行目
- 3行目のCHANNEL_ACCESS_TOKEN
親からのメッセージを受け取る為にSlackを使用しています。別にTwitterでもなんでも良かったのですが、僕はよくSlackを利用しているので使いました。
Slackの設定はこちらを参考に(特にSlackAppのLibrary Key)の設定を見てください。
CHANNEL_ACCESS_TOKENはLINE Developers(Messaging API)に載っています。
設定が終わったら、プログラムの公開設定をします。
公開設定をする事によって、プログラムがLINEのメッセージを受け取る事が出来ます。
- 公開→ウェブアプリケーションとして導入
- プロジェクトバージョンを新規作成に設定
- アプリケーションにアクセスできるユーザーを全員(匿名ユーザーを含む)に設定
- Googleから承認が必要と言われるので、承認します。
承認すると公開するURLが作られます。このURLをLINE Developers(Messaging API)のWeb hook URLに設定します。
うまく設定出来てると、プログラムが動くはずです。
結果
元気と含む文章だったら元気と返し、それ以外は無視します。
このBOTの想定は親ですが、今回は僕がBOTと対話します。
画面左がLINE,右がSlackの画面です。
今回はBOTをグループなどに入れないので、やりとりが見えないといけないのです。
なのでSlackに通知を入れるようにプログラムを書きました。
ちなみにこのBOT、友達登録されても通知をしてくれます。
このようなメッセージが届くはずです。
UのあとはLINE のUser IDです。(いつも使ってるLINE IDではありません)
このUser IDは後で使うので記憶しておきます。ユーザー名を表示出来ないのは仕様です。どうしようもありません。
僕は親にBOTのLINEのQRコードを送って、すぐにSlackに通知来たUser IDを親と記憶しました(超手動)
どうやって手動でメッセージを送るの?
はい。自動返信はプログラムがやってくれます。
手動でメッセージを送る場合、LINE@からLINE BOTにログインして、超使いづらいUIからメッセージを送らないといけません。しかもメッセージに送る相手を選べなくて、友達全員に送ってしまう糞システム
いちいちログインして、公式のサービス使うのも馬鹿らしいので、メッセージ送るプログラム(コマンド)を作成しました。
作成したプログラム
lineというコマンドで保存しました。シェルで動きます。別にわざわざコマンドにする必要ないけど
一応Mac と Linuxで動作確認をしています。Windowsは多分動くと思いますが、僕はWindowsを滅多に使わないので、試していません。
Channel_Access_TokenとUser_idは各自設定してください。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#!/bin/zsh Channel_Access_Token="自分のBOTのChannel_Access_Token" User_id="送る相手(書き換えてね)" if [ -n "$*" ]; then Text="$*" else Text="元気です" fi echo "$Text"と送信しました curl -X POST \ -H "Content-Type:application/json; charset=UTF-8" \ -H "Authorization: Bearer ${Channel_Access_Token}" \ -d "{ \"to\": \"${User_id}\", \"messages\":[ { \"type\": \"text\", \"text\": \"$Text\" } ] }" \ https://api.line.me/v2/bot/message/push &> /dev/null |
使い方
|
1 |
$ line |
で元気ですと送信されます。
|
1 |
$ line 任意の文字 |
で任意の文書が送信されます。
実行結果
普段は親に送るプログラムですが、今回はテストなので、BOTから僕に送ってみようと思います。
パソコンは常に持ち歩いているので、このコマンドさえあれば大丈夫ですね。
ちなみにこのコマンドはシェル芸と組み合わせる事によっていろいろと悪用が出来ます。絶対にやるなよ。友達減るぞ
まぁアホです。他にもいろいろ面白い事が出来ますが、この辺にしときます。
シェル芸に興味持った方はこちらの記事もどうぞ
現在LINE BOTは?動いてるの?
はい。動いています。
ただ親も2度目なので、かなり怪しがっています。
「これまた自動じゃないよね」とか「すぐ既読になるんだけど?」とか
ただ適当な事を言って信じてもらってます。
BOTの返信が早いと思う方もいると思いますが、僕と実際に連絡した人はわかると思いますが、
僕は基本的に返信がとてつもなく早いです。
基本的に30秒以内には返信するようにしています。キモいとか言わない
作ったBOTを導入する前に、1ヶ月程親とのLINEは5秒以内に返信するようにしていたので、怪しまれていないと思います(過信)
感想
正直バレるのをビビりすぎて、レベルの低いBOTになってしまいました。
ただほとんどのメッセージを自動で返信してくれるので、重宝しています。
てかGoogle Apps Scriptは便利なので今後もっと使っていくと思います。
はい。そこの君ーーくだらないとか言わないのーーーーー
こうする事により、「100件も未読あるじゃーん。うざー」というツイートがたったの30秒位で出来る。 #アホ pic.twitter.com/ZLBhJjN5z4
— おーかわ(コンパス) (@okawa_compass) June 2, 2017
参考
参考にさせて頂いたサイトです。いつもお世話になっております。
オーカワ
最新記事 by オーカワ (全て見る)
- 全米が泣いた親不孝 LINE Botの話 - 2017年6月21日
- 【コピペでOK】WordPress Popular Posts をカスタマイズする - 2017年6月17日
- HPのレイアウトを変更しました - 2017年6月13日