1
This commit is contained in:
parent
5e48a91c8a
commit
b575ea8b14
0
server/tools/robot/virtualclient/__init__.py
Normal file
0
server/tools/robot/virtualclient/__init__.py
Normal file
36
server/tools/robot/virtualclient/new_robot.py
Normal file
36
server/tools/robot/virtualclient/new_robot.py
Normal file
@ -0,0 +1,36 @@
|
||||
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://192.168.100.21:7101/websocket'
|
||||
accounts = options.accounts.split(',')
|
||||
accounts = []
|
||||
for i in range(500):
|
||||
accounts.append('test' + str(i))
|
||||
for account in accounts:
|
||||
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)
|
195
server/tools/robot/virtualclient/robot.py
Normal file
195
server/tools/robot/virtualclient/robot.py
Normal file
@ -0,0 +1,195 @@
|
||||
# -*- 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()
|
||||
print(data)
|
||||
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_2001_' + sys.argv[2]
|
||||
g_session_id = getSession(g_account_id)
|
||||
g_server_id = sys.argv[4]
|
||||
g_seqid = 1000
|
||||
g_login_time = time.time()
|
||||
g_active_player_id = 0
|
||||
|
||||
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 sendCMMove(ws):
|
||||
msg = cs_proto_pb2.CMMove()
|
||||
msg.spectate = True
|
||||
sendMsg(ws, msg)
|
||||
|
||||
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 procSMUpdate(msg):
|
||||
global g_active_player_id
|
||||
if msg.active_player_id != 0:
|
||||
g_active_player_id = msg.active_player_id
|
||||
print(g_active_player_id)
|
||||
for part_obj in msg.part_objects:
|
||||
if part_obj.object_type == 1 and part_obj.union_obj_1.obj_uniid == g_active_player_id:
|
||||
pass
|
||||
# print(part_obj)
|
||||
for full_obj in msg.full_objects:
|
||||
if full_obj.object_type == 1 and full_obj.union_obj_1.obj_uniid == g_active_player_id:
|
||||
if full_obj.union_obj_1.dead:
|
||||
print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f'))
|
||||
print(full_obj)
|
||||
|
||||
def onUserPacket(ws, msgid, msgbody):
|
||||
print('onUserPacket')
|
||||
global g_login_time
|
||||
if time.time() - g_login_time > 30:
|
||||
sendCMMove(ws)
|
||||
try:
|
||||
if msgid == 1004:
|
||||
msg = getSMMsg(msgid)
|
||||
ret = msg.ParseFromString(msgbody)
|
||||
procSMUpdate(msg)
|
||||
if msgid != 1009 and msgid != 1005:
|
||||
return
|
||||
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('')
|
||||
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.CMJoin()
|
||||
msg.server_id = int(g_server_id)
|
||||
msg.account_id = g_account_id
|
||||
msg.name = "aozhwei12345678"
|
||||
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 ()
|
114
server/tools/robot/virtualclient/virtualclient.py
Normal file
114
server/tools/robot/virtualclient/virtualclient.py
Normal file
@ -0,0 +1,114 @@
|
||||
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())
|
||||
head = bytearray(12)
|
||||
head[0] = len(enmsg) & 0xFF
|
||||
head[1] = len(enmsg) >> 8 & 0xFF
|
||||
head[2] = msgid & 0xFF
|
||||
head[3] = msgid >> 8 & 0xFF
|
||||
head[4] = 0
|
||||
head[5] = 0
|
||||
head[6] = 0
|
||||
head[7] = 0
|
||||
head[8] = ord('K')
|
||||
head[9] = ord('S')
|
||||
head[10] = 0
|
||||
head[11] = 0
|
||||
buff = head + enmsg
|
||||
conn.write_message(bytes(buff), 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.CMJoin()
|
||||
msg.server_id = 2
|
||||
msg.account_id = self.account
|
||||
msg.baseskin = 14001
|
||||
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)
|
Loading…
x
Reference in New Issue
Block a user