diff --git a/plugins/redis/index.py b/plugins/redis/index.py index 62a8686c2..334ab4d19 100755 --- a/plugins/redis/index.py +++ b/plugins/redis/index.py @@ -214,7 +214,8 @@ def initdStatus(): if mw.isAppleSystem(): return "Apple Computer does not support" - shell_cmd = 'systemctl status redis | grep loaded | grep "enabled;"' + shell_cmd = 'systemctl status ' + \ + getPluginName() + ' | grep loaded | grep "enabled;"' data = mw.execShell(shell_cmd) if data[0] == '': return 'fail' @@ -225,7 +226,7 @@ def initdInstall(): if mw.isAppleSystem(): return "Apple Computer does not support" - mw.execShell('systemctl enable redis') + mw.execShell('systemctl enable ' + getPluginName()) return 'ok' @@ -233,7 +234,7 @@ def initdUinstall(): if mw.isAppleSystem(): return "Apple Computer does not support" - mw.execShell('systemctl disable redis') + mw.execShell('systemctl disable ' + getPluginName()) return 'ok' diff --git a/plugins/redis/js/redis.js b/plugins/redis/js/redis.js index 047328f15..01da0647c 100755 --- a/plugins/redis/js/redis.js +++ b/plugins/redis/js/redis.js @@ -1,14 +1,3 @@ - -function str2Obj(str){ - var data = {}; - kv = str.split('&'); - for(i in kv){ - v = kv[i].split('='); - data[v[0]] = v[1]; - } - return data; -} - function redisPost(method, version, args,callback){ var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); @@ -18,7 +7,7 @@ function redisPost(method, version, args,callback){ req_data['version'] = version; if (typeof(args) == 'string'){ - req_data['args'] = JSON.stringify(str2Obj(args)); + req_data['args'] = JSON.stringify(toArrayObject(args)); } else { req_data['args'] = JSON.stringify(args); } @@ -46,7 +35,7 @@ function redisPostCallbak(method, version, args,callback){ args['version'] = version; if (typeof(args) == 'string'){ - req_data['args'] = JSON.stringify(str2Obj(args)); + req_data['args'] = JSON.stringify(toArrayObject(args)); } else { req_data['args'] = JSON.stringify(args); } diff --git a/plugins/tgbot/ico.png b/plugins/tgbot/ico.png new file mode 100644 index 000000000..9416145b2 Binary files /dev/null and b/plugins/tgbot/ico.png differ diff --git a/plugins/tgbot/index.html b/plugins/tgbot/index.html new file mode 100755 index 000000000..fa1873be6 --- /dev/null +++ b/plugins/tgbot/index.html @@ -0,0 +1,24 @@ +
+
+
+
+

服务

+

自启动

+

Bot配置

+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/plugins/tgbot/index.py b/plugins/tgbot/index.py new file mode 100755 index 000000000..3b76feef2 --- /dev/null +++ b/plugins/tgbot/index.py @@ -0,0 +1,239 @@ +# coding:utf-8 + +import sys +import io +import os +import time +import re +import json +import base64 + +sys.path.append(os.getcwd() + "/class/core") +import mw + +app_debug = False +if mw.isAppleSystem(): + app_debug = True + + +def getPluginName(): + return 'tgbot' + + +def getPluginDir(): + return mw.getPluginDir() + '/' + getPluginName() + + +def getServerDir(): + return mw.getServerDir() + '/' + getPluginName() + + +def getInitDFile(): + if app_debug: + return '/tmp/' + getPluginName() + return '/etc/init.d/' + getPluginName() + + +def getConfigData(): + cfg_path = getServerDir() + "/data.cfg" + if not os.path.exists(cfg_path): + mw.writeFile(cfg_path, '{}') + t = mw.readFile(cfg_path) + return json.loads(t) + + +def writeConf(data): + cfg_path = getServerDir() + "/data.cfg" + mw.writeFile(cfg_path, json.dumps(data)) + return True + + +def getInitDTpl(): + path = getPluginDir() + "/init.d/" + getPluginName() + ".tpl" + return path + + +def getArgs(): + args = sys.argv[2:] + tmp = {} + args_len = len(args) + if args_len == 1: + t = args[0].strip('{').strip('}') + if t.strip() == '': + tmp = [] + else: + t = t.split(':') + tmp[t[0]] = t[1] + tmp[t[0]] = t[1] + elif args_len > 1: + for i in range(len(args)): + t = args[i].split(':') + tmp[t[0]] = t[1] + return tmp + + +def checkArgs(data, ck=[]): + for i in range(len(ck)): + if not ck[i] in data: + return (False, mw.returnJson(False, '参数:(' + ck[i] + ')没有!')) + return (True, mw.returnJson(True, 'ok')) + + +def status(): + data = mw.execShell( + "ps -ef|grep tgbot |grep -v grep | grep -v mdserver-web | awk '{print $2}'") + if data[0] == '': + return 'stop' + return 'start' + + +def initDreplace(): + + file_tpl = getInitDTpl() + service_path = mw.getServerDir() + + initD_path = getServerDir() + '/init.d' + if not os.path.exists(initD_path): + os.mkdir(initD_path) + file_bin = initD_path + '/' + getPluginName() + + # initd replace + # if not os.path.exists(file_bin): + content = mw.readFile(file_tpl) + content = content.replace('{$SERVER_PATH}', service_path + '/mdserver-web') + content = content.replace( + '{$APP_PATH}', service_path + '/' + getPluginName()) + + mw.writeFile(file_bin, content) + mw.execShell('chmod +x ' + file_bin) + + # systemd + systemDir = mw.systemdCfgDir() + systemService = systemDir + '/tgbot.service' + systemServiceTpl = getPluginDir() + '/init.d/tgbot.service.tpl' + if os.path.exists(systemDir) and not os.path.exists(systemService): + service_path = mw.getServerDir() + se_content = mw.readFile(systemServiceTpl) + se_content = se_content.replace('{$SERVER_PATH}', service_path) + mw.writeFile(systemService, se_content) + mw.execShell('systemctl daemon-reload') + + return file_bin + + +def tbOp(method): + file = initDreplace() + + if not mw.isAppleSystem(): + data = mw.execShell('systemctl ' + method + ' ' + getPluginName()) + if data[1] == '': + return 'ok' + return data[1] + + data = mw.execShell(file + ' ' + method) + print(data) + # if data[1] == '': + # return 'ok' + return 'ok' + + +def start(): + return tbOp('start') + + +def stop(): + return tbOp('stop') + + +def restart(): + status = tbOp('restart') + return status + + +def reload(): + + tgbot_tpl = getPluginDir() + '/startup/tgbot.py' + tgbot_dst = getServerDir() + '/tgbot.py' + + content = mw.readFile(tgbot_tpl) + mw.writeFile(tgbot_dst, content) + + return tbOp('reload') + + +def initdStatus(): + if mw.isAppleSystem(): + return "Apple Computer does not support" + + shell_cmd = 'systemctl status ' + \ + getPluginName() + ' | grep loaded | grep "enabled;"' + data = mw.execShell(shell_cmd) + if data[0] == '': + return 'fail' + return 'ok' + + +def initdInstall(): + if mw.isAppleSystem(): + return "Apple Computer does not support" + + mw.execShell('systemctl enable ' + getPluginName()) + return 'ok' + + +def initdUinstall(): + if mw.isAppleSystem(): + return "Apple Computer does not support" + + mw.execShell('systemctl disable ' + getPluginName()) + return 'ok' + + +def getBotConf(): + data = getConfigData() + if 'bot' in data: + + return mw.returnJson(True, 'ok', data['bot']) + return mw.returnJson(False, 'ok', {}) + + +def setBotConf(): + args = getArgs() + data_args = checkArgs(args, ['app_token']) + if not data_args[0]: + return data_args[1] + + data = getConfigData() + args['app_token'] = base64.b64decode(args['app_token']).decode('ascii') + data['bot'] = args + writeConf(data) + + return mw.returnJson(True, '保存成功!', []) + + +if __name__ == "__main__": + func = sys.argv[1] + if func == 'status': + print(status()) + elif func == 'start': + print(start()) + elif func == 'stop': + print(stop()) + elif func == 'restart': + print(restart()) + elif func == 'reload': + print(reload()) + elif func == 'initd_status': + print(initdStatus()) + elif func == 'initd_install': + print(initdInstall()) + elif func == 'initd_uninstall': + print(initdUinstall()) + elif func == 'get_bot_conf': + print(getBotConf()) + elif func == 'set_bot_conf': + print(setBotConf()) + elif func == 'conf': + print(getConf()) + else: + print('error') diff --git a/plugins/tgbot/info.json b/plugins/tgbot/info.json new file mode 100755 index 000000000..266bbfb6b --- /dev/null +++ b/plugins/tgbot/info.json @@ -0,0 +1,17 @@ +{ + "sort": 7, + "ps": "[DEV]简单Telegram机器人", + "name": "tgbot", + "title": "tgbot", + "shell": "install.sh", + "versions":["0.1"], + "tip": "soft", + "checks": "server/tgbot", + "path": "server/tgbot", + "display": 1, + "author": "Zend", + "date": "2023-03-06", + "home": "https://core.telegram.org/bots/api", + "type": 0, + "pid": "5" +} \ No newline at end of file diff --git a/plugins/tgbot/init.d/tgbot.service.tpl b/plugins/tgbot/init.d/tgbot.service.tpl new file mode 100644 index 000000000..77a48f06c --- /dev/null +++ b/plugins/tgbot/init.d/tgbot.service.tpl @@ -0,0 +1,15 @@ +[Unit] +Description=Redis In-Memory Data Store +After=network.target + +[Service] +Type=forking +ExecStart={$APP_PATH}/init.d/tgbot start +ExecStop={$APP_PATH}/init.d/tgbot stop +ExecReload={$APP_PATH}/init.d/tgbot reload +ExecRestart={$APP_PATH}/init.d/tgbot restart +KillMode=process +Restart=on-failure + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/plugins/tgbot/init.d/tgbot.tpl b/plugins/tgbot/init.d/tgbot.tpl new file mode 100644 index 000000000..a7c2aaea5 --- /dev/null +++ b/plugins/tgbot/init.d/tgbot.tpl @@ -0,0 +1,85 @@ +#!/bin/sh +# chkconfig: 2345 55 25 +# description: Tgbot Service + +### BEGIN INIT INFO +# Provides: Tgbot +# Required-Start: $all +# Required-Stop: $all +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: starts Tgbot +# Description: starts the MDW-Web +### END INIT INFO + +# Simple Tgbot init.d script conceived to work on Linux systems +# as it does use of the /proc filesystem. + +PATH=/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export LANG=en_US.UTF-8 + + +mw_path={$SERVER_PATH} +PATH=$PATH:$mw_path/bin + +if [ -f $mw_path/bin/activate ];then + source $mw_path/bin/activate +fi + +tg_start(){ + + isStart=`ps -ef|grep 'tgbot.py' |grep -v grep | awk '{print $2}'` + if [ "$isStart" == '' ];then + echo -e "starting tgbot... \c" + cd $mw_path + python3 {$APP_PATH}/tgbot.py >> {$APP_PATH}/task.log & + isStart="" + while [[ "$isStart" == "" ]]; + do + echo -e ".\c" + sleep 0.5 + isStart=`ps -ef|grep 'tgbot.py' |grep -v grep | awk '{print $2}'` + let n+=1 + if [ $n -gt 20 ];then + break; + fi + done + if [ "$isStart" == '' ];then + echo -e "\033[31mfailed\033[0m" + echo -e "\033[31mError: tgbot service startup failed.\033[0m" + return; + fi + echo -e "\033[32mdone\033[0m" + else + echo "starting tgbot...(pid $(echo $isStart)) already running" + fi +} + + +tg_stop(){ + echo -e "stopping tgbot ... \c"; + arr=`ps aux|grep 'tgbot.py'|grep -v grep|awk '{print $2}'` + for p in ${arr[@]} + do + kill -9 $p > /dev/null 2>&1 + done + echo -e "\033[32mdone\033[0m" +} + +case "$1" in + start) + tg_start + ;; + stop) + tg_stop + ;; + restart|reload) + tg_stop + sleep 0.3 + tg_start + ;; + *) + echo "Please use start or stop as first argument" + ;; +esac + diff --git a/plugins/tgbot/install.sh b/plugins/tgbot/install.sh new file mode 100755 index 000000000..cec3fab83 --- /dev/null +++ b/plugins/tgbot/install.sh @@ -0,0 +1,59 @@ +#!/bin/bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +curPath=`pwd` +rootPath=$(dirname "$curPath") +rootPath=$(dirname "$rootPath") +serverPath=$(dirname "$rootPath") + + +install_tmp=${rootPath}/tmp/mw_install.pl + +VERSION=$2 + +# pip3 install ccxt +if [ -f ${rootPath}/bin/activate ];then + source ${rootPath}/bin/activate +fi + +pip3 install pyTelegramBotAPI +pip3 install telebot + +Install_App() +{ + echo '正在安装脚本文件...' > $install_tmp + mkdir -p $serverPath/source + mkdir -p $serverPath/tgbot + echo "${VERSION}" > $serverPath/tgbot/version.pl + + cp -rf ${rootPath}/plugins/tgbot/startup/* $serverPath/tgbot + + cd ${rootPath} && python3 ${rootPath}/plugins/tgbot/index.py start + cd ${rootPath} && python3 ${rootPath}/plugins/tgbot/index.py initd_install + echo '安装完成' > $install_tmp +} + +Uninstall_App() +{ + if [ -f /usr/lib/systemd/system/tgbot.service ];then + systemctl stop tgbot + systemctl disable tgbot + rm -rf /usr/lib/systemd/system/tgbot.service + systemctl daemon-reload + fi + + if [ -f $serverPath/tgbot/initd/tgbot ];then + $serverPath/tgbot/initd/tgbot stop + fi + + rm -rf $serverPath/tgbot + echo "Uninstall_redis" > $install_tmp +} + +action=$1 +if [ "${1}" == 'install' ];then + Install_App +else + Uninstall_App +fi diff --git a/plugins/tgbot/js/tgbot.js b/plugins/tgbot/js/tgbot.js new file mode 100755 index 000000000..04c1643ed --- /dev/null +++ b/plugins/tgbot/js/tgbot.js @@ -0,0 +1,78 @@ +function appPost(method, args,callback){ + var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); + + var req_data = {}; + req_data['name'] = 'tgbot'; + req_data['func'] = method; + + if (typeof(args) == 'string'){ + req_data['args'] = JSON.stringify(toArrayObject(args)); + } else { + req_data['args'] = JSON.stringify(args); + } + + $.post('/plugins/run', req_data, function(data) { + layer.close(loadT); + if(typeof(callback) == 'function'){ + callback(data); + } + },'json'); +} + +function appPostCallbak(method, args,callback){ + var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); + + var req_data = {}; + req_data['name'] = 'tgbot'; + req_data['func'] = method; + + if (typeof(args) == 'string'){ + req_data['args'] = JSON.stringify(toArrayObject(args)); + } else { + req_data['args'] = JSON.stringify(args); + } + + $.post('/plugins/callback', req_data, function(data) { + layer.close(loadT); + if (!data.status){ + layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']}); + return; + } + + if(typeof(callback) == 'function'){ + callback(data); + } + },'json'); +} + +function botConf(){ + appPost('get_bot_conf','',function(data){ + var rdata = $.parseJSON(data.data); + var app_token = 'app_token'; + if(rdata['status']){ + db_data = rdata['data']; + app_token = db_data['app_token']; + + } + + var mlist = ''; + mlist += '

app_token必填写

' + var option = '\ +
\ + ' + mlist + '\ +
\ + \ +
\ +
'; + $(".soft-man-con").html(option); + }); +} + +function submitBotConf(){ + var pull_data = {}; + pull_data['app_token'] = base64_encode($('input[name="app_token"]').val()); + appPost('set_bot_conf',pull_data,function(data){ + var rdata = $.parseJSON(data.data); + layer.msg(rdata['msg'],{icon:rdata['status']?1:2,time:2000,shade: [0.3, '#000']}); + }); +} diff --git a/plugins/tgbot/startup/tgbot.py b/plugins/tgbot/startup/tgbot.py new file mode 100644 index 000000000..1851f2213 --- /dev/null +++ b/plugins/tgbot/startup/tgbot.py @@ -0,0 +1,63 @@ + +# coding:utf-8 + +import sys +import io +import os +import time +import re +import json +import base64 + +sys.path.append(os.getcwd() + "/class/core") +import mw + +import telebot + + +def getPluginName(): + return 'tgbot' + + +def getPluginDir(): + return mw.getPluginDir() + '/' + getPluginName() + + +def getServerDir(): + return mw.getServerDir() + '/' + getPluginName() + + +def getConfigData(): + cfg_path = getServerDir() + "/data.cfg" + if not os.path.exists(cfg_path): + mw.writeFile(cfg_path, '{}') + t = mw.readFile(cfg_path) + return json.loads(t) + + +def writeConf(data): + cfg_path = getServerDir() + "/data.cfg" + mw.writeFile(cfg_path, json.dumps(data)) + return True + +# start tgbot +cfg = getConfigData() +bot = telebot.TeleBot(cfg['bot']['app_token']) + + +# from telebot.async_telebot import AsyncTeleBot +# import asyncio +# bot = AsyncTeleBot(cfg['bot']['app_token']) + + +@bot.message_handler(commands=['start', 'help']) +def hanle_start_help(message): + bot.reply_to(message, "hello world") + + +@bot.message_handler(commands=['chat_id']) +def hanle_get_chat_id(message): + bot.reply_to(message, message.chat.id) + +bot.polling() +# asyncio.run(bot.polling()) diff --git a/route/static/app/public.js b/route/static/app/public.js index 5f65bcce8..1b83a07c1 100755 --- a/route/static/app/public.js +++ b/route/static/app/public.js @@ -1773,6 +1773,159 @@ function entitiesDecode(text) { return text; } +// base64.js +// base64加密 +function base64_encode(str) { + var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + var out, i, len; + var c1, c2, c3; + + len = str.length; + i = 0; + out = ""; + while(i < len) { + c1 = str.charCodeAt(i++) & 0xff; + if(i == len) + { + out += base64EncodeChars.charAt(c1 >> 2); + out += base64EncodeChars.charAt((c1 & 0x3) << 4); + out += "=="; + break; + } + c2 = str.charCodeAt(i++); + if(i == len) + { + out += base64EncodeChars.charAt(c1 >> 2); + out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); + out += base64EncodeChars.charAt((c2 & 0xF) << 2); + out += "="; + break; + } + c3 = str.charCodeAt(i++); + out += base64EncodeChars.charAt(c1 >> 2); + out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); + out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)); + out += base64EncodeChars.charAt(c3 & 0x3F); + } + return out; +} + + +// base64解密 +function base64_decode(str) { + var base64DecodeChars = new Array( + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1); + var c1, c2, c3, c4; + var i, len, out; + + len = str.length; + i = 0; + out = ""; + while(i < len) { + /* c1 */ + do { + c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; + } while(i < len && c1 == -1); + if(c1 == -1) + break; + + /* c2 */ + do { + c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; + } while(i < len && c2 == -1); + if(c2 == -1) + break; + + out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4)); + + /* c3 */ + do { + c3 = str.charCodeAt(i++) & 0xff; + if(c3 == 61) + return out; + c3 = base64DecodeChars[c3]; + } while(i < len && c3 == -1); + if(c3 == -1) + break; + + out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2)); + + /* c4 */ + do { + c4 = str.charCodeAt(i++) & 0xff; + if(c4 == 61) + return out; + c4 = base64DecodeChars[c4]; + } while(i < len && c4 == -1); + if(c4 == -1) + break; + out += String.fromCharCode(((c3 & 0x03) << 6) | c4); + } + return out; +} + +function utf16to8(str) { + var out, i, len, c; + + out = ""; + len = str.length; + for(i = 0; i < len; i++) { + c = str.charCodeAt(i); + if ((c >= 0x0001) && (c <= 0x007F)) { + out += str.charAt(i); + } else if (c > 0x07FF) { + out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F)); + out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F)); + out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); + } else { + out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F)); + out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); + } + } + return out; +} + +function utf8to16(str) { + var out, i, len, c; + var char2, char3; + + out = ""; + len = str.length; + i = 0; + while(i < len) { + c = str.charCodeAt(i++); + switch(c >> 4) + { + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: + // 0xxxxxxx + out += str.charAt(i-1); + break; + case 12: case 13: + // 110x xxxx 10xx xxxx + char2 = str.charCodeAt(i++); + out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)); + break; + case 14: + // 1110 xxxx 10xx xxxx 10xx xxxx + char2 = str.charCodeAt(i++); + char3 = str.charCodeAt(i++); + out += String.fromCharCode(((c & 0x0F) << 12) | + ((char2 & 0x3F) << 6) | + ((char3 & 0x3F) << 0)); + break; + } + } + + return out; +} + function pluginService(_name, version){ var data = {name:_name, func:'status'}