VoIP Push éç¥ã®èªåçä¿¡ãã¹ãå§ããŸãã
æ ªåŒäŒç€Ÿ IVRy ïŒã¢ã€ããªãŒïŒ 瀟å¡çªå· 7çª ãšã³ãžãã¢ã®ãã«ããŒã§ãã
ä»åã¯åŒç€Ÿã«ãŠå®æœããŠãã VoIP Push éç¥ ã®èªåçä¿¡ãã¹ãæ¹æ³ã«ã€ããŠç޹ä»ããããšæããŸãã
宿œã«è³ã£ãçµç·¯
以åãã宿œããããšãã話ã¯åºãŠããã®ã§ãããä»ã®æ¥åã«è¿œããåªå
床ãäžããããã«ããŸããã
ãããªäžãå
æã®æ¥ææ¥ãåæ¥ã«æž¡ã VoIP Push éç¥ãå±ããªãé害ãçºç[1]ããŠããŸã£ããããäžå»ãæ©ãåãçµãããšåªå
床ããã£ãšåŒãäžããŸããã
VoIP Push éç¥ç¢ºèªã®é£ããç¹
ãšã¯ãããéç¥ãé©åã«å±ããŠãããã©ãããæ©æ¢°çã«ç¢ºèªããããšã¯å®¹æã§ã¯ãããŸãã[2]ã
äžè¬çã«
- èªç€Ÿããã¯ãšã³ããŸãã¯é£æºãµãŒãã¹ãã APNs ãžéç¥éä¿¡ãªã¯ãšã¹ã
- APNs éç¥å®è¡
- 端æ«ããèªç€Ÿããã¯ãšã³ãã« API ãªã¯ãšã¹ã
ãšããæµãã«ãªããšæãã®ã§ãéç¥éä¿¡æã®æ
å ±ãæ§ããŠãããŠãã®éç¥å
端æ«ããã® API ãªã¯ãšã¹ããã°ãç£èŠããããšã§åé¡ãªãéç¥ãå±ããŠãããã ãšããããšã確èªã§ããŸãã
ããããªãããéç¥ãéä¿¡ããã·ã¹ãã ãš Web API ãæäŸããã·ã¹ãã ã¯å€ãã®ã±ãŒã¹ã§åãé¢ãããŠããã®ã§ã¯ãªãããšæããŸãããã®å ŽåããŒã¿ã®æ±ããé£ãããã°ãè€æ°ç®æããæŸã£ãŠããŠçªåããããšã«ãªããŸãã
æ¹é
綺éºã«ããããšãããšé£ããã®ã§ãããä»åã¯æ€ç¥ããã§ããã°æ Œå¥œãªã©ã©ãã§ããããšããã¹ã¿ã³ã¹ã§åæ€èšããŸããã
ã€ãŸããäžæ Œå¥œã§ããããããšã«ãããéç¥ãå±ããªãäžå
·åãçºçããå Žåã«ç€Ÿå
ã§æ°ä»ããä»çµã¿ãäœããã ãšå
ã
æ€èšããŠãããããªä»°ã
ãããåã£æã£ãŠã¢ããªéçºè
ïŒç§ïŒã ãã§ã§ããããšã¯ãªããïŒãšã·ã³ãã«ã«èããŸãã[5]ã
ãã®çµæãã¢ããªãå°ãæ¹é ããŠéç¥ãæ¥ãæã«ãã°ãåãããã«ããŠãããæ¶é»ã¹ã¯ãªãããçµãã§çºä¿¡ãšåä¿¡ããããã®ãã°ãçªåããæ¹åã§ããããšã«ããŸããã
ã¢ããªãæ¹é ããå Žåäžçªæãã®ã誀ã£ãŠã¹ãã¢ã«å
¬éããŠããŸãããšãªã®ã§ãTestFlight çµç±ã®é
ä¿¡ã¯ãã AdHoc é
ä¿¡ããç 誀æäœã§å
¬éãããããšããªãããã«ããããã®æ¹éãæ±ºããŸãã[6]ã
ãã°ãåãå Žæã«ã€ããŠã¯æ·±ãèãã Slack ãç°¡åãã€ã»ãã¥ã¢ã§å©äŸ¿æ§ãé«ããã ã£ãã®ã§æ¡çšããŸããã
å®è£
æçµçã«ãã®ãããªåœ¢ã§ èªåæ¶é» â VoIP Push éç¥åä¿¡ â ãã°ç¢ºèª ã1ã»ãããšããŠæå®æéééã§å®æå®è¡ãããããã«ããŸããã

