はじめに
※一応注意書き:公開していいか微妙だったので非公開です&ご利用は自己責任で
Youtubeでクソアフィリエイターの動画を何気なく見ていたら「LINE Botがアツい!」的なことを言ってた(ほんとかな?)ので、作ってみようと思いました。まる。
ただ、普通に作ってもおもろくないし、何かネタっぽいの作ろうと思ってえっちな動画を検索できるようにしました。まる。
といっても、LINE Botなんて人生で一回も作ったことなかったのでとりあえずこの辺を参考にしつつ進めました。
1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017 #nodefest
LINE BOTをHeroku + Node.jsでやるまで
Node.jsアプリケーションをHerokuにデプロイ
完成品
こんな感じになります。
メッセージを送るとそれで検索してきてくれます。
つくりかた
事前準備
まず、1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017 #nodefest←この記事の「補足資料その2 - 天気APIを使う応用 (2020/4/4更新)」までやってみて正常に動く状態のものを準備しましょう。
server.js
server.jsをこう変更します。
'use strict';constexpress=require('express');constline=require('@line/bot-sdk');constaxios=require('axios');constPORT=process.env.PORT||3000;constconfig={channelSecret:'自分のチャンネルシークレット',channelAccessToken:'自分のチャンネルアクセストークン'};constapp=express();app.post('/webhook',line.middleware(config),(req,res)=>{console.log(req.body.events);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!=='text'){returnPromise.resolve(null);}letmes='';if(event.message.text!==null){mes='ちょっとまってね';//待ってねってメッセージだけ先に処理getVideoUrl(event.source.userId,event.message.text);//スクレイピング処理が終わったらプッシュメッセージ}else{mes=event.message.text;}returnclient.replyMessage(event.replyToken,{type:'text',text:mes});}constgetVideoUrl=async(userId,text)=>{leturi=encodeURI('https://jp.pornhub.com/video/search?search='+text);letres;try{res=awaitaxios.get(uri);}catch(e){res=e.response}letmes;if(res.status!==200){mes="動画が見つからなかったよ";}else{mes=awaitdata_cleanse(res.data);}awaitclient.pushMessage(userId,{type:'text',text:mes,});};functiondata_cleanse(item){//console.log(item);letvideo_list=item.match(/\/view_video.php\?viewkey\=.+" title/g);//正規表現で(無理やり)取得//11個目以降の動画を取得//console.log(video_list)video_list.splice(0,11);//無理やり検索部分のみ抽出letrandom=video_list[Math.floor(Math.random()*video_list.length)];//取得した動画をランダムにとってくるconstdata_cleanse=random.split("");//空白で分割data_cleanse[0]=data_cleanse[0].slice(0,-1);data_cleanse[0]="https://jp.pornhub.com"+data_cleanse[0];returndata_cleanse[0];}//app.listen(PORT);//console.log(`Server running at ${PORT}`);(process.env.NOW_REGION)?module.exports=app:app.listen(PORT);console.log(`Server running at ${PORT}`);
重要な機能は大体コメントで説明してるのでざっくりした説明にとどめますが、
- Lineでメッセージを受け取ったら
getVideoUrl
が走る - メッセージを検索条件に挿入したページを取得し、スクレイピング
- スクレイピング結果から一件のURLを送信
みたいなことをやってます。
Heroku側の準備
ここからはターミナル・powershell上での作業がメインです。
gitの準備が出来ていなかったらまずはここまで終わらせましょう
※忘れないとは思うけどnode_modulesを.gitignoreに書いておくこと
git init
git add .
git commit -m "first commit"
次にHerokuでアプリ作成しましょう
heroku create
その後、Herokuにgitからpushすればbuildされてデプロイは完了です。
git push heroku master
しかし、まだサーバは起動していません。そこでProcfileを作成し、サーバ起動コマンドを走らせるようにしましょう
web: node server.js
Procfileを作成したら、またgitでaddしてcommitしてherokuにpushして終わりです。これでサーバは完成です。
LINE Developer側
作成したbotのwebhookをherokuのurl + /webhook
に変更するだけ。簡単。
まとめ
LINE Botもスクレイピングも初めてだったのですが割と楽しいですね。
今後もネタBot作りしていきたい。(お仕事が辛くない限り)
追記
先駆者の方を見つけたのですが、
記事内のwebmaster使えばもっと楽だったのではorz