mafia-tools v1.0.1
Mafia Tools
Этот репозиторий не поддерживается, потому что я не мазохист, если вам очень надо то вы сами все найдете и сделаете.
Враппер API для игры Мафия Онлайн
Небольшое введение
Сэкономьте себе нервы и удалите эту игру. Ее автор говнокодер и он не обновлял ее уже 2 года. Просто установите другую мафию.
Если вам все же нравится себя мучать, то приготовьтесь к:
- Бесконечным угадайкам, что делает конкретный запрос
- Часам чтения говнокода от вована из декомпилированного apk
- Рандомным ограничениям их-за слишком большого кол-ва запросов
Если вы хотите продолжить мою работу, делайте форк этого репозитория и пишите враппер дальше.
Еще полезно знать вот что:
- Все запросы делаются на единый ip адрес по разным портам
- Регистрация и выход из аккаунта по протоколу http, авторизация и большинство игровых запросов через tcp сокет
- Это худшее апи что вы вообще использовали
- После отправки своего тела запроса необходимо добавить \n (перенос строки)
- В теле ответа скорее всего может содержаться символ \0 означающий конец данных, но далеко не всегда
- Используйте модуль json-split-stream
- Иногда между конкатенированными блоками будут символы
p
или,
- Иногда сервер кидает в тебя случайные куски непонятной информации в недоjson, их надо игнорировать
- Сокет надо создать один раз и через него общаться с сервером не отключаясь
- Некоторые запросы делаются с ключом "t" и токеном, а некоторые — без
- Вован вам не ответит, Зак вам не поможет, а я вас забаню пермачом везде за любое упоминание этого кошмарного апи
- Активная сессия может быть лишь одна. С телефона и консоли одновременно сидеть в игре не получится, создавайте новый акк для бота.
Установка
$ npm i mafia-tools
$ yarn add mafia-tools
Пример использования
import MafiaAPI from 'mafia-tools'
const email = 'gadza1488@xn--80afem4h.online',
password = 'MD5-соль пароля, можете посмотреть алгоритм генерации в декомпилированном апк'
let api = new MafiaAPI()
await api.init({ email, password })
await api.loginWithEmailPassword()
console.log('Новый токен:', api.token);
let user = await api.getMe()
console.log('Имя:', user.getName())
console.log('Опыт:', user.getExperience(), 'Уровень:', user.getLevel())
console.log('Репутация:', user.getReputation())
console.log('Сыгранные игры:', user.getPlayedGames())
console.log('Язык:', user.getLocale())
console.log('Пол:', user.isMale() ? 'Мужской' : 'Женский');
Документация
Методы, что я успел реализовать
async api.init(email:string, password:string)
Создает сокет, подключается к апи мафии и сохраняет почту и пароль внутрь экземлпяра класса MafiaAPI.
async api.init(userID:string, token:string)
Создает сокет, подключается к апи мафии и сохраняет userID и токен внутрь экземлпяра класса MafiaAPI.
async api.loginWithToken() : object
Создает новую сессию (таким образом удаляя старые) с помощью указанных в экземпляре класса MafiaAPI токена и userID. Полезно для пересоздания сессии будучи уже авторизованным (имея прошлый токен и userID)
Полученный токен автоматически записывается в экземляр класса MafiaAPI и используется для вызова последующих методов.
Возвращает ответ API.
async api.loginWithEmailPassword() : object
Создает новую сессию (таким образом удаляя старые) с помощью указанных в экземпляре класса MafiaAPI почты и соли пароля. Полезно для входа если вам лень сохранять прошлый токен. Соль как я понимаю не меняется, можно один раз залогиниться через официальное приложение и сохранить соль для использования через либу.
Полученный токен автоматически записывается в экземляр класса MafiaAPI и используется для вызова последующих методов.
Возвращает ответ API.
api.subscribeToChat(callback:function) : function
Вход в общий чат и подписывается на новые сообщения. Читать чат с аккаунта может лишь один сокет. Например, с телефона читать чат не получится, если тот же аккаунт в консоли читает его в данный момент. Первые 5 секунд апи присылает мусор, который автоматически игнорируется. Потом он начинает присылать обновления в лайв режиме.
Колбек функция вызывается с объектом m
. Если приходит обновление с несколькими сообщениями, колбек вызывается для каждого из сообщений. Подробнее про структуру передаваемого сообщения-объекта читайте здесь
Возвращает функцию для отписки от чата без аргументов, которую нужно вызвать для того, чтобы выйти из общего чата.
async api.sendToPublicChat(text:string) : object
Отсылает сообщение в общий чат. Работает только когда вы подписались на сообщения (вошли в чат).
‼️ Работает лишь один раз ‼️ После вызова рекомендуется перезапустить сервер, переподключиться к чату чтобы снова отсылать сообщения. После вызова этого метода бот все еще сможет читать чат в лайв-режиме через колбек функции subscribeToChat, однако второй и последующие вызовы метода не дадут результата, в чате не появится сообщений.
Ничего не возвращает и никогда не ресолвится, так как ответ уходит методу subscribeToChat. Не использовать с await!!!
class User
Класс пользователя, который строится из данных uu
в теле ответа. Подробнее о uu
Конструктор:
import User from 'mafia-tools/src/user'
const uuData = {
o: 'user_6126389717b7d4d0efdfgy',
up: 1629967964148,
u: 'gadzabot',
ph: '',
ex: 0,
nle: 100,
ple: 0,
l: 1,
a: 0,
g: 0,
mo: 0,
v: 0,
pg: 0,
sc: 0,
s: 0,
wc: 0,
wd: 0,
wm: 0,
wp: 0,
wlv: 0,
wk: 0,
wt: 0,
wj: 0,
wbg: 0,
wbr: 0,
wsp: 0,
wpr: 0,
wlw: 0,
wmr: 0,
wik: 0,
wim: 0,
wip: 0,
t: '[ваштокен]',
ac: 1,
r: 0,
slc: 'ru',
on: 1
}
new User(uuData)
user.getName() : string
Возвращает имя пользователя.
user.getExperience() : number
Возвращает опыт пользователя, который используется для определения уровня.
user.getLastOnlineDate() : Date
Возвращает дату последнего входа пользователя.
user.getLevel() : number
Возвращает уровень пользователя.
user.getReputation() : number
Возвращает авторитет пользователя.
user.getPlayedGames() : object
Возвращает объект с сыгранными играми пользователя.
{
overall: uuData.pg,
won: {
asMafia: uuData.wim,
asPeaceful: uuData.wip
},
was: {
mafia: uuData.wm,
comissar: uuData.wc,
doctor: uuData.wd,
prostitute: uuData.wlv,
terrorist: uuData.wt,
journalist: uuData.wj,
bodyguard: uuData.wbg,
barman: uuData.wbr,
spy: uuData.wsp,
peaceful: uuData.wp
}
}
user.getLocale() : string
Возвращает язык пользователя: RUS или ENG
user.isMale() : bool
Возвращает true если пользователь поставил мужской пол.
user.isFemale() : bool
Возвращает true если пользователь поставил женский пол.
user.getSex() : number
Возвращает номер пола пользователя (0 = муж, 1 = жен).
Предупреждение
⚠️ Я не даю НИКАКИХ ГАРАНТИЙ, что эта либа будет у вас работать. ⚠️ Но ее использовать проще чем самому разбираться с апи. Если вы все же хотите писать свой враппер, скачивайте netcapture на телефон и удачи вам.