ã¢ããªåŽ
éç¥ãåä¿¡ããã¿ã€ãã³ã°ã§ Slack ã«æçš¿ããããã«ã«ã¹ã¿ãã€ãºåŸ[7]ã宿©ã«ã€ã³ã¹ããŒã«ããŠéç¥ãåãåãèšå®ãæžãŸããŠãããŸãã
AdHoc é ä¿¡ãåæãšã¯ãããäžãäžãèæ ®ã㊠Incoming Webhooks ã䜿ã£ãŠæçš¿ããŸãã
const postToSlackIfNeeded = async (message: string) => {
if (!SLACK_WEBHOOK_URL) return;
return fetch(SLACK_WEBHOOK_URL, {
method: 'POST',
body: JSON.stringify({
type: 'mrkdwn',
text: makeMarkdown(message),
}),
}).catch((e) => console.error(e));
}
æ¶é» + ãã°ç¢ºèªçšã¹ã¯ãªãã
以äžã®ããšãè¡ãã¹ã¯ãªãããçµãã§ crontab ã§å®æå®è¡ããŸãã
- ãã¹ããéå§ããæšã Slack ã«æçš¿
- ãã®æ timestamp ãä¿æããŠãã
- éç¥çºç«çšã®åŠçãšã㊠Twilio ã䜿ã£ãŠæ¶é»
- éç¥ãåãåã£ãã¢ããªã«äžè¿°ã®å¯Ÿå¿ãå ããããŠããã° Slack ã«éç¥ãå±ããæšã®æçš¿ãè¡ããã
- Slack ãããã¹ãéå§ä»¥éã®æçš¿ãªã¹ããååŸ
- 1ã€ãã€ç¢ºèªããŠã¢ããªããã®æçš¿ãæ¢ã
- 確èªã®çµæãæç€º
- æåã®å Žåã¯ç®èŠã§ãããããã«ç¢ºèªã§ããæçš¿ã« â ãªã¢ã¯ã·ã§ã³ã远å ããŠçµäº
- æå®åæ°ãªãã©ã€ããŠããã§ã倱æã®å Žåã¯ç¢ºèªã§ããªãã£ãæšã®æçš¿ãããåŸã« ðš ãªã¢ã¯ã·ã§ã³ã远å ããŠçµäº
- Reacji Channeler ã䜿çšã㊠ðš ãä»äžãããæçš¿ãé害ãã£ã³ãã«ã«æµã
1ã€ã®ããã±ãŒãžã§è¡ãããããã®ã¹ã¯ãªããçšã® Slack ããŒã¯ã³ã¯ channels:history, chat:write.customize[8], reactions:write 蟺ãã®æš©éãå¿ èŠã§ãã
å®è¡ç°å¢ã«ã€ããŠ
ä»å㯠Amazon Lightsail ãå©çšããŠããŸãã
ãããã€äžèŠã§ããçšåºŠæè»ã«å¯Ÿå¿ã§ããããã« setting.json ãçšæããŠãªãã©ã€åæ°ãæèšçã¡ãã£ãšãã倿Žãã§ããããã«ããŸããã
{
"appName": "AppAutoTest",
"checker": "slack",
"maxRetries": 1,
"retryInterval": 60,
"retryMessage": "â ïž ãã°ã確èªã§ããªãã£ãããã{retryInterval}ç§åŸã«åå®è¡ããŸãïŒ{retryCount}/{maxRetries}ïŒ",
"callTimeout": 20,
"confirmLogRegex": "ãAutoTest for (ios|android)ã([0-9]{3,4}-?){3} ?ããçä¿¡ããããŸããã",
"startMessage": "=== èªåæ¶é»ãéå§ããŸã ===",
"endMessage": "=== èªåæ¶é»ãçµäºããŸã ===",
"alertMessage": "ðš ã¢ããªããã®çé»ãã°ã確èªã§ããŸããã§ãããç¶æ³ã確èªããŠãã ããã",
"slack": {
"loggingChannelId": "XXXX",
"goodReaction": "white_check_mark",
"alertReaction": "alert"
}
}
1. ãã¹ãéå§éç¥
ãã¹ããè¡ãããŠããããšãçºãã€ã€ãã°ãååŸããæã®ã«ãŒãœã«ãšããŠäœ¿çšãããã®ã§éå§éç¥ã Slack ã«æããŸãã
æçš¿ããã ããªã®ã§çç¥ããŸãããchat.postMessage ãå©çšããŠã¬ã¹ãã³ã¹ãã ts ãä¿æããŠãããŸãã
2. éç¥çºç«çšã®åŠçãšã㊠Twilio ã䜿ã£ãŠæ¶é»
åŒç€Ÿã®å Žåã¯ãšã³ããŠãŒã¶ãŒæ§ããã®é»è©±ãåŒç€ŸãµãŒãã¹ IVRy ãåããŠãã·ã¹ãã ã®æ¡å ã«åºã¥ããŠãšã³ããŠãŒã¶ãŒæ§ãããã·ã¥åå²ãè¡ã£ãæ«ã®ã¢ã¯ã·ã§ã³ããã¢ããªãžã®é»è©±è»¢éãã ã£ãå Žåã«ã¢ããªãžãš VoIP Push éç¥ãéä¿¡ãããŸãããã®ãããã³ãŒãããæ¶é»ã§ãããµãŒãã¹ãšã㊠Twilio ãå©çšããŠæ¶é»ããŸãã
Twilio Node.js SDK ãçšããå Žåã®ããã¥ã¡ã³ãã¯ãã¡ã ã«ãããŸããŠããã®ãµã³ãã«ã³ãŒã ã®éãã«èšè¿°ããã ãã§ç°¡åã«æ¶é»ããããšãã§ããŸãã
3. ãã¹ãéå§ä»¥éã®æçš¿ãªã¹ããååŸ
ãã¹ãéå§æã® timestamp ã conversations.history ã® oldest ã«æå®ããããšã§ç¢ºå®ã«ãã¹ãéå§ä»¥éã«æçš¿ããããã°ã ããååŸããããšãã§ããŸãã
oldest string·Optional
Only messages after this Unix timestamp will be included in results.Default 0
Example 1234567890.123456
4. 3ã§ååŸããæçš¿ãªã¹ãããã¢ããªããã®æçš¿ãæ€çŽ¢
ã¢ããªããã®æçš¿ã§äœ¿çšããŠãã Incomning Webhook ãå°çšã® BOT ãšããŠçšæãããŠããå Žå㯠bot_id ãŸã㯠user ã§æ¢ãæ¹æ³ãç°¡åã§ããããã§ãªãå Žåã§ãç°¡åãªæ£èŠè¡šçŸçãçšããŠå€å®ããžãã¯ãçµãã§ããã°åé¡ãããŸããã
5. çµæããªã¢ã¯ã·ã§ã³ã§æç€º
確èªãã§ããæ / ã§ããªãã£ãæ ç¶æ³ã«å¿ããŠæçš¿ã«å¯ŸããŠãªã¢ã¯ã·ã§ã³ã远å ããŸãããªã¢ã¯ã·ã§ã³ã®è¿œå 㯠reactions.add ã§è¡ãããšãã§ããŸãã
åé¡ããããããªéã®ãšã¹ã«ã¬ãŒã·ã§ã³ã«é¢ããŠãBOT ã®åå ãã£ã³ãã«ã 1ãã£ã³ãã«ã ãã«ãããã£ããã Reacji Channeler ã䜿çšããŠé害çšãã£ã³ãã«ã«æµãããã«ããŠããŸãã
å Žåã«ãã£ãŠã¯ chat:write.public æš©éãä»äžããŠåå ããŠããªããããªãã¯ãã£ã³ãã«ã«æçš¿ããããã«ããŠãè¯ããããããŸããã
VoIP Push éç¥ã®èªåçä¿¡ãã¹ãæ¹æ³ã®ç޹ä»ã¯ä»¥äžãšãªããŸãã
ã芧ããã ãããããšãããããŸããã
We are hiring!!
æåŸã«ãIVRy ã§ã¯äžç·ã«åã仲éãçµ¶è³åéäžã§ãã
ä»ã®æ é èª¿ã«æé·ããŠããŠããŸãããä»åŸã®æŽãªãæé·ã®ããã«ã¯å§åçã«ä»²éãäžè¶³ããŠããŸããçããŸã®ãå¿åãåŸ
ã¡ããŠãããŸãïŒ
ã«ãžã¥ã¢ã«ã«è©±ãèããããšããæ¹ã¯ç§ã® Meety ããé¢è«ãç³ã蟌ãã§ããã ããã°è²ã ã話ããŸãã
代衚ã®å¥¥è¥¿ãšã話ããŸãïŒ
-
IVRy ã®ã·ã¹ãã äžã®åé¡ã§ã¯ãªãèšŒææžã®æéåããåå ã ã£ãã®ã§ãããèªåæ€ç¥ã®å¯Ÿå¿ãå å»¶ã°ãã«ããçµæ 瀟å ã§æ€ç¥ã§ããã客æ§ããã®åãåããã§çºèŠãããšããç±ã ããäºæ ã§ãã â©ïž
-
é£ãããããŸã説æã§ããèªä¿¡ããªãã§ãããã£ãŒãããã¯ãããã ãããšå¬ããã§ãã â©ïž
-
Apple 補åã®ã±ãŒã¹ãèšèŒããŠããŸãã Android 端æ«ã§ãåæ§ããšæããŸãã â©ïž
-
APNs ã®ããã¥ã¡ã³ã ãèŠãéãã§ã¯ãšã©ãŒæ¯ã«ãã³ããªã³ã°ã§ãããã§ãããã ããé ä¿¡ã·ã¹ãã ãèªåã§çšæããŠããªãå Žåã¯æ€ç¥ã«éçãããããã§ã â©ïž
-
ç§ã¯ IoT ã«èå³ããã ã®ã§ E2Eãã¹ã ãšããŠå®æ©ã Webã«ã¡ã© ã§ãã£ããã£ããŠç»åèªèããçãæ¥œãããã ãªãšã¯æã£ãã®ã§ãããã¡ãã£ãšå·¥æ°ãèšãã¿ããã§è«ŠããŸãã â©ïž
-
AdHoc é ä¿¡ã§ã Production ç°å¢ãšåãèšŒææžã䜿çšã§ãããããç°å¢å·®ç°ã¯ãããŸãã â©ïž
-
现ããããšã§ãããã¢ããªåãå€ããããã«ãåŸéçºç°å¢ãã¯ãªãŒã³ããçããæ¹ãè¯ããšæããŸãããŸããéç¥ãåä¿¡ã§ãããšããæç¹ã§ãããã¯ãŒã¯ç°å¢ã¯ãããã®ã®ãWebhook URL ãç¡å¹ã«ããçã®çç±ã§ POST ã«å€±æããããšã¯èããããŸããããããå Žåã®æ€ç¥ã«ã€ããŠã¯ä»åŸã®èª²é¡ãšããŠããŸãã â©ïž
-
chat:writeã§ãè¯ãã®ã§ãããéçºç°å¢ã§åããã£ã³ãã«ã«æçš¿ããŠç¢ºèªããå Žåæçš¿è ã®ååã倿Žã§ããæ¹ãè¯ããã customize ã䜿çšããŠããŸãã â©ïž
Discussion