まえがき
レコードやアプリの操作は、kintone REST APIでほぼほぼ実装できます。
しかし、通知やAPIトークンといった一部設定値については、kintone REST APIでサポートされておりません。
cybozu developer networkのナレッジノート記事で紹介したPuppeteerを使うと、そんなかゆい所に手が届いたりします。
今回は、APIトークンを自動生成する例を紹介します。
デモ
Puppeteerを使って、APIトークンを自動生成します。
Image may be NSFW.
Clik here to view.
生成したAPIトークンが利用可能か、kintone コマンドラインツールを用いて検証しています。
オプションの「-d」にドメイン名、「-a」にアプリID、「-t」にAPIトークンを指定しています。
コード
Puppeteer、readline-syncを利用しています。 npm等を用いてインストールしてください。
・sample.js (実行コード)
(async()=>{constreadline=require('readline-sync');//readline-syncの読み込みconstpuppeteer=require('puppeteer');//puppeteerの読み込み//設定値constdomain='****.cybozu.com';//kintoneのドメインconstbasicUser=false;//Basic認証のユーザー名(設定していない場合はfalse)constbasicPassword=false;//Basic認証のユーザー名(設定していない場合はfalse)constuser='****';//kintoneのログインユーザー名constpassword='****';//kintoneのログインパスワードconstappId=readline.questionInt('App ID: ');//アプリのIDconstaccessRights=[];//追加するAPIトークンに与えるアクセス権accessRights[0]=readline.keyInYN('Record view right: ');accessRights[1]=readline.keyInYN('Record add right: ');accessRights[2]=readline.keyInYN('Record edit right: ');accessRights[3]=readline.keyInYN('Record delete right: ');accessRights[4]=readline.keyInYN('App edit right: ');constbrowser=awaitpuppeteer.launch();//ブラウザ起動constpage=awaitbrowser.newPage();if(basicUser&&basicPassword){//Basic認証(設定している場合)awaitpage.setExtraHTTPHeaders({Authorization:`Basic ${newBuffer.from(`${basicUser}:${basicPassword}`).toString('base64')}`});}awaitpage.goto(`https://${domain}/k/admin/app/apitoken?app=${appId}`);//ログインページへ遷移awaitpage.type('input[name="username"]',user);//kintoneのユーザー名入力awaitpage.type('input[name="password"]',password);//kintoneのログインパスワード入力await(awaitpage.$('.login-button')).click();//「ログイン」ボタンをクリックawaitpage.waitForNavigation({waitUntil:"domcontentloaded"});//APIトークンの設定ページへの遷移を待機awaitpage.waitFor('.gaia-admin-app-apitoken-add');//「生成する」ボタンの描画を待機await(awaitpage.$('.gaia-admin-app-apitoken-add')).click();//「生成する」ボタンをクリックconstapitoken=awaitpage.evaluate((accessRights)=>(newPromise(resolve=>{newMutationObserver(()=>{//APIトークンの生成を待機consttargetRow=document.getElementsByClassName('gaia-admin-app-apitoken-row')[0];accessRights.forEach((accessRight,index)=>{targetRow.childNodes[1].getElementsByTagName('input')[index].checked=accessRight;//APIトークンのアクセス権の変更});resolve(targetRow.childNodes[0].innerText);//APIトークンの取得}).observe(document.getElementsByClassName('gaia-admin-app-apitoken-table-body')[0],{childList:true,subtree:true});})),accessRights);await(awaitpage.$('.button-submit-cybozu')).click();//「保存」ボタンをクリックawaitpage.waitForNavigation({waitUntil:"domcontentloaded"});//アプリの設定ページへの遷移を待機awaitpage.waitFor('.gaia-admin-app-deploy-button');//「アプリを更新」ボタンの描画を待機await(awaitpage.$('.gaia-admin-app-deploy-button')).click();//「アプリを更新」ボタンをクリックawaitpage.waitFor('.gaia-argoui-dialog-buttons-default-tutorial');//「OK」ボタンの描画を待機await(awaitpage.$('.gaia-argoui-dialog-buttons-default-tutorial')).click();//「OK」ボタンをクリックbrowser.close();//ブラウザ停止console.log(apitoken);//コマンドラインにAPIトークンを出力})();
kintoneの仕様変更により、正しく動作しなくなる可能性があります。
予めご了承ください。