【Beds24】Beds24のgetBookingjsonにPythonからアクセスする
A4の部屋割表の作成を自動化するために、まずはBeds24 からその日の予約をピックアップしてみる。
import requests import json #必要なところはこの辺にまとめる url = "https://www.beds24.com/api/json/getBookings" username = "" api_key = "" prop_key = "" datefrom = "20191013" dateto = "20191013" paylord = { "authentication": { "apiKey": api_key, "propKey": prop_key }, "includeInvoice":False, "includeInfoItems": False, "arrivalFrom":datefrom, "arrivalTo":dateto } res = requests.post(url,data = json.dumps(paylord), headers = {"content-type": "application/json"}) data = res.json()
変数data
の中にJsonになった予約データがあるのでこれをよしなに加工していくといい感じになるのかもしれない。
supercolliderから音が出なかった。
PythonでFoxDotをインストールして使おうと思ったらバックグラウンドのSuperColliderから音が出なかった。 OS: Ubuntu 18.04 USBアンプ使用
SuperColliderでServerOptions.devices;
としてみたら
ERROR: A primitive was not bound. 0 711 Instance of Method { (0x5576a0a4a6c0, gc=01, fmt=00, flg=11, set=04) instance variables [15] raw1 : Float 0.000000 00000000 0080000C raw2 : Float 0.000000 00000300 03020003 code : instance of Int8Array (0x5576a0a4a9c0, size=4, set=2) selectors : nil constants : nil prototypeFrame : instance of Array (0x5576a0a4a900, size=3, set=2) context : nil argNames : instance of SymbolArray (0x5576a0a4a840, size=3, set=2) varNames : nil sourceCode : nil ownerClass : class Meta_ServerOptions (0x5576a0a40e00) name : Symbol 'prListDevices' primitiveName : Symbol '_ListAudioDevices' filenameSymbol : Symbol '/usr/share/SuperCollider/SCClassLibrary/Common/Control/Server.sc' charPos : Integer 4472 } ERROR: Primitive 'none' failed. Failed. RECEIVER: nil CALL STACK: MethodError:reportError 0x5576a20b4f78 arg this = <instance of PrimitiveFailedError> Nil:handleError 0x5576a2086318 arg this = nil arg error = <instance of PrimitiveFailedError> Thread:handleError 0x5576a20b2f78 arg this = <instance of Thread> arg error = <instance of PrimitiveFailedError> Object:throw 0x5576a1ffe618 arg this = <instance of PrimitiveFailedError> Object:primitiveFailed 0x5576a20b1498 arg this = nil Interpreter:interpretPrintCmdLine 0x5576a2073758 arg this = <instance of Interpreter> var res = nil var func = <instance of Function> var code = "ServerOptions.devices;" var doc = nil var ideClass = <instance of Meta_ScIDE> Process:interpretPrintCmdLine 0x5576a208d1a8 arg this = <instance of Main> ^^ The preceding error dump is for ERROR: Primitive 'none' failed. Failed. RECEIVER: nil
というメッセージが出た。USBのアンプ使ってるからかな?とは思うもののとりあえず色々してみた。
ぐぐってみたらココと同じ症状だった。
多分オーディオコントロールがJackというものを使わないといけないらしい。
ということで具体的にやったこと。
sudo usermod -aG [YOURNAME] audio
する。←これはいるのかわからない
qjackctlを起動する
設定のところを
として
開始ボタンを押した。
この状態でSuperCollider起動してFoxDot起動したらうまく音がなった。
毎週Beds24のAPIから稼働室数をメールするスクリプトを書いた。
前回と前々回の記事から作った。
//メインの関数 function mailOccupancyData(){ getDataFromBeds24() mailToMyself('yourmailaddress') } //Beds24からいろいろ情報を取ってくる。 function getDataFromBeds24() { //初期設定などはここから //username はBeds24で登録しているメアド var username = "your@mailaddress" //passwordはBeds24のAPI KEY var password = "yourAPIKEY" //このスクリプトを配置しているSpreadsheetのID var shid = "yourspreadsheetid" //いつから(datefrom)いつまで(dateto) var datefrom = "2019-10-01" var dateto = "2020-01-31" //roomid(Beds24の部屋ID) var roomid = ["roomid","roomid"] //ここまでは各自書き換えてください。 var url = "https://www.beds24.com/api/csv/getroomdailycsv" var sp = SpreadsheetApp.openById(shid) var sheets = sp.getSheets() if(roomid.length>sp.getNumSheets()){ for (var i=1 ; i <= roomid.length; i++){ sp.insertSheet() } } for (var i=0 ; i < roomid.length ; i++){ var options = { method:"post", followRedirects:false, payload:{ username:username, password:password, propid:"yourpropid", roomid:roomid[i], datefrom:datefrom, dateto:dateto } } var res = UrlFetchApp.fetch(url,options) var csvfile = Utilities.parseCsv(res) Logger.log(i) var firstsh = sheets[i] firstsh.clear() firstsh.getRange(1,1,csvfile.length,csvfile[0].length).setValues(csvfile) Utilities.sleep(5000) } //最後のシートにクエリ関数を作成する var sh = sheets[sheets.length-1].activate() var formula = "=QUERY({" for (i in roomid){ formula += sheets[i].getName() + '!A2:L;' } formula = formula.slice(0,-1) formula += '\},\"select Col1 ,Col2 ,sum(Col5) where Col2 is not null group by Col1 , Col2 label sum(Col5) \'\'\")' //Logger.log(formula) sh.getRange('A1').setFormula(formula) //Logger.log(sh.getRange('B4').getValue()) } //稼働率を計算してメールするスクリプト function mailToMyself(mail){ var sh = SpreadsheetApp.getActive().getSheets() var data = sh[sh.length-1].getDataRange().getValues() var message = "" for (i in data){ Logger.log(i) message += data[i][0] + '年' + data[i][1] + '月の稼働部屋数は' + data[i][2] + 'です\n' } MailApp.sendEmail(mail,'稼働率報告',message) }
これをトリガー登録できるようにしておしまい。
gasでBeds24のAPIにアクセスする②
今度はCSVファイルをSpreadsheetに書き込んでみた。
パスワードがAPI KEYであることに気づかずに結構グダったが、まぁできた。
function myFunction() { var username = "yourusername" var password = "youAPIKEY!!!" var url = "https://www.beds24.com/api/csv/getbookingscsv" var options = { method:"post", followRedirects:false, payload:{ username:username, password:password, datefrom:"2019-12-31", dateto:"2020-01-01" } } var res = UrlFetchApp.fetch(url,options) var csvfile = Utilities.parseCsv(res) var sp = SpreadsheetApp.create("テストです") sh = sp.getSheets()[0] sh.getRange(1,1,csvfile.length,csvfile[0].length).setValues(csvfile) }
gasでBeds24のAPIにアクセスする
備忘録的な話
beds24というPMSを使うことにした。なぜならAPIによるアクセスが出来るから。
手始めにGASでAPIにアクセスしてみた。なぜGASなのかというと・・
ということでその辺をよしなにやってくれるGASで試してみた。
必要なもの
- APIキー
beds24の設定>アカウント>アカウントアクセス>API KEY で確認できる
- 施設キー
beds24の設定>プロパティ>概要>リンク で確認できる
- 部屋ID
beds24の設定>プロパティ>部屋 で確認できる
以下コード今回は単純にLogger.logで出力しているが、JSON.parse()とかを使えばあとは好きな風にできると思う。
APIエンドポイントは今回はRoomDatesを使ったが、ほかのURLでも同じようにJSONをPOSTすれば望んだJSONを得ることができると思う。
それではよいAPIライフを!
function beds24apitest(){ var FACILITY_AT = "youraccesstoken" var PROPERTY_AT = "yourpropkey" var url = "https://api.beds24.com/json/getRoomDates" var payload = { "authentication": { "apiKey":FACILITY_AT, "propKey": PROPERTY_AT }, "roomId": yourroomid, "from": "20191231", "to": "20200101", "incMaxStay": 0, "incMultiplier": 0, "incOverride": 0, "allowInventoryNegative": 0 } var options = { method : "POST", contentType:"application/json", muteHttpExceptions:true, payload : JSON.stringify(payload) } var res = UrlFetchApp.fetch(url,options) Logger.log(res) }