Как отправлять пакеты на удаленный сервер Minecraft Classic в Python?

Привет, добрые люди из StackOverflow.

Я пытаюсь создать своего рода «бота», который может подключаться к серверу Minecraft Classic, публиковать сообщения и, возможно, строить.

Во всяком случае, у меня возникли проблемы с пониманием того, как отправлять пакеты в python и как их правильно кодировать.

Вот пакеты, которые мне нужно отправить, я хочу отправить пакет «Идентификация игрока»: http://www.minecraftwiki.net/wiki/Classic_server_protocol#Client_.E2.86.92_Server_packets Я знаю, что мне нужно использовать сокеты, и мне нужно использовать struct.pack, но как именно я могу Отправь это?

Пример фрагмента кода, который отправляет пакет входа в систему, был бы изумителен.

Спасибо.


person Jack    schedule 01.03.2012    source источник


Ответы (1)


Я запущу мяч:

import socket
import struct

username = "username_value"
verification_key = "verification_key"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # boilerplate
s.connect(("example.com", 1234))  # adjust accordingly

# now for the packet
# note that the String type is specified as having a length of 64, we'll pad that

packet = ""

packet += struct.pack("B", 1)  # packet type
packet += struct.pack("B", 7)  # protocol version
packet += "%-64s" % username  # magic!
packet += "%-64s" % verification_key
packet += struct.pack("B", 0)  # that unused byte, assuming a NULL byte here

# send what we've crafted
s.send(packet)

«%-20s» могут показаться вам странными, если вы никогда не использовали строки формата. По сути..

print "%s" % 5

.. распечатает 5 ..

print "%10s" % 5

.. дополнит вывод шириной ровно 10 символов. Но он заполняет их с правой стороны, мы хотим, чтобы это заполнение было слева - отсюда и - ..

print "%-10s" % s, "<this will be 9 spaces away from the '5'>"

.. поиграйте с этим.

Если что-то непонятно, дайте мне знать. Мне нравится то, что ты делаешь, это напоминает мне мой старый проект. За исключением того, что у меня не было четкой спецификации протокола, как у тебя, счастливый ублюдок. ;)

person ntl0ve    schedule 01.03.2012
comment
Большое спасибо за это! Это именно то, что я хотел, не мог бы быть более полезным. - person Jack; 01.03.2012
comment
Здравствуйте, не могли бы вы мне помочь? Когда я пытаюсь подключиться к MC Classic Server, он выдает ответ об ошибке Incompatible client, or a network error.. Что я должен делать? - person JadedTuna; 20.08.2013