Como subir um servidor próprio de MSN Messenger (Windows Live Messenger 2009) no Ubuntu
Nos últimos dias montei, do zero, um servidor próprio do protocolo MSN/WLM usando o projeto open-source Escargot. O objetivo era simples: ter um ambiente de testes na rede local, com contas próprias, sem depender do serviço público.
O caminho não foi linear. Python 3.12, bibliotecas antigas, autenticação SSO do WLM 2009 e certificado TLS geraram vários obstáculos. Abaixo está o passo a passo real — incluindo os ajustes que quase ninguém documenta.
O que é o Escargot?
O Escargot é um projeto que recria a infraestrutura do antigo MSN Messenger e Windows Live Messenger. O servidor é open-source (GitLab) e fala MSNP até a versão 18, o suficiente para o WLM 2009 (build 14.0.8117.0416), o cliente mais recente ainda suportado de forma estável.
Não é um “clone visual”: é o protocolo de verdade, com clientes originais da Microsoft patchados para apontar para o seu servidor.
Ambiente usado
- Ubuntu Server 24.04 LTS (teste em LAN)
- Python 3.12 + venv
- SQLite (padrão do projeto)
- Cliente: Windows Live Messenger 2009 (patchado)
- IP de exemplo: 192.168.1.106
Servidor
Instalação base
Atualização do sistema e instalação de pacotes necessários.
sudo apt update && sudo apt upgrade -y
sudo apt install -y git python3 python3-pip python3-venv python3-dev build-essential libssl-dev libffi-devClonagem do projeto
mkdir /msn && cd /msn
git clone https://gitlab.com/escargot-chat/server.git
cd server Ativação do ambiente virtual e instalação de dependencias
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pipObs.: O requirements.txt original puxa, entre outras coisas, sqlalchemy sem pin e um sqlaltery antigo via Git. Isso já anuncia problemas com Python moderno. Eu precisei fazer alguns ajustes nas dependências necessárias para rodar esse projeto, pois os pacotes originais, não tinham a versão necessária para o correto funcionamento e eu encontrei algumas incompatibilidades nas versões mais atuais. A seguir seguem todas as dependências e suas versões que estão rodando no meu servidor:
aiohappyeyeballs==2.7.1
aiohttp==3.14.3
aiosignal==1.4.0
alembic==1.4.3
ast_serialize==0.8.0
astroid==4.0.4
attrs==26.1.0
cffi==2.1.1
cryptography==50.0.0
devtls @ git+https://gitlab.com/valtron/devtls.git@777de1111839b64353c20c8045ec99139a5204f3
dill==0.4.1
docstring_parser==0.18.0
frozenlist==1.8.0
funcli==0.8.1
greenlet==3.5.5
HLL==1.3.1
idna==3.18
iniconfig==2.3.0
isort==8.0.1
Jinja2==3.1.6
librt==0.15.0
lxml==6.1.1
Mako==1.4.1
MarkupSafe==3.0.3
mccabe==0.7.0
multidict==6.7.1
mypy==2.3.0
mypy_extensions==1.1.0
packaging==26.3
pathspec==1.1.1
pillow==12.3.0
platformdirs==4.11.3
pluggy==1.6.0
propcache==0.5.2
pycparser==3.0
Pygments==2.20.0
pylint==4.0.7
pytest==9.1.1
python-dateutil==2.9.0.post0
python-editor==1.0.4
pytz==2026.3.post1
six==1.17.0
SQLAlchemy==1.3.24
sqlaltery @ git+https://gitlab.com/valtron/sqlaltery.git@f2b0a593bc313bba5725b582964c99a224d4a9c0
tomlkit==0.15.1
typing_extensions==4.16.0
yarl==1.24.5Após editar o arquivo requiriments.txt com as dependências acima, basta instala-las com:
pip install -r requirements.txtConfiguração local
Crie settings_local.py na raiz do projeto:
DEBUG = True
DEBUG_MSNP = True
DEBUG_HTTP_REQUEST = True
DEBUG_HTTP_REQUEST_FULL = True
TARGET_HOST = "m1.escargot.log1p.xyz"
LOGIN_HOST = "m1.escargot.log1p.xyz"
STORAGE_HOST = "m1.escargot.log1p.xyz"
ENABLE_FRONT_MSN = TrueO nome m1.escargot.log1p.xyz não precisa existir na internet. Ele será resolvido via arquivo hosts no Windows do cliente. Usar só o IP costuma quebrar o TLS (SNI / domain is None no devtls).
Banco de dados — o primeiro obstáculo real
No Python 3.12 + SQLAlchemy 2.x isso quebra de várias formas:
- ValueError: can't find Table 't_user' no sqlaltery
- conflitos com Alembic
- incompatibilidades de API
Workaround que funcionou: deixar o create_all() criar o schema final e marcar as migrations como aplicadas manualmente, sem rodar o motor antigo de reverse do sqlaltery.
Em resumo, o dbcreate.py foi adaptado para:
- Criar as tabelas com db.Base.metadata.create_all
- Inserir registro fake em sqlaltery_migration (revision 9)
- Criar também o banco de stats
O script adaptado ficou da seguinte forma:
from core import db, stats
from core.conn import Conn
import settings
def main() -> None:
create_dbs()
def create_dbs() -> None:
conn_db = Conn(settings.DB)
db.Base.metadata.create_all(conn_db.engine)
# Workaround para o bug do sqlaltery no Python 3.12
with conn_db.engine.begin() as conn:
conn.execute("""
CREATE TABLE IF NOT EXISTS sqlaltery_migration (
"order" INTEGER NOT NULL,
revision INTEGER NOT NULL,
date_applied DATETIME NOT NULL
)
""")
conn.execute("""
INSERT INTO sqlaltery_migration ("order", revision, date_applied)
VALUES (0, 9, CURRENT_TIMESTAMP)
""")
conn_stats = Conn(settings.STATS_DB)
stats.Base.metadata.create_all(conn_stats.engine)
if __name__ == '__main__':
main()Depois disso, crie o banco e as contas de teste com senha 123456
export PYTHONPATH=".:$PYTHONPATH"
python script/dbcreate.py
python script/dummydata.pyContas de teste
Email Username Nome de exibição
tle@example.com t1e T1e
t2e@example.com t2e T2e
t3e@example.com t3e T3e
t4e@example.com t4e T4e
t5e@example.com t5e T5e
tly@yahoo.com tly T1y
t2y@yahoo.com t2y T2y
t3y@yahoo.com t3y T3y
t4y@yahoo.com t4y T4y
t5y@yahoo.com t5y T5y
t1h@hotmail.com t1h T1h
t2h@hotmail.com t2h T2h
t3h@hotmail.com t3h T3h
t4h@hotmail.com t4h T4h
t5h@hotmail.com t5h T5h
t1l@live.com t1 T1l
t2l@live.com t2l T2l
t3l@live.com t3l T3l
t4l@live.com t4l T4l
t5l@live.com t5 T5l Contas de bot
Email Username Nome de exibição
bot0@bot.log1p.xyz bot0 Bot0
bot1@bot.log1p.xyz bot1 Bot1
bot2@bot.log1p.xyz bot2 Bot2
bot3@bot.log1p.xyz bot3 Bot3
bot4@bot.log1p.xyz bot4 Bot4 Subir o servidor (modo dev)
export PYTHONPATH=".:$PYTHONPATH"
python devNa primeira execução o devtls gera:
./.devtls_cache/DO_NOT_TRUST_DevTLS_Escargot.crt
Esse certificado precisa ser instalado no Windows do cliente como Autoridade de Certificação Raiz Confiáveis (máquina local). Só no servidor Ubuntu não basta.
Instale o certificado
# Copia o certificado para o local de confiança do sistema
cp .devtls_cache/DO_NOT_TRUST_DevTLS_Escargot.crt /usr/local/share/ca-certificates/DO_NOT_TRUST_DevTLS_Escargot.crt
# Atualiza a lista de certificados
sudo update-ca-certificatesPortas que sobem:
- 80 (HTTP/HTTPS dos serviços web)
- 1863 / 1864 (MSNP)
- 4308
Para teste, o firewall pode ficar desligado:
sudo ufw disableInicie o servidor novamente
export PYTHONPATH=".:$PYTHONPATH"
python devObservações:
- Os SyntaxWarning que apareceram são só avisos (código antigo usando is em vez de ==). Não impedem o funcionamento.
- O certificado expira em 30 dias. Depois desse prazo o devtls vai gerar outro e você terá que instalar de novo.
Veja as linhas importantes no final:
Serving on 0.0.0.0:80
Serving on 0.0.0.0:1863
Serving on 0.0.0.0:1864
Serving on 0.0.0.0:4308Isso significa que ele está escutando nas portas principais do MSN Messenger.
Serviço em segundo plano (systemd)
Para não depender de terminal aberto:
Cria o arquivo /etc/systemd/system/escargot.service e adicione o seguinte
[Unit]
Description=Escargot Chat Server
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/msn/server
Environment=PYTHONPATH=/msn/server
ExecStart=/msn/server/venv/bin/python -m dev
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.targetReiniciar o daemon, habilitar o inicio do serviço junto com o sistema, verificar status do serviço e acompanhar logs em tempo real
systemctl daemon-reload
systemctl enable --now escargot
systemctl status escargot
journalctl -u escargot -fCliente: WLM 2009
- Baixe a versão patchada no site do Escargot
- Instale (desinstale Windows Essentials mais novos, se houver conflito)
- Ajuste os .ini:
C:\Program Files (x86)\Windows Live\Messenger\msnmsgr.exe-escargot.ini
C:\Program Files (x86)\Windows Live\Contacts\wlcomm.exe-escargot.iniSubstitua pelo seguinte conteúdo
[options]
type=msn
server=m1.escargot.log1p.xyzO segundo arquivo (wlcomm) é crítico: o Address Book do 2009 passa por ele. Sem isso, o login pode autenticar e ainda assim falhar ao carregar contatos (erro do tipo 84cc0020).
Hosts no Windows
No cliente, abra o arquivo "C:\Windows\System32\drivers\etc\hosts" com o bloco de notas como administrador e cole as seguintes linhas no final do arquivo. Não esqueça de substituir pelo IP do seu servidor.
192.168.1.106 m1.escargot.log1p.xyz
192.168.1.106 msnmsgr.escargot.chat
192.168.1.106 conf.escargot.chat
192.168.1.106 login.live.com
192.168.1.106 login.microsoft.com
192.168.1.106 login.passport.com
192.168.1.106 nexus.passport.com
192.168.1.106 messenger.hotmail.com
192.168.1.106 gateway.messenger.hotmail.com
192.168.1.106 byrdr.omega.contacts.msn.com
192.168.1.106 config.messenger.msn.com
192.168.1.106 tkrdr.storage.msn.com
192.168.1.106 ows.messenger.msn.com
192.168.1.106 rsi.hotmail.com
192.168.1.106 muser.messenger.hotmail.comSem isso, o fluxo SSO do WLM 2009 não completa (erros como 80048820).
Instalar o certificado no Windows do cliente (muito importante)
O certificado que o servidor gerou precisa estar confiado no PC que está rodando o WLM, não só no Ubuntu.
No servidor Ubuntu, copie o certificado para o Windows (pode usar pendrive, SCP, etc.):
# No servidor
ls -l .devtls_cache/DO_NOT_TRUST_DevTLS_Escargot.crtNo Windows:
- Clique duas vezes no arquivo .crt
- Clique em Instalar Certificado...
- Escolha Máquina Local (Local Machine)
- Selecione Colocar todos os certificados no repositório a seguir
- Clique em Procurar → escolha Autoridades de Certificação Raiz Confiáveis
- Finalize
Instale o Flash Player
Para poder reproduzir os winks (figurinhas animadas parecidas com gifs) é necessário o Flash Player 10
Fluxo de login que realmente importa
No log do servidor, o caminho saudável parece com:
- VER / CVR (negociação de protocolo)
- USR 3 SSO I → desafio MBI_KEY_OLD
- USR 4 SSO S ... → USR 4 OK
- Requisições SOAP em /abservice/... (lista de contatos)
Se parar no passo 2 (dis logo após o desafio), o problema é quase sempre certificado ou hosts. Se passar do USR 4 OK e cair depois, o foco é Address Book (wlcomm + abservice).
Observação útil: MSN 7.5 é bem mais tolerante e serve como diagnóstico. Se o 7.5 entra e o 2009 não, o core do servidor está ok — o gargalo é o SSO/AB do 2009.
Lições práticas
- Python 3.12 + código de 2017–2020 exige gambiarra. Pin de dependências e patches pontuais são regra, não exceção.
- WLM 2009 não é “só apontar o IP”. SSO, certificado e Address Book são partes separadas do problema.
- Certificado no cliente Windows é obrigatório no modo devtls.
- Nome de host estável > IP puro para TLS/SNI.
- Teste com cliente mais antigo antes de culpar o servidor inteiro.
- Em produção de verdade: usuário não-root, HTTPS real, backup do SQLite e revisão de exposição de portas.
Conclusão
Subir o Escargot em Ubuntu é viável e didático: você revê MSNP, autenticação legada, SOAP de Address Book e os efeitos colaterais de rodar software antigo em stack moderna.
Para uso casual, o serviço público do Escargot continua sendo o caminho mais simples. Para laboratório, nostalgia controlada ou estudo de protocolos, montar o próprio servidor ainda vale o esforço — desde que se documente os pontos que quebram no caminho.
Se alguém estiver tentando o mesmo setup e travar em t_user, 80048820, 84cc0020 ou HLL/stats, os sintomas acima costumam apontar a região certa do problema.
Projeto: gitlab.com/escargot-chat/server · Cliente recomendado: WLM 2009 patchado · Ambiente de teste: Ubuntu + LAN
Comentários
Postar um comentário