mafia-tools

API игры Мафия Онлайн на Node.JS с поддержкой ES6 и Promise

Usage no npm install needed!

<script type="module">
  import mafiaTools from 'https://cdn.skypack.dev/mafia-tools';
</script>

README

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 на телефон и удачи вам.