- 投稿日:2021-01-13T17:06:29+09:00
APIを叩いていてTimestamp for this request is too fast.とエラーが出た時の解決策
APIを叩いていたらこんな応答が返ってきました
なぜ・・日本時間なのが悪いのか?と色々推測しました。
{ "status": 1, "messages": [ { "message_code": "ERR-5009", "message_string": "Timestamp for this request is too fast." } ], "responsetime": "2021-01-13T07:43:02.225Z" }結論 PCの時刻設定が違っている
特に設定をいじった覚えはないのですが、確かにずれがありました。
下記画像では、既に時間の修正を行っています。直す前は7.5秒のずれがありました。
https://www.time-j.net/worldtime/country/jp上記サイトと見比べながら人力で修正
ちゃんとデータが返ってくるようになりました
{ "status": 0, "data": [ { "amount": "4133", "available": "4133", "conversionRate": "1", "symbol": "JPY" }, ], "responsetime": "2021-01-13T07:51:49.678Z" }
- 投稿日:2021-01-13T16:44:30+09:00
yarnしたら The engine "node" is incompatible with this module.
環境
$ yarn --version 1.22.10 $ node --version v14.15.1困りごと
久しぶりにプロジェクトを立ち上げようとしましたが、、、yarnができない
$ yarn yarn install v1.22.10 [1/5] ? Validating package.json... error furien-web@1.0.0: The engine "node" is incompatible with this module. Expected version "12.10.0". Got "14.15.1" error Found incompatible module. info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.原因
localPCの環境と現場で使われているnodeのversionがずれている?
(そういえばつい最近ゴニョゴニョやってた時にlocalのversion上げてたかもと気がつく。)解決策
node versionを12.10.0に変更します(現場の方に合わせます)。
nodebrew use 12.10.0nodeのversionが切り替わりました。
$ node --version v12.10.0一時的にversionを無視して進めたい方はこちら。あくまでも一時的な対処法であります。
$ yarn --ignore-engines結果
無事通りました
環境の違いにもっと早く気がつけていれば。。
現場からは以上です。
- 投稿日:2021-01-13T12:07:21+09:00
【Node.js × LINE WORKS API】監査ログをダウンロードする
すんごいドマイナーな内容なのですが、やりたいことのために必要だったので調べました。( ゚Д゚)
ただ、勉強不足なせいか思ったより時間がかかってしまいました。。。
反省と自身の備忘録的にしっかりとアウトプットしておこうと思います(=_=)LINE WORKS API
LINE WORKS で提供されている API です。
トーク Bot を操作したり、カレンダーやメールの内容を取ってきたりできます。
今回使用するのは 監査データのダウンロード API です。実行環境
実行環境は以下の通りです。
- Node.js
- Visual Studio Code
- LINE WORKS API
事前準備
npm install request --save npm install csv --saveAPI を Request するコード
download.js// LINEWORKS 認証情報 const CONSTS = require("./consts.js"); const request = require('request'); const csv = require('csv'); const apiId = CONSTS.API_ID; const feature = 'log'; const service = 'message'; const serviceId = 'audit'; const endDate = getUnixTime(); const startDate = Number(endDate) - 86400; // 24時間前から現在時刻までのログを取得 const tenantId = CONSTS.DOMAIN_ID; const domainId = CONSTS.DOMAIN_ID; const rangeName = 'tenant'; const uri = `https://audit.worksmobile.com/r/${apiId}/audit/v2/${feature}/${service}/logs.csv?apiId=downCsvLog&serviceId=${serviceId}&startDate=${startDate}&endDate=${endDate}&tenantId=${tenantId}&domainId=${domainId}&rangeName=${rangeName}`; const options = { 'method': 'GET', 'url': uri, 'headers': { 'consumerKey': CONSTS.CONSUMER_KEY, 'Authorization': `Bearer ${CONSTS.TOKEN}` } }; request(options, function (error, response) { if (error) throw new Error(error); csv.parse(response.body, { bom: true, columns: true }, (err, data) => { console.log(data) } ) }); function getUnixTime() { const date = new Date(); const now = date.getTime(); return Math.floor(now/1000); };コードについて補足
- 認証情報は CONSTS.js ファイルにまとめてあります。
CONSTS.jsconst DOMAIN_ID = 'xxxxxxxxxxxx'; const API_ID = 'xxxxxxxxxxx'; const CONSUMER_KEY = 'xxxxxxxxxxx'; const TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' exports.DOMAIN_ID = DOMAIN_ID; exports.API_ID = API_ID; exports.CONSUMER_KEY = CONSUMER_KEY; exports.TOKEN = TOKEN;
今回はトークログを取得しているので
const service = 'message';
を指定しています。ログイン状況やメールなどのログも取得できます。詳しくは公式ドキュメントを参照ください。トークログのみ unix timestamp 形式で時間単位の指定が可能なので unix timestamp 形式で指定しています。
UNIX time stamp 形式で指定する場合 24時間以内のデータしか取得できません。
Request URL、ちょー長いですよね!( ゚Д゚)メンドイ
取得した CSV データには BOM が入っているので
csv.parse
するときにオプションを指定しています。{ bom: true, columns: true }
おわりに
ここまでお付き合いいただきありがとうございました。
冒頭にも書きましたが、やりたいことがあって・・・
Bot の入っていないトークルームの発言をトリガーにしたいんですよね。
本当は GAS で実装したかったのですが GAS での csv ダウンロードがどうにもうまくできなくて。
GAS は Node.js での実装が終わったら再チャレンジしようと思います。ではまた!(^^)/
参考にさせていただきましたm(_ _)m
- 投稿日:2021-01-13T03:23:10+09:00
JavaScriptでPythonのenumerate関数を実行するには
はじめに
Node.jsを使ったWebアプリの開発にて、forEachでリストを回していたのですが、
急遽インデックスの情報も必要になりました。そこで次のようなソースコードを書いたものの、「もっといい方法がある」と仲間に指摘されました。
実際に試したところ非常に便利だったことと、Pythonのenumerate関数に近いものを感じたので、
for文でインデックスとバリューを同時に取得する方法として、記事に残します。ary = ["bar", "foo", "hoge"] let i = 0 ary.forEach(function( value ) { console.log(i, value ); i++ }); // 0 bar // 1 foo // 2 hoge実行環境
- Node.js v12.16.3
検証環境
- Paiza.io(Python 3.8.2)
- Paiza.io(Node.js v12.18.3)
そもそもenumerate関数とは
引数に指定したリストの、インデックスとバリューを取得する関数です。
ary = ["bar", "foo", "hoge"] for i, item in enumerate(ary): print(i, item) # 0 bar # 1 foo # 2 hogefor文でインデックスとバリューを同時に取得する
forEachは、第二引数にインデックスを指定できる
forEach関数において 第一引数はリスト、第二引数はインデックスを取ります。
このインデックスは、ループ回数が増加するごとに自動的にインクリメントされるため、
i++
やi += 1
と記述する必要はありません。ary = ["bar", "foo", "hoge"] ary.forEach(function(value, i) { console.log(i, value); }); // 0 bar // 1 foo // 2 hoge
for in
を使う
for in
はリストのインデックスを取得します。
次のようなソースコードにより、インデックスとバリューを取り出します。ary = ["bar", "foo", "hoge"] for (i in ary){ console.log(i, ary[i]) } // 0 bar // 1 foo // 2 hoge一方で、
for in
では次のように予期しない挙動を示す場合もあるので、
利用には注意が必要そうです。var data = [ 'apple', 'orange', 'banana']; //配列オブジェクトにhogeメソッドを追加 Array.prototype.hoge = function(){} for (var key in data){ console.log(data[key]); } // apple // orange // banana // function(){}参考