Frog Advent Calendar 2016 – 16æ¥ç®
ã«ããã®è¥¿æµ·å²žã«äœçœ®ãããæµ·ãå±±ãåé£ãããè¡ãã³ã¯ãŒããŒã®Frog Houseãããå±ãããŸãã
æè¡ã®è©±ã§ããããã£ãããªã®ã§ãã³ã¯ãŒããŒã®ç޹ä»ããããŠé ããããšæããŸãã
æŠèŠ
- ã·ã§ã¢ããŠã¹å ã¯Slackã§é£çµ¡ãåã£ãŠãã
- ãã³ã¯ãŒããŒã®é»è»é å»¶ã¯ãŠã§ãããŒãžã§å ¬éãããŠãã
- ããŒãžãã¹ã¯ã¬ã€ãã³ã°ãå å·¥ããŠæ å ±ååŸ
- Slack botã§å®æçã«æ å ±ãååŸãåé¡ãããã°éç¥ãã
ãããªæãããã¥ãŒããªã¢ã«ã§ã¯ãªãã®ã§ãããŸã现ããæé ãã³ãŒãã¯èŒããŠãŸãããåçš®å ¬åŒããã¥ã¡ã³ããå®è£ ã³ãŒããã確èªé¡ããŸãã
ãããã°ããŠã¹
Frog Houseãšããã·ã§ã¢ããŠã¹ããã³ã¯ãŒããŒã«ããããŸããŠãç§ã®ã³ãã€ã¯çŸåšããã«åšäœããŠãããŸããäœäººã¯äžåããã¡ç§ãå«ãäºåããŠã§ãå¶äœæ¹é¢ã®äººéã§ãã
Slack
ãã€ãŠã¯Facebookã¡ãã»ãŒãžã§å®¶ã®äžã®é£çµ¡ãããŠãããã§ããããªããªãç ©éãªã®ãšæ€çŽ¢æ§èœãäœãããšãããSlackãå°å ¥ããŸãããä»ã®ãšããããŸãåã£ãŠããããã§ããSlackã¯ãããã
æè¿äºè»ç®Frog House 2ndãçµ±åããŠãå¥ãã£ã³ãã«åããŒã ã§éçšããŠãããŸãããªããå®¶è³ãšãããããã¢ã¬ã®ç®¡çããŸãšããŠãããã£ããã§ãã£ãŠã
çŸåšããŒã ã«ã¯20ã®ãã£ã³ãã«ãäœæãããŠããŸããŠãå
šäœçš #general
ãšäžè»ç®çš #general-1
ã¿ããã«åããŠéçšããŠãŸãããŸãåèªã§é©åœã«äœã£ããããŠããããã°è¯ãããšã
å
ã«ç³ãäžããéããŠã§ãç³»ã®äººãå€ãã®ã§ã #webdev
ãã£ã³ãã«ãèšããŠæ
å ±å
±æããããããŠãŸãããã®ããã
ãšãŸããããªæãã§ãæ¥åžžç掻ã«Slackãçµã¿èŸŒãã æãã§ããã
ãã³ã¯ãŒããŒã®äº€éäºæ
å²ãšåç±³ã¯è»æåãæ ¹åŒ·ãæãã¯ãããã§ããããã³ã¯ãŒããŒã§ã¯ “SkyTrain” ãšããåŒç§°ã§é»è»ãèµ°ã£ãŠãŸãããã³ã¯ãŒããŒã®ããŠã³ã¿ãŠã³ïŒäžå¿è¡ïŒã軞ã«äžæ¬ã®è·¯ç·ã皌åäžã§ãã
ã¡ãªã¿ã«é»è»ãç¡äººé転ã§ã
æ±äº¬ã®ãããããç·ã¿ãããªæãããããŒãã«ãã人ã
ããšæ¹æãç¡äººãåã¯æ§å説ããšãè«žäºæ ã«ããæããªãéæŸãããŠãããã§ãããæè¿ã¯Suicaã¿ãã㪠“Compass” ãšããã«ãŒããå°å ¥ãããŸããŠãéããã³ã«ãããããšãããŸãããªãŒããã£ãŒãžã¯ãªããŠãé§ ã«èšçœ®ã®æ©æ¢°ã§ãã£ãŒãžããŠãããŸãã
ãã±ããå¶åºŠ
æ¥æ¬ã®é»è»ãšæ¯ã¹ãŠé¢çœãã®ãéè³èšç®ã§ãã
å šäœãããŠã³ã¿ãŠã³ãäžå¿ã«ãã£ããäžéãã®åºåã«åããããŠãããªããšãã®åºåããšã«ãã£ããåäžéè³ã§ããé åå ãªãäžé§ ä¹ã£ãŠã端ãã端ãŸã§ç§»åããŠãåé¡ïŒãåºåããŸãããšå ç®ãããŸãã
ãŸããã±ããã¯äžåºŠè³Œå ¥ãããš90åéæå¹ã§ããã®éä¹ãæŸé¡ã§ããè²·ãç©ãžåºãããã«ãäžæåã®è³Œå ¥ã§è¡ã£ãŠåž°ã£ãŠããããšãå¯èœã§ãã
æé
ããã ãäžå $3 ãé£ã®åºéãŸã§è¡ããš +$2 ã§ããäžãæå®æåžã¯ $91 ãšãªããªãã®ã倿®µã
ããããšç©ºæž¯ããä¹ããšç¹å¥ã« +$5 ããããŸããã²ã©ãã
é»è»ä»¥å€
ãã¹ã瞊暪ç¡å°œã«èµ°ã£ãŠãŸããè»ããªããŠããããªã«ã¯äžäŸ¿ã¯ãªãã§ãããè·ç©éã³ã¯å¥ã§ããã
ããšã¯ããŠã³ã¿ãŠã³ã®åã«å€§ããªæ²³å£ããã£ãŠããããåäžããã®ã«ã¯è¹ “SeaBus” ãå©çšããŸããè¹ãšãã£ãŠãå¹³ãã圢ã®ãã€ã§äžã¯åºãããããªã«æºããŸãããäœåºŠãä¹ã£ããã©ããŸã ä¹ããã³ã«ã¡ãã£ãšããããããŸãã
å ±æãã±ãã
ãããã®å ¬å ±äº€éæ©é¢ã¯äžæ¬ããŠTransLinkãšããäŒç€Ÿãéå¶ããŠãããå ã®ãã±ããã¯å ±æã§ããã€ãŸã90åã®éã«é»è»ãšãã¹ãšè¹ãä¹ãç¶ãã§ç§»åããŠè¡ã£ãŠåž°ã£ãŠããããªããŠããšãå¯èœãªããã§ãã
é å»¶æ å ±
ããŠããããæ¬é¡ã§ããããããªå ¬å ±äº€éæ©é¢ã®é å»¶æ å ±ã¯éå¶äŒç€Ÿã®ãŠã§ãããŒãžã§å ¬éãããŠããŸãã
ãŸãé»è»ãé å»¶ããããšã¯ãããªã«ãªãã®ã§ãããããŸã«ã¯é å»¶ããããšããããŸãã
HTMLæ å ±ã®è§£æãšååŸ
ç¹æ®µAPIããªããããªã®ã§ïŒãã¹ã®éè¡æ å ±ã¯ååŸã§ããã¿ãããªãã ãã©ïŒããã®HTMLãååŸãè§£æããŠæ å ±ãååŸããããã«ããŸãã
å®è£ ã³ãŒãã¯ãã¡ãã
ãããããã¹ã¯ã¬ã€ãã³ã°ããšãããã€ã§ãããè¡åããæ å ±åéãããããæ éã«ãªãå¿ èŠãããããšæããŸããæ éã«ãªã£ãŠãé§ç®ãªå Žåããããã©ãã
HTMLãã¡ã€ã«ãååŸ
request
ãšããã©ã€ãã©ãªãå©çšããŠãã¡ã€ã«ãååŸããŸãã jar
ãšããä»çµã¿ã§cookieãå²ãšç°¡åã«æäœã§ããŸãã
ä»¶ã®ããŒãžã¯cookieå¶åŸ¡ãããªããšç¡éã«ãªãã€ã¬ã¯ãããç¶ããããã«ãªã£ãŠããŠããã® jar
ã®ä»çµã¿ã¯ç°¡åã§å©ãããŸããã
ãŸããªããªããªãã§ãè¯ãããã
HTMLãã¡ã€ã«ãè§£æãæ å ±æœåº
HTMLãã¡ã€ã«ãååŸã§ããã®ã§ã次ã¯ãã®ããã¹ãã®äžãããç®åœãŠã®æ å ±ãæ¢ããŠãããŸãã
æ£èŠè¡šçŸãªããã§é 匵ã代ããã«ãcheerioã䜿ã£ãŠjQuery颚ã«ã»ã¬ã¯ã¿ã§èŠçŽ æ€çŽ¢ããããšã«ããŸããã
å©çšäŸãREADMEããåŒçšããŸãã
let cheerio = require('cheerio') let $ = cheerio.load('<h2 class="title">Hello world</h2>') $('h2.title').text('Hello there!') $('h2').addClass('welcome') $.html() //=> <h2 class="title welcome">Hello there!</h2>
ããŒããã§ãããã ãããèŠæ £ããjQueryã®ã³ãŒãã§ãããç°¡åããã
ããŠãç®åœãŠã®æ
å ±èªäœã¯ãã©ãŠã¶ã®dev toolsã§ç¢ºèªããŠã #tab0 .alertInfo
ã®äžã«ããããšãããããŸããã
现ããåå²ã¯ãå ·äœçã«ã¯ã³ãŒããèŠãŠé ãããã®ã§ããããããªãã«ã»ã¬ã¯ã¿ãDOMã®ç¥èãå¿ èŠã«ãªãå ŽåããããŸããããšããšããããæ å ±æäŸçšã«èšèšãããHTMLã§ã¯ãªãã®ã§ä»æ¹ã®ãªãããšã§ããé 匵ããŸãããã
ãšããããã§ã»ã¬ã¯ã¿ãšãäœãšããé§äœ¿ããŠãç¡äºæ å ±ãååŸããããšãã§ããŸããã
Slack bot
æ å ±ã¯åŸãããã®ã§ããããããããããŠSlackãžæçš¿ããããã«ããŸããHubotïŒã²ã ãŒãŒã£ãšïŒãšãããã¬ãŒã ã¯ãŒã¯ã䜿ã£ãŠããã£ãšäœããŸãã
ãã®Hubotã¯GitHub瀟ãäœã£ãŠãããã§ããæ¬äœèªäœã¯botæ©èœã®ã¿ã§ãå¥éãã¢ããã¿ããä»ããŠåçš®ãµãŒãã¹ãžæ¥ç¶ããŸããTwitterãChatWorkçšã®ãµãŒãããŒãã£ãŒã¢ããã¿ãããããã§ãã
宿çã«TransLinké å»¶æ å ±ãåŸã
å ã»ã©ã®ã©ã€ãã©ãªãšãcronãšããã©ã€ãã©ãªãå©çšããŸãã
ã§ããããªæãã§ãã
var translinkAlerts = require('translink-alerts'); var CronJob = require('cron').CronJob; module.exports = function(robot) { new CronJob({ cronTime: '0 */6 * * * *', start: true, timeZone: 'America/Vancouver', onTick: function () { translinkAlerts.get(function(data) { var train = data.train; // åé¡ããã°çºèš if (!train.fine) { var channelId = 'CXXXXXXXX' var message = 'é»è»ãé§ç®ã¿ããã ã'; robot.messageRoom(channelId, message); } }); }, }); };
cronTime
ã¯å·Šããåãæãæ¥ãæãææ¥ã幎ãæå®ããŠããã®ã¿ã€ãã³ã°ã§ onTick
ãå®è¡ããŠãããŸããä»åã¯æ¯äžæéäž6åãã€ãŸã10åããšã«å®è¡ããŠããŸããtimeZone
ã¯ãã®ãŸãŸã§ãããæ¥æ¬æéãªã "Asia/Tokyo"
ã§ããã
ã§ãå®è¡ããå 容ãªãã§ãããåé¡ããã£ããçºèšããªããã°æ²é»ã§ããåäœç¢ºèªæã¯äž¡æ¹ã§çºèšããããã«ããæ¹ãè¯ãããã
ãŸãäŸãèŠããšã ããã誰ãã®çºèšã«åå¿ãã圢ã§ãããä»åã¯æéã§èªçºçã«çºèšããå¿
èŠããããŸãããã®å Žå㯠robot.messageRoom()
ãå©çšããŸããSlackã®å Žå㯠channelId
ã®ååŸãã¡ãã£ãšé¢åã§ãã
translinkAlertsã§åŸãããæ å ±
translinkAlerts.get()
ã§åŸããã data
ã¯ãããªæãã§ãã
console.log(data.train.fine); // => true/false console.log(data.train.title); console.log(data.train.outline); console.log(data.train.description);
ãã£ã³ãã«IDãååŸ
APIæ¥ç¶ããŒã¯ã³ãäœæããŠãããã£ã³ãã«IDãååŸãããšããæµãã«ãªããŸãã
ãŸãããŒã¯ã³ã¯ãã¡ããã “Create token” ã§äœæããŸããããŒã ã«ã²ãšã€ã§ãã
ããŒã¯ã³äœæåŸã¯ãã£ã³ãã«æ å ±ååŸAPIã§æ å ±ãååŸããŸãããã¡ããããŠã§ãäžã§ïŒãïŒå©çšã§ããŸãã
ãã¶ãé·ãã®ã§é 匵ã£ãŠç®åœãŠã®ãã£ã³ãã«ãæ¢ããŠãã ããããã£ã³ãã«åïŒ random
ãšãã #
ãªããïŒã§ããŒãžå
æ€çŽ¢ãããšè¯ãããšã
IDãèŠã€ãããŸããïŒ
ããŒã¯ã³ã¯ïŒããã«éããäžè¬çã«ïŒç§å¯ã«ããŠããå¿ èŠããããŸãããããªããšç¥ããªã人ããã®ããŒã¯ã³ã䜿ã£ãŠAPIã«ã¢ã¯ã»ã¹ããŠãããªããšããããªããšãããŠãããŸããæ°ãä»ããŸããããã³ãŒãã«çŽæ¥æžã代ããã«ãç°å¢å€æ°ãªãããå©çšããŸããåŸã»ã©ãããªè©±ãåºãŠããŸãã
Herokuã«botãèŒãã
Herokuã¯ãŠã§ãã¢ããªã±ãŒã·ã§ã³ãµãŒãã§ããã§ããïŒãèªäœã¢ããªãèšçœ®ããŠå®è¡ããããšãã§ããŸãã
èªåã®ãµãŒãããããªããã£ã¡ã§ãè¯ããã©ãã
ç°å¢å€æ°
Settings > Config Variablesããç°å¢å€æ°ãäºã€èšå®ããå¿ èŠããããŸãã
HUBOT_HEROKU_KEEPALIVE_URL
– ç»é¢å³äž “Open app” ã®ãªã³ã¯å URLHUBOT_SLACK_TOKEN
– ããããäœæããããŒã¯ã³
ããŒã¯ã³ã¯ã¡ãã£ãšåŸ ã£ãŠããå ã»ã©äœæããããŒã¯ã³ãšã¯å¥ç©ã§ããããããäœããŸãã
ã³ãŒã管ç
ã¢ããªæ¬äœã¯Deployããèšå®ããŸããéžæè¢ã¯ããã€ãããããGitHub飿ºããã®Automatic deploysãããããã§ãã
æåã«äžåºŠManual deployããªãã¡ãã ãããã
䟿å©ã¢ããªã³
Overviewã®add-onsã®ãšããã§ç®¡çããŸãã以äžã®äºã€ãå®çªã
- Papertrail – ãšã©ãŒãäœãããèšé²ããŠããããããªããåããªãããšãã«å©ããã
- Process Scheduler – æå®ã®æéã ãèµ·åãããŠããããHerokuã®ç¡æãã©ã³ã ãšã ããã
å€ãåžžèããªããã¶ããŸã 倧äžå€«ã
Slackã«botãå°å ¥ãã
ãããã倧詰ãã§ãã
ã¢ããªãã€ã³ã¹ããŒã«
ãŸãã¯ããŒã ã®ã¡ãã¥ãŒãã “Apps & integrations” ãéããŸãããããªURLã®ããŒãžã
https://xxxxxxxxxxx.slack.com/apps
“hubot” ã§æ€çŽ¢ã㊠“Add Configuration” ããæ°èŠäœæã§ãã
äœã£ããã¢ã€ã³ã³ããååãããèšå®ããŠãã ããã
ããŒã¯ã³ãHerokuãž
åå¥ã¢ããªã®ããŒãžã« “API Token” ãšããé ç®ããããªã®ã§ããã®å 容ãã³ããŒããŸãã
ããã§ãã£ãŠHerokuãžæ»ã£ãŠã HUBOT_SLACK_TOKEN
ã®å€ãšããŠèšå®ããŸãã
Slackã§botãæåŸ
æåŸã«ãSlackã®æ¹ã§botãåãããããã£ã³ãã«ã«ãã®botãinviteããŸããbotã¯ããSlackããŒã ã«ããã¯ãã§ãããæåã¯ã©ãã®ãã£ã³ãã«ã«ãå ¥ã£ãŠãŸããã
ããããã§çµããïŒ
ãã£ãšäŸ¿å©ã«
Frog Houseã®botã¯ãã£ãšè²ã ãªæ©èœããããŸããæ¯æå€©æ°äºå ±ãçºæ¿ïŒæ¥æ¬åvsã«ãããã«ïŒããç¥ããããããé å»¶æ å ±ã詳ããæ å ±ãæçš¿ããããå埩ããå Žåã«ããç¥ãããããããŠãŸãã
ããã«ã¯ããã¡ãã£ãšã ãã£ã ãã£ããå¿ èŠããããŸããå®è£ ã³ãŒãããåèã«ã©ãããseena-tanã¯ãã³ã¯ãŒããŒçšã ãã©ãä»ã®å°åã¯å¿çšããŠãã ããã
ã¡ãªã¿ã« seena-tan ã§ãã¹ã§ããããã§ããã»ãããã§ã¯ãããŸãããã¢ã€ã³ã³ã¯åŸæãªäœæ°ãæããŠãããŸããã
ãããŸãã