163 lines
4.5 KiB
Python
163 lines
4.5 KiB
Python
# -*- 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('')
|
|
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 = "测试"
|
|
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 ()
|