diff --git a/server/tools/robot/virtualclient/__init__.py b/server/tools/robot/virtualclient/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/tools/robot/virtualclient/bat/robot1.bat b/server/tools/robot/virtualclient/bat/robot1.bat new file mode 100644 index 0000000..8037e0d --- /dev/null +++ b/server/tools/robot/virtualclient/bat/robot1.bat @@ -0,0 +1,2 @@ +cd .. +start python robot.py ws://118.31.73.76:82 test0001 123456 diff --git a/server/tools/robot/virtualclient/bat/robot2.bat b/server/tools/robot/virtualclient/bat/robot2.bat new file mode 100644 index 0000000..8363860 --- /dev/null +++ b/server/tools/robot/virtualclient/bat/robot2.bat @@ -0,0 +1,2 @@ +cd .. +start python robot.py ws://192.144.140.87:8999 test0002 123456 diff --git a/server/tools/robot/virtualclient/client.py b/server/tools/robot/virtualclient/client.py new file mode 100644 index 0000000..51c6177 --- /dev/null +++ b/server/tools/robot/virtualclient/client.py @@ -0,0 +1,110 @@ +import websocket +import sys +import time + +import vs_proto_pb2 +import vs_msgid_pb2 + +try: + import thread +except ImportError: + import _thread as thread +import time + +def on_open (ws): + print 'on open' + +class Client: + + def __init__(self, accountid, user_profile, remote_ip, remote_port): + self._recv_buf = bytearray() + self._accountid = accountid + self._sessionid = '' + self._user_profile = user_profile + self._ws = websocket.WebSocketApp ("ws://127.0.0.1:" + sys.argv[1], + on_message = self.onMessage, + on_error = self.onError, + on_close = self.onClose) +# self._ws.on_open = on_open + self._ws.on_open = self.onOpen + + def sendMsg(self, msgid, msg): + PACK_SIGN = 0xAABBCCAA + enmsg = bytearray(msg.SerializeToString()) + pktlen_str = chr(len(enmsg) & 0xFF) + chr(len(enmsg) >> 8 & 0xFF) + msgid_str = chr(msgid & 0xFF) + chr(msgid >> 8 & 0xFF) + sign_str = chr(PACK_SIGN & 0xFF) + chr(PACK_SIGN >> 8 & 0xFF) + \ + chr(PACK_SIGN >> 16 & 0xFF) + chr(PACK_SIGN >> 24 & 0xFF) + buff = pktlen_str + msgid_str + sign_str + enmsg + self._ws.send (buff, 2) + + def parsePacket(self): + while len(self._recv_buf) >= 8: + pktlen = self._recv_buf[0] + (self._recv_buf[1] << 8) + msgid = self._recv_buf[2] + (self._recv_buf[3] << 8) + magiccode = self._recv_buf[4] + \ + (self._recv_buf[5] << 8) + \ + (self._recv_buf[6] << 16) + \ + (self._recv_buf[7] << 24) + print 'pkglen:', pktlen, ' msgid:', msgid, ' magiccode:', magiccode + if len(self._recv_buf) >= 8 + pktlen: + msgbody = self._recv_buf[8 : 8 + pktlen] + self.onUserPacket(msgid, msgbody) + self._recv_buf = self._recv_buf[8 + pktlen:] + + def onUserPacket(self): + try: + msgid_class_hash = { + vs_msgid_pb2._SMLogin: vs_proto_pb2.SMLogin, + vs_msgid_pb2._SMCreateRoom: vs_proto_pb2.SMCreateRoom + } + if not msgid_class_hash.has_key(msgid): + print 'not found msgclass:', msgid + return + msg = msgid_class_hash[msgid]() + ret = msg.ParseFromString(str(msgbody)) + print str(msg) + except Exception, e: + print 'on_user_packet', e + + def onMessage(self, message): + data = bytearray(message) + self._recv_buf += data + print 'on_message ', len(recv_buf) + self._ws.parsePacket(); + + def onError(self, error): + print error + + def onClose(self): + print 'onclose' + + def onOpen(self): + print 'ok' + def run (*args): + msg = vs_proto_pb2.CMLogin() + msg.account_id = '1234567' + msg.session_id = 'dsjfkasjkfljfsklfd' + print msg + sendmsg(ws, vs_msgid_pb2._CMLogin, msg) + testCMCreateRoom(ws) + while True: + testSendRoomEvent(ws) + time.sleep(10) + + time.sleep(500) + ws.close () + print ("thread terminating...") + thread.start_new_thread (run, ()) + + def runForever(self): + self._ws.run_forever() + +if __name__ == "__main__": + client = Client( + '123456', + '', + '127.0.0.1', + 82 + ) + client.runForever() diff --git a/server/tools/robot/virtualclient/new_robot.py b/server/tools/robot/virtualclient/new_robot.py new file mode 100644 index 0000000..e6165ad --- /dev/null +++ b/server/tools/robot/virtualclient/new_robot.py @@ -0,0 +1,32 @@ +from optparse import OptionParser + +from tornado import gen +from tornado import httpclient +from tornado import httputil +from tornado import ioloop +from tornado import websocket + +import virtualclient + +@gen.coroutine +def createVirtualClient(account, ws_url): + virtualclient.VirtualClient(ws_url, account).run() + +@gen.coroutine +def main(): + parser = OptionParser(usage="%prog [options]") + parser.add_option("-a", + "--accounts", + dest = "accounts", + help = "account info") + (options, args) = parser.parse_args() + + ws_url = args if args else 'ws://127.0.0.1:83/websocket' + for account in options.accounts.split(','): + ioloop.IOLoop.current().spawn_callback(createVirtualClient, account, ws_url) + + while True: + yield gen.sleep(0.1) + +if __name__ == '__main__': + ioloop.IOLoop.current().run_sync(main) diff --git a/server/tools/robot/virtualclient/robot.bat b/server/tools/robot/virtualclient/robot.bat new file mode 100644 index 0000000..5ba8b65 --- /dev/null +++ b/server/tools/robot/virtualclient/robot.bat @@ -0,0 +1,9 @@ +protoc.exe --proto_path=../../protobuild --python_out=. ../../protobuild/kingsomevs.proto +protoc.exe --proto_path=../../protobuild --python_out=. ../../protobuild/messages.proto +rename kingsomevs_pb2.py vs_proto_pb2.py +rename messages_pb2.py vs_msgid_pb2.py + +start python robot.py ws://118.31.73.76:82 test0001 123456 +start python robot.py ws://118.31.73.76:82 test0002 123456 +start python robot.py ws://118.31.73.76:82 test0003 123456 +start python robot.py ws://118.31.73.76:82 test0004 123456 \ No newline at end of file diff --git a/server/tools/robot/virtualclient/robot.py b/server/tools/robot/virtualclient/robot.py new file mode 100644 index 0000000..7f112b3 --- /dev/null +++ b/server/tools/robot/virtualclient/robot.py @@ -0,0 +1,146 @@ +# -*- coding: utf-8 -*- +import websocket +import sys +import ssl +import datetime + +import cs_proto_pb2 +import cs_msgid_pb2 + +#from google.protobuf import json_format +import pprint + +try: + import thread +except ImportError: + import _thread as thread +import time + +def inputCommand(ws): + cmdline= raw_input('') + idx = cmdline.find(' ') + if idx <= 0: + cmdline += '()' + else: + cmdline = cmdline[:idx] + '(' + cmdline[idx + 1:] + ')' + msg = eval('cs_proto_pb2.' + cmdline) + sendMsg(ws, msg) + inputCommand(ws) + +def getSMMsgEnum(sm_msgid): + sm_e = cs_msgid_pb2._SMMESSAGEID_E + for e in sm_e.values: + if e.number == sm_msgid: + return e + return None + +def getSMMsg(sm_msgid): + sm_e = getSMMsgEnum(sm_msgid) + msg = eval('cs_proto_pb2.' + sm_e.name[1:] + '()') + return msg + +#g_remote_ip = "ws://127.0.0.1:" + sys.argv[1] +g_remote_ip = sys.argv[1] +g_account_id = sys.argv[2] +g_session_id = sys.argv[3] +g_seqid = 1000 + +recv_buf = bytearray() + +def sendMsg(ws, msg): + print datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') + global g_seqid + ++g_seqid + msgid = eval('cs_msgid_pb2._' + msg.DESCRIPTOR.name) + PACK_SIGN = 'KS' + enmsg = bytearray(msg.SerializeToString()) + pktlen_str = chr(len(enmsg) & 0xFF) + chr(len(enmsg) >> 8 & 0xFF) + msgid_str = chr(msgid & 0xFF) + chr(msgid >> 8 & 0xFF) + seqid_str = chr(g_seqid & 0xFF) + chr(g_seqid >> 8 & 0xFF) + \ + chr(g_seqid >> 16 & 0xFF) + chr(g_seqid >> 24 & 0xFF) + sign_str = PACK_SIGN + reserved_str = chr(0) + chr(0) + buff = pktlen_str + msgid_str + seqid_str + sign_str + reserved_str + enmsg + ws.send (buff, 2) + print time.time(), time.strftime('[%H:%M:%S]'), msg.DESCRIPTOR.name + '{' + print str(msg), + print '}' + print '' + +def onMessage(ws, message): + global recv_buf + + print 'onMessage', len(message) + data = bytearray(message) + recv_buf += data + parserPacket(ws) + +def parserPacket(ws): + global recv_buf + while len(recv_buf) >= 8: + pktlen = recv_buf[0] + (recv_buf[1] << 8) + msgid = recv_buf[2] + (recv_buf[3] << 8) + seqid = recv_buf[4] + \ + (recv_buf[5] << 8) + \ + (recv_buf[6] << 16) + \ + (recv_buf[7] << 24) + sign = recv_buf[8] + (recv_buf[9] << 8) + resv = recv_buf[10] + (recv_buf[11] << 8) + if len(recv_buf) >= 12 + pktlen: + msgbody = recv_buf[12 : 12 + pktlen] + onUserPacket(ws, msgid, msgbody) + recv_buf = recv_buf[12 + pktlen:] + +def onUserPacket(ws, msgid, msgbody): + try: + print datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') + msg = getSMMsg(msgid) + ret = msg.ParseFromString(str(msgbody)) + print len(msgbody) + print time.time(), time.strftime('[%H:%M:%S]'), msg.DESCRIPTOR.name + '{' + print str(msg), + print '}' + print '' + if msgid == cs_msgid_pb2._SMTestAward: + print msg.default_123456 + except Exception, e: + print 'onUserPacket', e + +def onError (ws, error): + print (error) + +def onClose (ws): + print ("### closed ###") + +def opOpen (ws): + print 'opOpen', time.time() + def run (*args): + global g_remote_ip + global g_account_id + global g_session_id + msg = cs_proto_pb2.CMLogin() + msg.server_id = 1 + msg.account_id = g_account_id + msg.session_id = g_session_id + msg.device_id = '123456' + print msg.DESCRIPTOR.name, 'zzzzz' + sendMsg(ws, msg) + while True: + inputCommand(ws) + time.sleep(500) + ws.close () + print ("thread terminating...") + thread.start_new_thread (run, ()) + +print time.time() +print g_remote_ip + +if __name__ == "__main__": + websocket.enableTrace(True) + ws = websocket.WebSocketApp (g_remote_ip, + on_message = onMessage, + on_error = onError, + on_close = onClose + ) + ws.on_open = opOpen + ws.run_forever () diff --git a/server/tools/robot/virtualclient/robot1.sh b/server/tools/robot/virtualclient/robot1.sh new file mode 100755 index 0000000..3e19d7b --- /dev/null +++ b/server/tools/robot/virtualclient/robot1.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +python robot.py ws://127.0.0.1:8999 test0001 123456 diff --git a/server/tools/robot/virtualclient/robot2.bat b/server/tools/robot/virtualclient/robot2.bat new file mode 100644 index 0000000..23d44af --- /dev/null +++ b/server/tools/robot/virtualclient/robot2.bat @@ -0,0 +1,9 @@ +protoc.exe --proto_path=../../protobuild --python_out=. ../../protobuild/kingsomevs.proto +protoc.exe --proto_path=../../protobuild --python_out=. ../../protobuild/messages.proto +rename kingsomevs_pb2.py vs_proto_pb2.py +rename messages_pb2.py vs_msgid_pb2.py + +rem start python robot.py wss://matchvs-test.kingsome.cn/websocket test00010 123456 + start python robot.py wss://matchvs-test.kingsome.cn/websocket test0001 123456 + start python robot.py wss://matchvs-test.kingsome.cn/websocket test0003 123456 + start python robot.py wss://matchvs-test.kingsome.cn/websocket test0004 123456 \ No newline at end of file diff --git a/server/tools/robot/virtualclient/robot2.sh b/server/tools/robot/virtualclient/robot2.sh new file mode 100755 index 0000000..5038ecd --- /dev/null +++ b/server/tools/robot/virtualclient/robot2.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +python robot.py ws://127.0.0.1:8999 test0002 123456 diff --git a/server/tools/robot/virtualclient/robot3.py b/server/tools/robot/virtualclient/robot3.py new file mode 100644 index 0000000..539cef1 --- /dev/null +++ b/server/tools/robot/virtualclient/robot3.py @@ -0,0 +1,165 @@ +# -*- coding: utf-8 -*- +import websocket +import sys +import ssl +import json +import datetime +import urllib.request + +import cs_proto_pb2 +import cs_msgid_pb2 + +#from google.protobuf import json_format +import pprint + +try: + import thread +except ImportError: + import _thread as thread +import time + +def getSession(account_id): + url = 'https://login-test.kingsome.cn/webapp/index.php?c=Login&a=auth&' + params = { + 'openid': sys.argv[2], + 'token': sys.argv[2], + 'gameid': 1008, + 'channel': '6000' + } + real_url = url + urllib.parse.urlencode(params) + print(real_url) + req = urllib.request.Request(real_url) + data = urllib.request.urlopen(req).read() + return json.loads(data.decode('utf-8'))['session_id'] + +def inputCommand(ws): + cmdline= input('') + idx = cmdline.find(' ') + if idx <= 0: + cmdline += '()' + else: + cmdline = cmdline[:idx] + '(' + cmdline[idx + 1:] + ')' + msg = eval('cs_proto_pb2.' + cmdline) + sendMsg(ws, msg) + inputCommand(ws) + +def getSMMsgEnum(sm_msgid): + sm_e = cs_msgid_pb2._SMMESSAGEID_E + for e in sm_e.values: + if e.number == sm_msgid: + return e + return None + +def getSMMsg(sm_msgid): + sm_e = getSMMsgEnum(sm_msgid) + msg = eval('cs_proto_pb2.' + sm_e.name[1:] + '()') + return msg + +#g_remote_ip = "ws://127.0.0.1:" + sys.argv[1] +g_remote_ip = sys.argv[1] +g_account_id = '6000_1008_' + sys.argv[2] +g_session_id = sys.argv[3] +g_server_id = sys.argv[4] +g_seqid = 1000 + +recv_buf = bytearray() + +def sendMsg(ws, msg): + print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')) + global g_seqid + ++g_seqid + msgid = eval('cs_msgid_pb2._' + msg.DESCRIPTOR.name) + + enmsg = msg.SerializeToString() + pktlen_str = bytes([(len(enmsg) & 0xFF) , (len(enmsg) >> 8 & 0xFF)]) + msgid_str = bytes([(msgid & 0xFF) , (msgid >> 8 & 0xFF)]) + seqid_str = bytes([(g_seqid & 0xFF) , (g_seqid >> 8 & 0xFF) , \ + (g_seqid >> 16 & 0xFF) , (g_seqid >> 24 & 0xFF)]) + sign_str = bytes([ord('K'), ord('S')]) + reserved_str = bytes([0, 0]) + buff = pktlen_str + msgid_str + seqid_str + sign_str + reserved_str + enmsg + + ws.send (buff, 2) + print(time.time(), time.strftime('[%H:%M:%S]'), msg.DESCRIPTOR.name + '{') + print(str(msg),) + print('}') + print('') + +def onMessage(ws, message): + global recv_buf + + print('onMessage', len(message)) + data = bytearray(message) + recv_buf += data + parserPacket(ws) + +def parserPacket(ws): + global recv_buf + while len(recv_buf) >= 8: + pktlen = recv_buf[0] + (recv_buf[1] << 8) + msgid = recv_buf[2] + (recv_buf[3] << 8) + seqid = recv_buf[4] + \ + (recv_buf[5] << 8) + \ + (recv_buf[6] << 16) + \ + (recv_buf[7] << 24) + sign = recv_buf[8] + (recv_buf[9] << 8) + resv = recv_buf[10] + (recv_buf[11] << 8) + if len(recv_buf) >= 12 + pktlen: + msgbody = recv_buf[12 : 12 + pktlen] + onUserPacket(ws, msgid, msgbody) + recv_buf = recv_buf[12 + pktlen:] + +def onUserPacket(ws, msgid, msgbody): + try: + print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')) + msg = getSMMsg(msgid) + ret = msg.ParseFromString(msgbody) + print(len(msgbody)) + print(time.time(), time.strftime('[%H:%M:%S]'), msg.DESCRIPTOR.name + '{') + print(str(msg),) + print('}') + print('') + if msgid == cs_msgid_pb2._SMTestAward: + print(msg.default_123456) + except Exception as e: + print('onUserPacket', e) + +def onError (ws, error): + print (error) + +def onClose (ws): + print ("### closed ###") + +def opOpen (ws): + print('opOpen', time.time()) + def run (*args): + global g_remote_ip + global g_account_id + global g_session_id + global g_server_id + msg = cs_proto_pb2.CMLogin() + msg.server_id = int(g_server_id) + msg.account_id = g_account_id + msg.session_id = getSession(g_account_id) + msg.device_id = '123456' + print(msg.DESCRIPTOR.name, 'zzzzz') + sendMsg(ws, msg) + while True: + inputCommand(ws) + time.sleep(500) + ws.close () + print ("thread terminating...") + thread.start_new_thread (run, ()) + +print(time.time()) +print(g_remote_ip) + +if __name__ == "__main__": + websocket.enableTrace(True) + ws = websocket.WebSocketApp (g_remote_ip, + on_message = onMessage, + on_error = onError, + on_close = onClose + ) + ws.on_open = opOpen + ws.run_forever () diff --git a/server/tools/robot/virtualclient/robot3.sh b/server/tools/robot/virtualclient/robot3.sh new file mode 100755 index 0000000..cc4d2fd --- /dev/null +++ b/server/tools/robot/virtualclient/robot3.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +python robot.py ws://127.0.0.1:8999 test0003 123456 diff --git a/server/tools/robot/virtualclient/robot4.sh b/server/tools/robot/virtualclient/robot4.sh new file mode 100755 index 0000000..676901a --- /dev/null +++ b/server/tools/robot/virtualclient/robot4.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +python robot.py ws://127.0.0.1:8999 test0004 123456 diff --git a/server/tools/robot/virtualclient/virtualclient.py b/server/tools/robot/virtualclient/virtualclient.py new file mode 100644 index 0000000..e4ccc5e --- /dev/null +++ b/server/tools/robot/virtualclient/virtualclient.py @@ -0,0 +1,108 @@ +import time +import datetime + +from tornado import gen +from tornado import httpclient +from tornado import httputil +from tornado import ioloop +from tornado import websocket + +import cs_proto_pb2 +import cs_msgid_pb2 + +def getSMMsgEnum(sm_msgid): + sm_e = cs_msgid_pb2._SMMESSAGEID_E + for e in sm_e.values: + if e.number == sm_msgid: + return e + return None + +def getSMMsg(sm_msgid): + sm_e = getSMMsgEnum(sm_msgid) + msg = eval('cs_proto_pb2.' + sm_e.name[1:] + '()') + return msg + +class VirtualClient(object): + + def __init__(self, ws_url, account): + self.ws_url = ws_url + self.account = account + print(self.ws_url) + + @gen.coroutine + def co_connect(self): + print("connect, account:%s" % self.account) + conn = yield websocket.websocket_connect(self.ws_url) + assert conn + ioloop.IOLoop.current().spawn_callback(self.co_receiveMessage, conn) + self.sendLogin(conn) + + def sendMsg(self, conn, msg): + seqid = 1 + print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')) + msgid = eval('cs_msgid_pb2._' + msg.DESCRIPTOR.name) + PACK_SIGN = 'KS' + enmsg = bytearray(msg.SerializeToString()) + pktlen_str = chr(len(enmsg) & 0xFF) + chr(len(enmsg) >> 8 & 0xFF) + msgid_str = chr(msgid & 0xFF) + chr(msgid >> 8 & 0xFF) + seqid_str = chr(seqid & 0xFF) + chr(seqid >> 8 & 0xFF) + \ + chr(seqid >> 16 & 0xFF) + chr(seqid >> 24 & 0xFF) + sign_str = PACK_SIGN + reserved_str = chr(0) + chr(0) + buff = pktlen_str + msgid_str + seqid_str + sign_str + reserved_str + enmsg.decode('utf-8') + conn.write_message(buff.encode('utf-8'), True) + print(time.time(), time.strftime('[%H:%M:%S]'), msg.DESCRIPTOR.name + '{') + print(str(msg), end='') + print('}', end='') + print('') + + def sendLogin(self, conn): + msg = cs_proto_pb2.CMLogin() + msg.server_id = 1 + msg.account_id = self.account + msg.session_id = '12342' + msg.device_id = '123456' + self.sendMsg(conn, msg) + + def parsePacket(self, conn, recv_buf): + while len(recv_buf) >= 8: + pktlen = recv_buf[0] + (recv_buf[1] << 8) + msgid = recv_buf[2] + (recv_buf[3] << 8) + seqid = recv_buf[4] + \ + (recv_buf[5] << 8) + \ + (recv_buf[6] << 16) + \ + (recv_buf[7] << 24) + sign = recv_buf[8] + (recv_buf[9] << 8) + resv = recv_buf[10] + (recv_buf[11] << 8) + if len(recv_buf) >= 12 + pktlen: + msgbody = recv_buf[12 : 12 + pktlen] + self.onReceiveUserPacket(conn, msgid, msgbody) + recv_buf = recv_buf[12 + pktlen:] + + def onReceiveUserPacket(self, conn, msgid, msgbody): + try: + print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')) + msg = getSMMsg(msgid) + ret = msg.ParseFromString(msgbody) + print(len(msgbody)) + print(time.time(), time.strftime('[%H:%M:%S]'), msg.DESCRIPTOR.name + '{') + print(str(msg), end='') + print('}') + print('') + except Exception as e: + print('onReceiveUserPacket', e) + + @gen.coroutine + def co_receiveMessage(self, conn): + recv_buf = bytearray() + while True: + data = yield conn.read_message() + if data is None: + break + else: + recv_buf += data + self.parsePacket(conn, recv_buf) + + @gen.coroutine + def run(self): + ioloop.IOLoop.current().spawn_callback(self.co_connect)