import socket
import time
HOST = 'tasks.duckerz.ru'
PORT = 30009
def probe(payload, description):
"""Отправляет payload и возвращает ответ сервера."""
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(10.0)
try:
s.connect((HOST, PORT))
# Читаем до "Send to Bob:"
data = b""
while b"Send to Bob:" not in data:
chunk = s.recv(4096)
if not chunk:
break
data += chunk
# Отправляем
s.sendall(payload)
# Читаем ответ 3 секунды
s.settimeout(3.0)
resp = b""
try:
while True:
chunk = s.recv(4096)
if not chunk:
resp += b"<CONNECTION_CLOSED>"
break
resp += chunk
except socket.timeout:
resp += b"<TIMEOUT>"
return resp.decode('utf-8', errors='ignore')
except Exception as e:
return f"EXCEPTION: {e}"
finally:
s.close()
# Список запросов для тестирования (по одному за раз!)
probes = [
(b"\n", "Пустая строка"),
(b"{}\n", "Пустой JSON"),
(b'{"test": 1}\n', "Неизвестный ключ test"),
(b'{"answer": 0}\n', "answer = 0"),
(b'{"answer": 1}\n', "answer = 1"),
(b'{"answer": "hello"}\n', "answer = строка"),
(b'{"answer": null}\n', "answer = null"),
(b'{"answer": [1,2,3]}\n', "answer = массив"),
(b'{"answer": {"x": 1}}\n', "answer = объект"),
(b'{"C": 1}\n', "C = 1"),
(b'{"B": 1}\n', "B = 1"),
(b'[]\n', "Массив вместо объекта"),
(b'"hello"\n', "Просто строка"),
(b'12345\n', "Просто число"),
(b'garbage\n', "Мусор"),
(b'{"answer": 1, "extra": 2}\n', "answer + лишний ключ"),
]
print("[*] Разведка сервера. Пауза 15 секунд между запросами.\n")
for payload, desc in probes:
print(f"=== {desc} ===")
print(f"Отправляем: {payload}")
resp = probe(payload, desc)
print(f"Ответ: {repr(resp)}")
print()
time.sleep(15)
print("[*] Разведка завершена.")