簡體   English   中英

使用Python將登錄數據包發送到Minecraft服務器不起作用

[英]Sending Login Packet to Minecraft Server in Python Not Working

我在Python中有以下腳本。 它的作用是嘗試連接到MineCraft服務器,首先發送“握手”,然后發送登錄請求。 協議規范可以在這里找到: http//wiki.vg/Protocol

無論如何,python腳本工作正常,沒有錯誤。 但是,我相當使用我編碼第二個數據包錯誤,因為它發送時,服務器控制台上沒有任何內容。 播放器沒有連接或任何東西。 由於“客戶端”沒有及時登錄,它最終會超時並關閉連接。

基本上,無論如何誰有struct.pack()的經驗應該能夠在這里幫助我。 我已經評論了我不確定是否已將所有內容編碼正確的行。 有關打包數據的詳細信息,請參見上面的鏈接。

任何幫助將不勝感激,我和編碼/封裝數據是很笨。 :(

import struct
import socket
import time
import urllib
import urllib2
host = "127.0.0.1"
port = 25566
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))

logindata = {'user':'JackBeePee', 'password':'*******', 'version':'12'}
data = urllib.urlencode(logindata)
print('Sending data to login.minecraft.net...')
req = urllib2.Request('https://login.minecraft.net', data)
response = urllib2.urlopen(req)
returndata = response.read() 
returndata = returndata.split(":")
mcsessionid = returndata[3]
del req
del returndata
print("Session ID: " + mcsessionid)
data = {'user':u'JackBeePee','host':u'127.0.0.1','port':25566}


stringfmt = u'%(user)s;%(host)s:%(port)d'
string = stringfmt % data
structfmt = '>bh'
packetbytes = struct.pack(structfmt, 2, len(string))+string.encode('utf-16BE')
s.send(packetbytes)
connhash = s.recv(1024)
print("Connection Hash: " + connhash)
print('Sending data to http://session.minecraft.net/game/joinserver.jsp?user=JackBeePee&sessionId=' + mcsessionid + '&serverId=' + connhash + '...')
req = urllib.urlopen('http://session.minecraft.net/game/joinserver.jsp?user=JackBeePee&sessionId=' + mcsessionid + '&serverId=' + connhash)
returndata = req.read()
if(returndata == 'OK'):
    print('session.minecraft.net says everything is okay, proceeding to send data to server.')
else:
    print('Oops, something went wrong.')

time.sleep(5)

# All above here works perfectly.
enc_user = data['user'].encode('utf-16BE')
#This line is probably where something's going wrong:
packetbytes = struct.pack('>bih', 1, 23, len(data['user'])) + data['user'].encode('utf-16BE') + struct.pack('>hiibBB', 2,0,0,0,0,0)
print(len(packetbytes))
print('Sending ' + packetbytes + ' to server.')
s.send(packetbytes)

while True:
    data = s.recv(1024)
    if data:
        print(data)

看來你沒有添加字符串或空字段;

packetbytes = struct.pack('>bihshiibBB', 1, 23, len(data['user']), enc_user, 0, 0, 0, 0, 0, 0)

關於打包格式中的第二個h ,Minecraft字符串的長度大於或等於2個字節。 所以我假設一個空字符串只是一個short值,值為0。

編輯:上述方法不起作用; s需要一個長度;

packfmt = '>bih{}shiibBB'.format(len(enc_user))
packetbytes = struct.pack(packfmt, 1, 23, len(data['user']), enc_user, 0, 0, 0, 0, 0, 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM