はじめに
突然ですが、最近、膝痛くないですか?
階段降りる時や立ち上がる時など、特に痛くないですか??
気づいたら、足がO脚になっていないですか???
もしかしたらそれ、変形性膝関節症かもしれません。
*「変形性膝関節症って何?」という方は、僕が書いたこちらの記事をぜひお読みください。
変形性膝関節症とは:その治療法・進行予防について
自分や家族の膝のレントゲン写真を持っている人がどれほどいるのか甚だ疑問ですが、膝の痛みに悩んでいる人の一助になればと作成しました。
注意)このボットはあくまで参考程度に作成したもので、正確な診断ツールではありません!
最終的な診断については、おかかりいただいた先生にお伺いください。
開発環境の下準備
1) VScodeのインストール
VScodeのインストールついては、googleなどで他の記事を検索してください。
2) node.jsとnpmのインストール
Macでの環境作りは、こちらの別の記事にまとめてあります。
参考にしてください。
Macにnode.js,npmのインストール方法
開発環境の準備
1) kneepainというフォルダを作成
2) VSCodeで上記フォルダを開き、フォルダ内にkneeOA.jsを作成
3) VSCode内でターミナルを開き、フォルダをnpm管理できるように初期化
$ npm init -y
4) フォルダ内にラインボット用のパッケージをnpmでインストール
$ npm i @line/bot-sdk express
システムの概要
AIメーカーによる画像認識AIの作成
こちらの記事を参考に、画像認識AIを作成しました。
画像認識AIを使ったLINE BOTの作り方
kneeOA.jsのコード
'use strict';constlineAccessToken='作成したBOTのチャネルアクセストークン';constlineSecret='作成したBOTのチャネルシークレット';constexpress=require('express');constline=require('@line/bot-sdk');constPORT=process.env.PORT||3000;constconfig={channelSecret:lineSecret,channelAccessToken:lineAccessToken};constuserID='作成したBOTのチャネルユーザーID';// AIメーカーで作成したAIの定数constaimakerClient=require('request');constaimakerModelId=AIメーカーで作成したAIモデルのIDを入力;constaimakerApiKey='AIメーカーで作成したAIモデルのAPIキーを入力';// 返信用定数constnormalrtAdvice='正常の右膝です。';constnormalltAdvice='正常の左膝です。';constkl1rtAdvice='関節軟骨が痛んでいる可能性のある右膝です。';constkl1ltAdvice='関節軟骨が痛んでいる可能性のある左膝です。';constkl2rtAdvice='関節裂隙が軽度狭小化した右膝です。';constkl2ltAdvice='関節裂隙が軽度狭小化した左膝です。';constkl3rtAdvice='関節裂隙が高度狭小化した右膝です。';constkl3ltAdvice='関節裂隙が高度狭小化した左膝です。';constkl4rtAdvice='関節裂隙が無くなってしまった右膝です。';constkl4ltAdvice='関節裂隙が無くなってしまった左膝です。';constOAImportant='変形性膝関節症の進行には、膝関節周囲の筋力の衰えることによる、膝関節の不安定性が影響を与えます。';constOAImportant2='膝関節の安定には四頭筋の筋力upが重要です。適切な運動を心がけましょう。';constapp=express();app.post('/webhook',line.middleware(config),(req,res)=>{Promise.all(req.body.events.map(handleEvent)).then((result)=>res.json(result));});constclient=newline.Client(config);functionhandleEvent(event){if(event.type!=='message'||event.message.type!=='image'){returnPromise.resolve(null);};constgetImageOptions={url:`https://api.line.me/v2/bot/message/${event.message.id}/content`,method:'get',headers:{'Authorization':'Bearer '+lineAccessToken,},encoding:null};letresultMessage='';resultMessage='解析中です。';aimakerClient(getImageOptions,function(error,response,body){if(!error&&response.statusCode==200){console.log('成功');//console.log(body);constbuffer=newBuffer.from(body);constbase64String=buffer.toString('base64');imageRecognition(base64String,event.source.userId);}else{console.log(error);resultMessage=restartMessage;}});returnclient.replyMessage(event.replyToken,[{type:'text',text:resultMessage},{type:'text',text:OAImportant}]);};functionimageRecognition(base64,userId){// Aiメーカー関数letmessage='';aimakerClient.post({// AiメーカーAPI接続uri:"https://aimaker.io/image/classification/api",headers:{"Content-type":"application/x-www-form-urlencoded",},timeout:20000,form:{id:aimakerModelId,apikey:aimakerApiKey,base64:base64}},function(error,response,body){if(error){console.log('imegerecエラー');console.log(error);message=restartMessage;}else{console.log(body);varimageScores=JSON.parse(body);varlabels=imageScores.labels.sort(function(a,b){if(a.score>b.score)return-1;if(a.score<b.score)return1;return0;});console.log(imageScores.labels);if(labels[0].label&&labels[0].score){switch(labels[0].label){case'Normal:Rt':message='この膝は「'+labels[0].label+'」です。'+normalrtAdvice;break;case'Normal:Lt':message='この膝は「'+labels[0].label+'」です。'+normalltAdvice;break;case'KL1:Rt':message='この膝は「'+labels[0].label+'」です。'+kl1rtAdvice;break;case'KL1:Lt':message='この膝は「'+labels[0].label+'」です。'+kl1ltAdvice;break;case'KL2:Rt':message='この膝は「'+labels[0].label+'」です。'+kl2rtAdvice;break;case'KL2:Lt':message='この膝は「'+labels[0].label+'」です。'+kl2ltAdvice;break;case'KL3:Rt':message='この膝は「'+labels[0].label+'」です。'+kl3rtAdvice;break;case'KL3:Lt':message='この膝は「'+labels[0].label+'」です。'+kl3ltAdvice;break;case'KL4:Rt':message='この膝は「'+labels[0].label+'」です。'+kl4rtAdvice;break;case'KL4:Lt':message='この膝は「'+labels[0].label+'」です。'+kl4ltAdvice;break;default:message='もう一度、画像を送ってください。';break;}}console.log('アゲイン');client.pushMessage(userId,[{type:'text',text:message},{type:'text',text:OAImportant2}]).then();};});};app.listen(PORT);console.log(`Server running at ${PORT}`);
Herokuへのデプロイ
node.jsが動作する無料のクラウドサーバーであるHerokuにデプロイします。
下準備
1) Heroku CLIのインストール
https://devcenter.heroku.com/articles/heroku-cli
2) Herokuアカウントの作成
https://signup.heroku.com/
デプロイ
ターミナルで下記コマンドを実行します。
$ heroku login
実行するとブラウザが自動的に起動するので、ログインします。
すると、ターミナル上でもログインが完了します。
その後、package.jsonの"scripts"の中に、"start"を下記のように追記します。
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node kneeOA.js"
},
Heroku内にデプロイ先のディレクトリを作成します。
下記の順でターミナルにコマンドを入力します。
$ git init
$ heroku create
Heroku内にデプロイ先のディレクトリが作成されると、ターミナルに下記のように表示されます。
Creating app... done, ⬢ デプロイ先の名前
https://デプロイ先の名前.com/ | https://git.heroku.com/デプロイ先の名前.git
このデプロイ先ディレクトリに、作成したディレクトリを入れていきます。
下記の順でターミナルにコマンドを入力します。
$ git add .
$ git commit -m 'init'
$ git push heroku master
最終的に下記のように表示されれば完了です。
remote: https://デプロイ先の名前.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/デプロイ先の名前.git
* [new branch] master -> master
これでデプロイ完了です。
ファイルを更新する時
まず、更新するファイルが入ったディレクトリがherokuのデプロイ先のディレクトリと紐づいているかを確認します。
$ git remote -v
紐づいている場合
紐づいている場合は、ターミナルに下記のように表記されます。
heroku https://git.heroku.com/heroku上のデプロイ先の名前 (fetch)
heroku https://git.heroku.com/heroku上のデプロイ先の名前 (push)
紐づいていない場合
紐づいていない場合は、ターミナルに下記のように表記されます。
fatal: not a git repository (or any of the parent directories): .git
その場合は、ターミナルに下記の順に入力し、空のディレクトリを作成し、heroku上のデプロイしたいディレクトリと紐付けを行います。
$ git init //空のディレクトリを作成
$ heroku git:remote -a heroku上のデプロイしたいディレクトリ名
//herokuのデプロイ先と先ほど作成した空のtディレクトリを紐付け
その上で、下記の順にコマンドを入力し、ファイルを更新します。
$ git add .
$ git commit -m 'init'
$ git push heroku master
LINE Developersからbot作成
1) LINE Developersにアクセスし、LINEアカウントでログイン
2) プロバイダー作成
3) 新規チャンネルの作成
4) チャネルアクセストークンとチャネルシークレットの取得
1)〜4)までは下記を参考に進みました。
1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017 #nodefest
5) webhookの設定
Herokuから取得したデプロイ先のURLを入力。
/webhookをつけることを忘れずに。
完成したラインbot
ちなみに動作はこんな感じになります。
動作はこんな感じです。 pic.twitter.com/J1rZ5U0pWo
— 北城雅照@足立慶友整形外科 (@kutuyanomusuko) November 22, 2020
繰り返しになりますが、こちらは診断ツールではありませんので、ご注意ください!!