wiki:misc/botlog_pas/webapi_input

Version 1 (modified by michkawa, 9 months ago) (diff)

--

botlog,PrintAnyServer用データ登録Web APIの使い方

botlog,PrintAnyserver共にWeb APIによるデータ登録が可能なので、それ用のpythonスクリプトを記述する。
このスクリプトを利用したpythonスクリプトを使用することで、外部PCからもログ登録が可能になる。

但し、大量にデータを送るとそのまま登録してしまうので、取り扱いには注意すること。

また、外部で使用する場合には、python2.7の実行環境が必要なので、事前にインストールしておく必要がある。

botlog

スクリプト自体は、botlog/tools/epicsRecordMonitorbotlogSender.pyにある。
そのままでは、ログ出力がbotlogに依存しているので、多少修正する必要がある。

修正したのが以下のスクリプト。

# -*- coding: utf-8 -*-
#

import sys
import os

import json
import urllib2
import threading
import socket
import datetime
import traceback
import base64

#from epicsRecordMonitorLogging import logger, logInit


class botlogSender(object):
    #
    # mode は自動登録(2)
    # group(section)はOperation(2)
    #
    def __init__(self, URL, group=2, mode=2):
        self.botlogURL = URL + "editLog"
        #logger.debug(self.botlogURL)
        self.entrySection = group
        self.entryMode    = mode



    def __createJSONdata(self, msgData):
        rtn = {}
        rtn['id']      = ""
        rtn['msg']     = base64.urlsafe_b64encode(msgData[0])
        rtn['setTime'] = msgData[1].strftime("%Y/%m/%d %H:%M:%S.%f")
        rtn['entsct']  = self.entrySection
        rtn['imgs']    = []
        rtn['mode']    = self.entryMode

        return rtn

    #
    # msgList =
    #   [
    #      [message, datetime],
    #           :
    #   ]
    #
    def sendMsg(self, msgList):
        for msg in msgList:
            jsonData = self.__createJSONdata(msg)
            #logger.debug(str(jsonData))
            try:
                req = urllib2.Request(self.botlogURL,  headers={'Content-Type':'application/json'})
                jsonmsg = json.dumps(jsonData)
                f = urllib2.urlopen(req, jsonmsg)
                resp = json.loads(f.read())
                f.close()
            except Exception as e:
                #logger.debug(self.botlogURL)
                #logger.debug(traceback.format_exc())
                print traceback.format_exc()


# テスト用main
if __name__ == '__main__':
    #logger = logInit(None)

    msgList = []
    msg = ["改行テスト\n改行テスト2\n改行テスト3", datetime.datetime.now()]
    msgList.append(msg)

    URL="http://localhost/botlog/botlog/"
    bs = botlogSender(URL)
    bs.sendMsg(msgList)

PrintAnyServer

PrintAnyServer用画像登録スクリプトは以下の様になる。
こちらは、一旦画像ファイルを作成してから登録スクリプトを実行する。

# -*- coding: utf-8 -*-
import os
import datetime
import base64
import json
import urllib2
import traceback

class saveImage(object):
    def __init__(self, baseURL='http://localhost'):
        self.URL = baseURL + '/pas/api/addImage'
        
    def save(self, caption, imgFile):
        rtn = False
        req = urllib2.Request(self.URL,  headers={'Content-Type':'application/json'})
        try:
            img = base64.b64encode(open(imgFile, 'rt').read())
            cap = base64.b64encode(caption)
            tm  = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
            jsonData = {'from':[],
                        'pasImg':{'img': img, 'caption': cap, 'type':'png', 'time':tm, 'print':{}}}

            printData = jsonData['pasImg']['print']
            printData['exec'] = 0

            f = urllib2.urlopen(req, json.dumps(jsonData), timeout=5)
            resp = json.loads(f.read())
            rtn = True
        except Exception as e:

            print traceback.format_exc()
        return rtn


# テスト用main
if __name__ == '__main__':
    s = saveImage()
    caption =  'TEST'
    fileName = 'test.png'

    if s.save(caption, fileName) == True:
        print "Copy : %s" % fileName
    else:
        print "Copy Fail: %s" % fileName