LoginSignup
5
0

More than 5 years have passed since last update.

人の話を聞いてメモするのは面倒

Last updated at Posted at 2018-07-30

暑いですね。

暑いので、情報共有のために自分が聞いて掲示板に書いて周知とか、わざわざ掲示板に書いて周知するとかかったるくてやってられんです。
BOTに人の話を聞かせて、それをデータベースに入れれば人が相手しなくても情報を記入できるのでは?
途端に、そんな考えが浮かびました。
でも手間をかけたくない。とりあえず、前段階として適当に相槌を打ってもらおう。
とりあえずプロトタイプだ。

秒でコードを書いてテストしてみました。

image.png

なんだろう・・・なんだか腹が立つ感じだなぁ・・・。

image.png

一周回って笑えてきます。

とりあえずコードです。

callback.php
<?php
//HTTPステータス200を返す。
http_response_code(200) ;
echo '200 {}';

//全体の処理時間計測
$time_start = microtime(true);

//チャンネルアクセストークン
$accessToken = 'Hogehoge';

//チャンネルシークレット
$channelsecret = 'Hugahuga';

//ユーザーからのメッセージ取得
//リクエストボディを変数に入れてjson形式からPHPの型にデコードする
$json_string = file_get_contents('php://input');
$jsonObj = json_decode($json_string);

//リクエストボディをデバッグ用にテキスト出力(JSON配列になっている。ファイルは上書きされていくため、以前のリクエストは残らない。FILE_APPEND パラメータを第三引数に入れると追記になる。)
file_put_contents("meta.txt", file_get_contents('php://input'));

//署名の検証
//チャンネルシークレットをキーにしてリクエストボディからハッシュ作成
$hash = hash_hmac('sha256', $json_string, $channelsecret , true);

//シグネチャ作成、作成したハッシュをMIME base64方式でエンコードする。拡張ヘッダからのシグネチャをデコードしてもよい。その場合はこの処理は必要ない。
$sig = base64_encode($hash);

//拡張ヘッダからAPI側から設定されているシグネチャを取得 (リファレンス参照)
$compSig = getallheaders()['X-Line-Signature'];

//確認してだめだったらエラーログ出力
if ($sig != $compSig) {
    error_log("不正なメッセージ");
    exit;
}

$replyToken = $jsonObj->{"events"}[0]->{"replyToken"};//ReplyToken取得
$type = $jsonObj->{"events"}[0]->{"message"}->{"type"};//メッセージタイプ

//typeを見て処理
//text以外は終了
if($type != "text"){
    exit;
}

//クラスの使い方を練習するためにとか言って意味もなく無駄にクラスにしてみたLine Messege APIにメッセージを投げる部分
//逆に解りにくくなるため、正直関数でいいと思った
class Line_say{
    public $res;
    function line_send($accessT,$repT) {
        $post_data = ["replyToken" => $repT,"messages" => [$this->res]];
    $ch = curl_init("https://api.line.me/v2/bot/message/reply");
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charser=UTF-8', 'Authorization: Bearer ' . $accessT));
    curl_exec($ch);
    curl_close($ch);
}
}

$text = $jsonObj->{"events"}[0]->{"message"}->{"text"};//メッセージテキストを取得

//雑な相槌辞書を配列に突っ込む
$file = file("selectwords.txt");

//読み込む行番号が書いてあるファイルがない場合は作る
if(!file_exists("./num.log")){
    $num = rand(1,count($file));
    file_put_contents("./num.log",$num);
}
//行番号が書いてあるファイルを読む
$oldnum = file_get_contents("./num.log");
//新たに読み込む行番号を雑な辞書から作成した配列の個数からランダム生成
$num = rand(1,count($file));

//読み込んだ行番号と新しい行番号が被る場合は被らなくなるまで乱数生成する。
//適当に書いた割に意外と動いてくれてびっくり
for( ; ; ){
if($oldnum !== $num){
    break;
}
$num = rand(1,count($file));
}

//新しい行番号を描きこむ
file_put_contents("./num.log",$num);
//雑な辞書の配列から文字列を読み込む
$random = $file[$num];

//Line_sayオブジェクトを作成、発言データを作ってLine Messege APIに投げる
$say = new Line_say();
$say->res = ["type" => "text", "text" => $random];
$say->line_send($accessToken,$replyToken);
exit;

?>

動きについて

単純にselectwords.txt(辞書とか言ってるけど、結局は相槌を記入したテキストファイル)を配列にして乱数で呼び出してます。
連続して同じ相槌とかやる気ないんで出てきた乱数を適当に記録して被ったら被らなくなるまで乱数作るようにしてます。

まだデータベースに入れる段階はやってませんが、ここまでできればあとは余裕です。涼しくなったらやります。多分。

今流行りのなんとか学習とかAIとか、DialogflowなんかのAIエンジンも考えましたが、考えすぎて知恵熱出たので暑いこの時期にはダメです。
冷却系弱いんですぐオーバーヒートしてしまいます。もうちょっと涼しくなってからすこしずつ勉強していこ・・・。

暑かったので相槌はここからコピペしました。
言葉の威力「あいづち50選」

まだはっきりわかってないので、もし変なところとかあればマサカリお待ちしてます(ガクブル
以上です。暑いです。

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0