簡単☆node.jsですぐできるTeams投稿
Teamsの「Incomming Webhook」アプリをProxy越しに叩いて、YOLP(地図)APIから取ってきた降雨情報を投稿してみました♪
材料
- Microsoft Windows 10
- Microsoft Teams
- node.js
$npm install request
必須$npm config set proxy "http://<userid>:<password>@<server-address>:<port>"
お好みで。
- Yahoo!API
- YOLP(地図)
- 気象情報API
- 郵便番号検索API
- Yahoo!API ID(各自取得してね。)
- YOLP(地図)
- VSCode
- Proxy Server URL ご自身の環境に合わせてください。
- Microsoft Teams API (Incoming Webhook) で投稿 -- Qiitaありがとうございます。
作り方
- node.jsをインストールする。
- 最新の安定バージョンをインストールしてください。
$npm install request
で、requestモジュールをインストールする。- Teamsの「チーム」にIncomming WebhookをインストールしてエンドポイントURLを取得する。(Microsoft Teams API (Incoming Webhook) で投稿 -- Qiita) #画像を引用しております。
- YOLP(地図)の郵便番号検索APIに郵便番号を入力して、郵便番号地域の緯度経度情報を取得します。
- YOLP(地図)の気象情報APIに緯度経度情報を入力して、その地域の現在の降雨情報と1時間後までの降雨予報を取得します。
- Proxyを越えてrequest.get()する場合、Proxyのアドレスが必要になります。ご自身の環境をお確かめください。
- request.get()する前に、optionsの
proxy: proxy_url,
でProxyサーバーへのアドレスを設定すれば良いみたいです。どこでそれを覚えたかは忘れました。実環境で動作したことを確認したので、それでいいのでしょう。
- 4,5で取得した情報からTeamsへ投稿するメッセージをMarkdown記法で作成します。
- node.jsからエンドポイントURLへメッセージをrequest.post()します。
$node app.js
を実行してください。- Teamsの自分が作成したチームへメッセージが投稿されていることを確認してください。
このSouceの生い立ち
私が仕事をしているフロアは窓がありません。昼休み、外へ出ると雨が降っていて折りたたみ傘を取りに戻ることがありました。昼休み前、帰宅直前にある地域の降雨情報や降雨予報情報があったら便利だと思いませんか?
と、ふとおもったので、なんとなく作ってみました。
レシピコード app.js(157行)
//Rain Notifer for Teamsvarrequest=require('request');//$ npm install request//Japan Postvarzipaddress="https://www.post.japanpost.jp/cgi-zip/zipcode.php?zip=";//Proxy URLconstproxy_url="http://<id>:<password>@<hostname>:<port>";//(TODO)modify//Yahoo! API ID = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxconstappId="&appid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";//(TODO)modify//Teams Webhook URLconstTEAMS_URL="https://outlook.office.com/webhook/.....";//(TODO)modify//https://www.j-lis.go.jp/spd/code-address/todouhuken/cms_16914188.htmlvarzip="060-8588";//北海道//var zip = "163-8001";//東京都//var zip = "540-8570";//大阪府//var zip = "812-8577";//福岡県 //var zip = "900-8570";//沖縄県 varzipcode=CheckPostCode(zip);varurl="https://map.yahooapis.jp/search/zip/V1/zipCodeSearch?query="+zipcode+"&output=json"+appId;//console.log(url);varoptions={url:url,proxy:proxy_url,};request.get(options,function(error,res,body){if(error){//console.log(error);returnnull;}//console.log(body);varjson=JSON.parse(body);varcount=json["ResultInfo"]["Count"];//console.log(count);if(count>0){varFeature=json["Feature"][0];varcoordinates=Feature["Geometry"]["Coordinates"];//console.log(coordinates);if(coordinates!=null){varurl="https://map.yahooapis.jp/weather/V1/place?coordinates="+coordinates+"&output=json"+appId;varoptions={url:url,proxy:proxy_url,};request.get(options,function(error,res,body){if(error){//console.log(error);returnnull;}varinfoObject=newObject();varjson=JSON.parse(body);//console.log(body);varFeature=json["Feature"][0];varWeatherList=Feature["Property"]["WeatherList"]["Weather"];varRainfall=WeatherList[1]["Rainfall"];varresult=coordinates.split(',');infoObject['rainfall']=Rainfall;infoObject['lon']=result[0];infoObject['lat']=result[1];varmessage=getMessage(infoObject);postTeams(message);});}else{returnnull;}}});functionpostTeams(message){varoptions={uri:TEAMS_URL,headers:{"Content-type":"application/json",},json:{"text":message//markdown format is OK.},};request.post(options,function(error,response,body){console.log("statusCode = "+response.toJSON().statusCode);});}functiongetMessage(info){if(info!=null){//メッセージを作成するvarrainfall_msg=makeMessage(info.rainfall);varmessage="# -- Yahoo!気象情報 -- \n\n";message+="郵便番号:"+"["+zipcode+"]("+zipaddress+zipcode+")"+"\n\n";message+="現在の降雨情報:"+rainfall_msg+"";message+="[(雨雲レーダー - Yahoo!天気・災害)](https://weather.yahoo.co.jp/weather/zoomradar/?lat="+info.lat+"&lon="+info.lon+"&z=13)\n\n";//message += "[郵便番号](https://www.post.japanpost.jp/zipcode/index.html)(xxx-xxxx)を送信すると,その地域の現在の降雨情報を表示します.\n\n";returnmessage;}else{return"降雨情報は取得できませんでした。入力した郵便番号が正しいか確認してね。";}}functionmakeMessage(Rainfall){if(Rainfall==0.0){message="今、雨は降っていません。";}elseif(Rainfall<10.0){message="弱い雨が降っています。";}elseif(Rainfall<20.0){message="やや強い雨。ザーザーと降っています。";}elseif(Rainfall<30.0){message="強い雨。土砂降りで、傘をさしていてもぬれる雨が降っています。";}elseif(Rainfall<50.0){message="激しい雨。傘持ってる? バケツをひっくり返したように雨が降っています。";}elseif(Rainfall<80.0){message="非常に激しい雨。滝のように非常に激しい雨が降っています。";}elseif(Rainfall>=80.0){message="猛烈な雨。土砂降りで、傘をさしていてもぬれる雨が降っています。";}returnmessage;}functionCheckPostCode(postCode){varpattern=/^\d{3}-?\d{4}$/g;varresult=postCode.match(pattern);returnresult;}
コツ・ポイント
Proxy越え
varoptions={url:url,proxy:proxy_url,};
request.get()でYahoo!APIにアクセスしたら、Proxyで弾かれました。色々調べた結果、proxyを設定することで解決しました。
bot化?
ボットに郵便番号を送信するとその地域の降雨情報を教えてくれる仕組みを、とあるチャットシステムで作ったことはあるのですが、現場のTeamsではoutgoing Webhookがありませんでした。
最近?Microsoftのサイトでoutgoing Webhookについての記事を見つけました。私の環境ではoutgoing Webhookが無効になっているかもしれません。
Teamsでカスタムボットを作った方がいれば、リンクを教えて下さい。