在 Python 中向 Minecraft 服务器发送登录数据包不起作用

2024-01-08

我有以下 Python 脚本。它的作用是尝试连接到 MineCraft 服务器,首先发送“握手”,然后发送登录请求。协议规范可以在这里找到:http://wiki.vg/协议 http://wiki.vg/Protocol

无论如何,python 脚本运行良好,并且没有错误。但是,我相当频繁地将第二个数据包编码错误,因为当它发送时,服务器控制台上没有显示任何内容。播放器未连接或任何其他东西。由于“客户端”未及时登录,它最终会超时并关闭连接。

基本上,无论如何,有 struct.pack() 经验的人应该能够在这里帮助我。我已经评论了我不确定我是否已正确编码所有内容的行。有关打包数据的详细信息显示在上面的链接中。

任何帮助都会greatly谢谢,我对编码/打包数据一无所知。 :(

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。

Edit:上述方法不起作用;这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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中向 Minecraft 服务器发送登录数据包不起作用 的相关文章

  • Python子进程:cmd退出时的回调

    我目前正在使用启动一个程序subprocess Popen cmd shell TRUE 我对 Python 相当陌生 但 感觉 应该有一些 api 可以让我做类似的事情 subprocess Popen cmd shell TRUE po
  • Matplotlib 颤抖比例

    我正在尝试使用 matplotlib 和 quiver 函数绘制一些箭头 但我想使用数组单独选择每个箭头的长度 http matplotlib sourceforge net api pyplot api html matplotlib p
  • 如何创建自定义颜色图并将其用于不同范围的数据?

    假设我有这样的数据 import numpy as np import matplotlib pyplot as plt import matplotlib colors for reproducibility purposes np ra
  • 如何使用Python中的or-tools解决累积旅行商问题?

    累积旅行商问题 CTSP 的目标是最小化到达客户的时间总和 而不是总旅行时间 这与最小化总旅行时间不同 例如 如果一个人拥有无限的车辆 车辆与位置数量相同 并且目标是最大限度地减少到达位置的总时间 则可以为每个位置发送一辆车 因为这是满足所
  • 为什么 Contextmanager 会抛出运行时错误“生成器在 throw() 之后没有停止”?

    在我的 utility py 中 contextmanager def rate limit protection max tries 3 wait 300 tries 0 while max tries gt tries try yiel
  • TensorFlow 运算符重载

    有什么区别 tf add x y and x y 在 TensorFlow 中 当您使用以下命令构建图表时 您的计算图表会有什么不同 代替tf add 更一般地说 有 或者其他张量超载的操作 如果至少有一个x or y is a tf Te
  • 优化 Django Queryset for 循环

    如何优化以下查询集 link goal for link in self child links all 我想摆脱 for 循环并只访问数据库一次 我有以下代码 class Goal models Model name models Cha
  • BeautifulSoup - 抓取论坛页面

    我正在尝试抓取论坛讨论并将其导出为 csv 文件 其中包含 线程标题 用户 和 帖子 等行 其中后者是每个人的实际论坛帖子 我是 Python 和 BeautifulSoup 的初学者 所以我对此感到非常困难 我当前的问题是 csv 文件中
  • 在循环中动态添加方法时的范围问题

    我有一个 API 用于分析我的锻炼数据 我抓取的数据 跑卫 http runkeeper com 的网站 我的主类是一个子类pandas DataFrame 它基本上是表格数据的容器 它支持按列名索引 返回列值的数组 我想根据数据中存在的
  • 如何使用包含 \n 的 .txt 创建一维列表?

    我想读取一个文本文件并将文件的每个元素放入一个列表中 而不是为文件中的每一行都有一个单独的列表 例如 如果文件是 你好我的名字 Is Joe 我希望列表是 你好 我的名字是 Joe 而不是 你好 我的名字 是乔 这是我到目前为止所拥有的 d
  • 何时在 Gevent 中使用线程池

    我注意到 Gevent 有线程池对象 有人可以向我解释何时使用线程池以及何时使用常规池吗 gevent threadpool 和 gevent pool 有什么区别 当你有一段需要很长时间运行 几秒钟 并且不会导致 greenlet 切换的
  • 在Python中将字符串转换为变量? [复制]

    这个问题在这里已经有答案了 我对 python 和编程都很陌生 并且已经尝试弄清楚如何做到这一点有一段时间了 这是我需要帮助的内容 y 0 x 2 p01 hello p02 bye print p str y str x 输出当然是 p0
  • 将所有构造函数参数作为实例属性添加到 PyCharm 中的类中

    我正在使用 PyCharm 我开始定义一个类 class A def init self a b c 我希望它看起来像这样 class A def init self a b c self a a self b b self c c 使用
  • 熊猫:SettingWithCopyWarning:[重复]

    这个问题在这里已经有答案了 我尝试使用以下代码将列转换为 日期 df DATE pd to datetime df DATE or df DATE pd to datetime df DATE 但我收到以下错误 Users xyz anac
  • Python Pandas 系列失败日期时间

    我认为这一定是 pandas 的失败 有一个 pandas 系列 v 18 1 和 19 如果我为该系列分配一个日期 第一次将其添加为 int 错误 第二次将其添加为 int 错误 添加为日期时间 正确 我无法理解原因 例如使用以下代码 i
  • Python代码检测OS X El Capitan中的暗模式以更改状态栏菜单图标

    我有目标 C 代码来检测暗模式以更改状态栏 NSDistributedNotificationCenter defaultCenter addObserver self selector selector darkModeChanged n
  • Django - 以表单形式访问 request.session

    我按如下方式调用表单 然后将其传递给模板 f UserProfileConfig request 我需要能够访问表单中的 request session 所以首先我尝试了这个 class UserProfileConfig forms Fo
  • Scapy TCP 校验和重新计算奇怪的行为

    我正在尝试进行 TCP ACK 欺骗 我从 pcap 文件中嗅探一个 ACK 数据包 并在循环中发送它 增加其 ACK 编号以及另一个选项字段 嗅探部分 预欺骗 from scapy all import from struct impor
  • python散景中的反转轴

    我正在尝试反转 y 轴并在散景散点图中设置 x 和 y 的范围 我在用 BokehPlot bokeh scatter data df x range min utc max utc y range min val max val 我收到错
  • 从多个 .csv 文件创建混淆矩阵

    我有很多具有以下格式的 csv 文件 338 800 338 550 339 670 340 600 327 500 301 430 299 350 284 339 284 338 283 335 283 330 283 310 282 3

随机推荐