npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

fpapijs

v1.1.0

Published

Полнофункциональный Node.js модуль для работы с FunPay API - полный порт Python библиотеки FunPayAPI

Downloads

1,082

Readme

FPAPIjs

Полнофункциональный Node.js модуль для работы с FunPay API - полный порт Python библиотеки FunPayAPI.

npm version Node.js License

Описание

FPAPIjs - это полнофункциональный Node.js модуль для работы с FunPay. Модуль позволяет:

  • ✅ Работать с аккаунтом FunPay
  • ✅ Управлять чатами и сообщениями
  • ✅ Обрабатывать заказы
  • ✅ Управлять лотами (создание, редактирование, удаление)
  • ✅ Получать события в реальном времени через Runner
  • ✅ Работать с отзывами
  • ✅ Выполнять финансовые операции (вывод средств, возвраты)
  • ✅ И многое другое

Модуль автоматически обрабатывает сетевые ошибки, ошибки 429 (Too Many Requests) и поддерживает бесконечные попытки повторного подключения при потере соединения с FunPay.

Содержание

Установка

Локальная установка (для разработки)

npm i

Установка из npm (после публикации)

npm i fpapijs

Зависимости

  • axios - для HTTP запросов
  • cheerio - для парсинга HTML
  • form-data - для работы с формами
  • socks-proxy-agent - для поддержки SOCKS4 и SOCKS5 прокси
  • https-proxy-agent - для поддержки HTTPS прокси
  • http-proxy-agent - для поддержки HTTP прокси

Быстрый старт

const { Account, enums } = require('fpapijs'); // или require('./index') для локальной разработки
const { Currency } = enums;

// Создание аккаунта (без прокси для локального использования)
const account = new Account('your_golden_key', 'your_user_agent');

// Создание аккаунта с прокси (рекомендуется для серверов)
// const account = new Account(
//     'your_golden_key',
//     null,  // userAgent по умолчанию
//     10,    // timeout
//     'socks5://username:[email protected]:1080'  // прокси (опционально)
// );

// Инициализация
await account.get();

console.log(`Аккаунт: ${account.username} (ID: ${account.id})`);
console.log(`Баланс: ${account.total_balance} ${Currency.toString(account.currency)}`);

<|tool▁call▁begin|> read_lints

Основные классы

Модуль экспортирует следующие классы и объекты:

const {
    Account,      // Основной класс для работы с API
    Runner,       // Класс для получения событий в реальном времени
    events,       // Классы событий
    exceptions,   // Классы исключений
    utils,        // Утилиты
    enums,        // Перечисления (EventTypes, MessageTypes, Currency и т.д.)
    types         // Типы данных (Chat, Order, Lot и т.д.)
} = require('./index');

Account - Основной класс

Инициализация и настройка

Конструктор

const account = new Account(
    goldenKey,        // string - токен (golden_key) аккаунта (обязательно)
    userAgent,        // string|null - user-agent браузера (опционально)
    requestsTimeout,  // number - тайм-аут запросов в секундах (по умолчанию: 10)
    proxy,           // string|object|null - прокси для запросов (опционально)
    locale           // string|null - локаль ("ru", "en", "uk") (опционально)
);

Параметр proxy (опциональный):

Прокси можно указать в двух форматах. Поддерживаются типы: HTTP, HTTPS, SOCKS4, SOCKS5.

  1. Строковый формат (URL):

    • "http://user:pass@host:port" - HTTP прокси
    • "https://user:pass@host:port" - HTTPS прокси
    • "socks4://user:pass@host:port" - SOCKS4 прокси
    • "socks5://user:pass@host:port" - SOCKS5 прокси
    • Без аутентификации: "http://host:port", "socks5://host:port" и т.д.
  2. Объектный формат:

    {
        type: 'http' | 'https' | 'socks4' | 'socks5',  // тип прокси (обязательно)
        host: string,                                   // хост прокси (обязательно)
        port: number,                                   // порт прокси (обязательно)
        auth: {                                         // аутентификация (опционально)
            username: string,
            password: string
        }
    }

Примеры использования прокси:

// HTTP прокси (строковый формат)
const account = new Account(
    'your-golden-key-here',
    null,
    10,
    'http://username:[email protected]:8080',
    'ru'
);

// HTTPS прокси (строковый формат)
const account = new Account(
    'your-golden-key-here',
    null,
    10,
    'https://proxy.example.com:8080',
    'ru'
);

// SOCKS5 прокси (строковый формат)
const account = new Account(
    'your-golden-key-here',
    null,
    10,
    'socks5://username:[email protected]:1080',
    'ru'
);

// SOCKS4 прокси (строковый формат)
const account = new Account(
    'your-golden-key-here',
    null,
    10,
    'socks4://proxy.example.com:1080',
    'ru'
);

// Объектный формат
const account = new Account(
    'your-golden-key-here',
    null,
    10,
    {
        type: 'socks5',
        host: 'proxy.example.com',
        port: 1080,
        auth: {
            username: 'myuser',
            password: 'mypass'
        }
    },
    'ru'
);

// Без прокси (для локального использования)
const account = new Account(
    'your-golden-key-here',
    null,
    10,
    null,  // без прокси
    'ru'
);

Важно: Использование прокси особенно важно при работе на серверах, так как IP-адрес сервера может быть заблокирован на FunPay. Через прокси весь трафик к FunPay будет идти через указанный прокси-сервер.

Геттеры и сеттеры

// Локаль
account.locale = 'ru';  // Установить локаль
const locale = account.locale;  // Получить текущую локаль

// Проверка инициализации
const isInitiated = account.is_initiated;  // boolean

// Символы бота
const botChar = account.bot_character;  // string
const oldBotChar = account.old_bot_character;  // string

// Категории и подкатегории
const categories = account.categories;  // Array<Category>
const subcategories = account.subcategories;  // Array<SubCategory>

Работа с аккаунтом

get(updatePhpsessid = true)

Получает/обновляет данные об аккаунте. Необходимо вызывать каждые 40-60 минут для обновления phpsessid.

await account.get();
console.log(`Имя: ${account.username}`);
console.log(`ID: ${account.id}`);
console.log(`Баланс: ${account.total_balance}`);
console.log(`Валюта: ${Currency.toString(account.currency)}`);
console.log(`Активные продажи: ${account.active_sales}`);
console.log(`Активные покупки: ${account.active_purchases}`);

logout()

Выходит с аккаунта FunPay.

await account.logout();

Работа с категориями и подкатегориями

getCategory(categoryId)

Получает категорию по ID.

const category = account.getCategory(754);
console.log(`Категория: ${category.name}`);

getSubcategory(subcategoryType, subcategoryId)

Получает подкатегорию по типу и ID.

const subcategory = account.getSubcategory(SubCategoryTypes.COMMON, 3486);
console.log(`Подкатегория: ${subcategory.name}`);

getSortedCategories()

Возвращает отсортированные категории.

const sortedCategories = account.getSortedCategories();

getSortedSubcategories()

Возвращает отсортированные подкатегории.

const sortedSubcategories = account.getSortedSubcategories();

Работа с чатами

requestChats()

Запрашивает список чатов с сервера.

const chats = await account.requestChats();
console.log(`Найдено чатов: ${chats.length}`);
chats.forEach(chat => {
    console.log(`- ${chat.name} (ID: ${chat.id})`);
});

getChats(update = false)

Получает сохраненные чаты. Если update = true, сначала запрашивает с сервера.

const chats = await account.getChats(true);

addChats(chats)

Добавляет чаты в кэш.

const chats = await account.requestChats();
account.addChats(chats);

getChatByName(name)

Получает чат по имени.

const chat = await account.getChatByName('ExampleUser');
if (chat) {
    console.log(`Чат найден: ${chat.id}`);
}

getChatById(chatId)

Получает чат по ID.

const chat = await account.getChatById(123456789);

getChat(chatId, withHistory = true, locale = null)

Получает полную информацию о чате.

const chat = await account.getChat(123456789, true);
console.log(`Чат: ${chat.name}`);
console.log(`Сообщений в истории: ${chat.messages.length}`);

getChatHistory(chatId, lastMessageId, interlocutorUsername, fromId)

Получает историю сообщений чата.

const messages = await account.getChatHistory(123456789, 99999999999999999999999);
messages.forEach(msg => {
    console.log(`${msg.author}: ${msg.text}`);
});

getChatsHistories(chatsData)

Получает истории для нескольких чатов.

const chats = await account.getChats();
const histories = await account.getChatsHistories(chats);

Account.chatIdPrivate(chatId) (статический метод)

Проверяет, является ли ID чата приватным.

const isPrivate = Account.chatIdPrivate(123456789);  // true
const isPrivate2 = Account.chatIdPrivate('users-123-456');  // true

Работа с сообщениями

sendMessage(chatId, text, chatName, interlocutorId, imageId, addToIgnoreList, updateLastSavedMessage, leaveAsUnread)

Отправляет текстовое сообщение в чат.

const message = await account.sendMessage(
    123456789,                    // chatId
    'Привет! Это тестовое сообщение',  // text
    'ExampleUser',                // chatName (опционально)
    null,                        // interlocutorId (опционально)
    null,                        // imageId (опционально)
    true,                        // addToIgnoreList
    false,                       // updateLastSavedMessage
    false                        // leaveAsUnread
);
console.log(`Сообщение отправлено: ID ${message.id}`);

uploadImage(image, type = "chat")

Загружает изображение на сервер FunPay.

const fs = require('fs');
const imageBuffer = fs.readFileSync('image.png');
const imageId = await account.uploadImage(imageBuffer, 'chat');
console.log(`Изображение загружено: ID ${imageId}`);

sendImage(chatId, image, chatName, interlocutorId, addToIgnoreList, updateLastSavedMessage, leaveAsUnread)

Отправляет изображение в чат.

const fs = require('fs');
const imageBuffer = fs.readFileSync('image.png');
const message = await account.sendImage(123456789, imageBuffer);
console.log(`Изображение отправлено: ID ${message.id}`);

Работа с заказами

getSales(startFrom, includePaid, includeClosed, includeRefunded, excludeIds, orderId, buyer, state, game, section, server, side, locale, subcategories, ...moreFilters)

Получает список продаж (заказов, где вы продавец).

const [nextOrderId, orders, locale, subcategories] = await account.getSales(
    null,      // startFrom - ID заказа для начала списка
    true,      // includePaid - включать оплаченные
    true,      // includeClosed - включать закрытые
    true,      // includeRefunded - включать возвращенные
    [],        // excludeIds - исключить заказы с этими ID
    null,      // orderId - получить конкретный заказ
    null,      // buyer - фильтр по покупателю
    null,      // state - фильтр по статусу
    null,      // game - фильтр по игре
    null,      // section - фильтр по секции
    null,      // server - фильтр по серверу
    null,      // side - фильтр по стороне
    'ru',      // locale
    null       // subcategories
);

console.log(`Найдено заказов: ${orders.length}`);
orders.forEach(order => {
    console.log(`- ${order.id}: ${order.description}, ${order.price} ${Currency.toString(order.currency)}`);
});

getOrder(orderId, locale = null)

Получает полную информацию о заказе.

const order = await account.getOrder('ABC12345', 'ru');
console.log(`Заказ: ${order.id}`);
console.log(`Статус: ${order.status}`);
console.log(`Сумма: ${order.price} ${Currency.toString(order.currency)}`);
console.log(`Покупатель: ${order.buyer.username} (ID: ${order.buyer.id})`);
console.log(`Продавец: ${order.seller.username} (ID: ${order.seller.id})`);
if (order.review) {
    console.log(`Отзыв: ${order.review.stars} звезд`);
}

getOrderShortcut(orderId)

Получает краткую информацию о заказе (только для продаж).

const orderShortcut = await account.getOrderShortcut('ABC12345');
console.log(`Заказ: ${orderShortcut.id}`);

getSells(...) (устаревший метод)

Устаревший метод. Используйте getSales().

Работа с лотами

getSubcategoryPublicLots(subcategoryType, subcategoryId, locale = null)

Получает публичные лоты подкатегории.

const lots = await account.getSubcategoryPublicLots(
    SubCategoryTypes.COMMON,
    3486,
    'ru'
);
console.log(`Найдено лотов: ${lots.length}`);
lots.forEach(lot => {
    console.log(`- ${lot.description} (ID: ${lot.id})`);
    console.log(`  Цена: ${lot.price} ${Currency.toString(lot.currency)}`);
});

getMySubcategoryLots(subcategoryId, locale = null)

Получает ваши лоты в подкатегории (как продавец).

const myLots = await account.getMySubcategoryLots(3486, 'ru');
console.log(`Моих лотов: ${myLots.length}`);
myLots.forEach(lot => {
    console.log(`- ${lot.description} (ID: ${lot.id})`);
    console.log(`  Цена: ${lot.price} ${Currency.toString(lot.currency)}`);
    console.log(`  Активен: ${lot.active}`);
    console.log(`  Автовыдача: ${lot.auto}`);
});

getMyLotCategories(userId = null, locale = null)

Получает все категории, где у пользователя есть лоты. Оптимизированный метод - получает список категорий напрямую со страницы профиля пользователя (users/{userId}/), без проверки всех подкатегорий на FunPay.

const categories = await account.getMyLotCategories();
console.log(`Категорий с лотами: ${categories.length}`);
categories.forEach(catData => {
    console.log(`Категория: ${catData.category.name}`);
    catData.subcategories.forEach(subcat => {
        console.log(`  Подкатегория: ${subcat.name}`);
    });
});

Примечание: Метод парсит страницу профиля пользователя, находит блок div.mb20 со списком категорий, извлекает ссылки на категории (например, /lots/1086/) и получает все лоты из каждой категории через страницу редактирования (/lots/{id}/trade). Это значительно быстрее, чем проверка всех подкатегорий на FunPay.

getAllMyLots(userId = null, locale = null)

Получает все ваши лоты из всех категорий (включая неактивные). Оптимизированный метод - получает лоты напрямую со страницы профиля пользователя.

const allMyLots = await account.getAllMyLots();
console.log(`Всего моих лотов: ${allMyLots.length}`);
allMyLots.forEach(lot => {
    console.log(`- ${lot.description} (ID: ${lot.id})`);
    console.log(`  Активен: ${lot.active ? 'Да' : 'Нет'}`);
    console.log(`  Цена: ${lot.price} ${lot.currency || 'RUB'}`);
});

Примечание: Метод получает все лоты (активные и неактивные) из всех категорий пользователя. Неактивные лоты определяются по наличию класса warning в элементе лота на странице редактирования.

getLotPage(lotId, locale = null)

Получает полную информацию о странице лота.

const lotPage = await account.getLotPage(12345678, 'ru');
console.log(`Лот: ${lotPage.description}`);
console.log(`Продавец: ${lotPage.seller.username} (ID: ${lotPage.seller.id})`);
console.log(`Изображений: ${lotPage.images.length}`);

getLotFields(lotId)

Получает поля лота для редактирования.

const lotFields = await account.getLotFields(12345678);
console.log(`Название RU: ${lotFields.title_ru}`);
console.log(`Название EN: ${lotFields.title_en}`);
console.log(`Цена: ${lotFields.price}`);
console.log(`Количество: ${lotFields.amount}`);
console.log(`Активен: ${lotFields.active}`);
console.log(`Автовыдача: ${lotFields.auto_delivery}`);

getPageData(url, locale = null)

Универсальный метод для получения всех данных со страницы (классы, data-атрибуты, формы, ссылки, изображения, meta-теги).

const pageData = await account.getPageData('lots/offer?id=12345678', 'ru');

// Структура возвращаемых данных:
console.log(pageData.html);                    // HTML код страницы
console.log(pageData.url);                     // URL страницы
console.log(pageData.elementsByClass);         // Объект {className: [элементы]}
console.log(pageData.dataAttributes);          // Объект {dataAttr: [элементы]}
console.log(pageData.forms);                  // Массив форм
console.log(pageData.links);                   // Массив ссылок
console.log(pageData.images);                  // Массив изображений
console.log(pageData.metaTags);                // Массив meta-тегов

// Примеры использования:
// Получить все элементы с классом "offer-title"
const offerTitles = pageData.elementsByClass['offer-title'] || [];

// Получить все элементы с data-атрибутом "offer-id"
const offerIds = pageData.dataAttributes['data-offer-id'] || [];

// Получить все формы на странице
pageData.forms.forEach(form => {
    console.log(`Форма: ${form.action}, метод: ${form.method}`);
});

// Получить все ссылки
pageData.links.forEach(link => {
    console.log(`Ссылка: ${link.href}, текст: ${link.text}`);
});

calc(subcategoryType, subcategoryId = null, gameId = null, price = 1000)

Вычисляет стоимость лота с учетом комиссий.

const calcResult = await account.calc(
    SubCategoryTypes.COMMON,
    3486,
    null,
    1000
);
console.log(`Методов оплаты: ${calcResult.methods.length}`);
calcResult.methods.forEach(method => {
    console.log(`${method.name}: ${method.price} ${Currency.toString(method.currency)}`);
});

Работа с пользователями

getUser(userId, locale = null)

Получает профиль пользователя.

const userProfile = await account.getUser(1234567, 'ru');
console.log(`Пользователь: ${userProfile.username}`);
console.log(`Онлайн: ${userProfile.online}`);
console.log(`Забанен: ${userProfile.banned}`);
console.log(`Рейтинг: ${userProfile.rating}`);  // число от 0 до 5 (например, 3.4) или null
console.log(`Отзывов: ${userProfile.reviews_count}`);  // число (например, 7) или null
console.log(`Лотов: ${userProfile.getLots().length}`);

getAccountRating(userId = null, locale = null)

Получает рейтинг аккаунта (продавца). Если userId не указан, используется ID текущего аккаунта.

// Получить рейтинг текущего аккаунта
const rating = await account.getAccountRating();
console.log(`Рейтинг: ${rating.rating}`);  // число от 0 до 5 (например, 3.4)
console.log(`Отзывов: ${rating.reviews_count}`);  // число (например, 7)

// Получить рейтинг другого пользователя
const otherRating = await account.getAccountRating(1234567);
console.log(`Рейтинг пользователя: ${otherRating.rating}`);  // число

getBuyerViewing(buyerId)

Получает информацию о том, какой лот просматривает покупатель (например, при получении заказа).

// Получить информацию о просмотре покупателя
const buyerViewing = await account.getBuyerViewing(1234567);
if (buyerViewing) {
    console.log(`Покупатель просматривает: ${buyerViewing.text}`);
    console.log(`Ссылка: ${buyerViewing.link}`);
    console.log(`ID покупателя: ${buyerViewing.buyer_id}`);
} else {
    console.log('Информация о просмотре недоступна');
}

Работа с отзывами

sendReview(orderId, text, rating = 5)

Отправляет/редактирует отзыв на заказ.

await account.sendReview('ABC12345', 'Отличный продавец!', 5);

deleteReview(orderId)

Удаляет отзыв на заказ.

await account.deleteReview('ABC12345');

Финансовые операции

getBalance(lotId)

Получает информацию о балансе пользователя (используется ID любого лота).

const balance = await account.getBalance(12345678);
console.log(`RUB: ${balance.available_rub}/${balance.total_rub}`);
console.log(`USD: ${balance.available_usd}/${balance.total_usd}`);
console.log(`EUR: ${balance.available_eur}/${balance.total_eur}`);

refund(orderId)

Возвращает средства по заказу.

await account.refund('ABC12345');

withdraw(currency, wallet, amount, address)

Выводит средства с аккаунта.

await account.withdraw(
    Currency.RUB,      // currency
    Wallet.QIWI,       // wallet
    1000,              // amount
    '+79991234567'     // address
);

getExchangeRate(currency)

Получает курс обмена текущей валюты аккаунта на переданную.

const [rate, newCurrency] = await account.getExchangeRate(Currency.USD);
console.log(`Курс обмена: ${rate}`);

Управление лотами

getChipFields(subcategoryId)

Получает поля чипа (валютного лота) для редактирования.

const chipFields = await account.getChipFields(1);
console.log(`Game ID: ${chipFields.game_id}`);
console.log(`Min sum: ${chipFields.min_sum}`);

saveLot(lotFields)

Сохраняет/создает лот.

const { LotFields } = require('./index').types;
const { Currency, SubCategoryTypes } = require('./index').enums;

// Получаем подкатегорию
const subcategory = account.getSubcategory(SubCategoryTypes.COMMON, 3486);

// Создаем новый лот (lot_id = 0)
const newLot = new LotFields(
    0,  // 0 означает новый лот
    {
        "node_id": String(subcategory.id),
        "csrf_token": account.csrf_token,
        "fields[summary][ru]": "Название лота",
        "fields[summary][en]": "Lot title",
        "fields[desc][ru]": "Описание лота",
        "fields[desc][en]": "Lot description",
        "price": "1000",
        "amount": "1",
        "active": "on",
        "auto_delivery": "on",
        "deactivate_after_sale": "",
        "fields[images]": "",
        "secrets": ""
    },
    subcategory,
    Currency.RUB
);

// Обновляем поля
newLot.renewFields();

// Сохраняем лот
await account.saveLot(newLot);
console.log(`Лот создан: ID ${newLot.lot_id}`);

saveChip(chipFields)

Сохраняет/создает чип (валютный лот).

const { ChipFields } = require('./index').types;

// Получаем поля чипа
const chipFields = await account.getChipFields(1);

// Редактируем поля
chipFields.price = 1000;
chipFields.amount = 10;
chipFields.min_sum = 100;

// Обновляем поля перед сохранением
chipFields.renewFields();

// Сохраняем чип
await account.saveChip(chipFields);

deleteLot(lotId)

Удаляет лот.

await account.deleteLot(12345678);

updateLotPrice(lotId, newPrice)

Изменяет цену лота (упрощенный метод, не требует получения всех полей лота).

// Изменить цену лота на 1500
await account.updateLotPrice(12345678, 1500);

getRaiseModal(categoryId)

Получает модальную форму для поднятия лотов.

const modal = await account.getRaiseModal(754);

raiseLots(categoryId, subcategories = null, exclude = null)

Поднимает лоты категории.

await account.raiseLots(754, null, null);

Runner - Получение событий в реальном времени

Класс Runner позволяет получать события в реальном времени (новые сообщения, новые заказы и т.д.).

Важно: В версии 1.0.3 улучшена логика обработки новых сообщений. Runner теперь более точно определяет новые сообщения, используя node_msg_id из событий, что исключает обработку старых сообщений из других чатов.

Создание Runner

const { Runner } = require('./index');

const runner = new Runner(account);

Методы Runner

getUpdates()

Запрашивает обновления с сервера.

const updates = await runner.getUpdates();
console.log(`Объектов в обновлении: ${updates.objects.length}`);

parseUpdates(updates)

Парсит обновления и возвращает массив событий.

const updates = await runner.getUpdates();
const events = await runner.parseUpdates(updates);
events.forEach(event => {
    console.log(`Событие типа ${event.type}`);
});

getBuyerViewing(buyerId)

Получает информацию о том, какой лот просматривает покупатель (из кэша Runner).

// Получить информацию о просмотре покупателя из Runner
const buyerViewing = runner.getBuyerViewing(1234567);
if (buyerViewing) {
    console.log(`Покупатель просматривает: ${buyerViewing.text}`);
    console.log(`Ссылка: ${buyerViewing.link}`);
} else {
    console.log('Информация о просмотре недоступна');
}

Примечание: Runner автоматически обновляет информацию о просмотре покупателей при получении событий типа buyer_viewing из FunPay.

listen(requestsDelay = 6.0, ignoreExceptions = false)

Генератор событий в реальном времени. Возвращает асинхронный генератор.

Особенности:

  • Автоматически обрабатывает сетевые ошибки с бесконечными попытками переподключения
  • Точное определение новых сообщений по node_msg_id
  • Автоматическая обработка ошибок 429 (Too Many Requests)
const { EventTypes } = require('./index').enums;

for await (const event of runner.listen(6.0)) {
    switch (event.type) {
        case EventTypes.NEW_MESSAGE:
            console.log('Новое сообщение:', event.message.text);
            console.log('Автор:', event.message.author);
            console.log('Чат ID:', event.message.chat_id);
            // Важно: event.message содержит только новое сообщение, не старое
            break;
            
        case EventTypes.NEW_ORDER:
            console.log('Новый заказ:', event.order.id);
            console.log('Описание:', event.order.description);
            break;
            
        case EventTypes.ORDER_STATUS_CHANGED:
            console.log('Статус заказа изменен:', event.order.id);
            console.log('Новый статус:', event.order.status);
            break;
            
        case EventTypes.CHATS_LIST_CHANGED:
            console.log('Список чатов изменился');
            break;
            
        case EventTypes.LAST_CHAT_MESSAGE_CHANGED:
            console.log('Последнее сообщение чата изменилось:', event.chat.name);
            // Это событие срабатывает при изменении последнего сообщения в чате
            // Новое сообщение будет в событии NEW_MESSAGE, если оно действительно новое
            break;
    }
}

Примечание: Событие NEW_MESSAGE генерируется только для действительно новых сообщений. Runner использует node_msg_id из событий для точного определения новых сообщений и исключения обработки старых сообщений из других чатов.

Типы событий

const { EventTypes } = require('./index').enums;

EventTypes.INITIAL_CHAT              // 0 - Начальный чат
EventTypes.CHATS_LIST_CHANGED        // 1 - Список чатов изменился
EventTypes.LAST_CHAT_MESSAGE_CHANGED // 2 - Последнее сообщение чата изменилось
EventTypes.NEW_MESSAGE               // 3 - Новое сообщение
EventTypes.INITIAL_ORDER             // 4 - Начальный заказ
EventTypes.ORDERS_LIST_CHANGED       // 5 - Список заказов изменился
EventTypes.NEW_ORDER                 // 6 - Новый заказ
EventTypes.ORDER_STATUS_CHANGED      // 7 - Статус заказа изменился

Утилиты (Utils)

Модуль предоставляет вспомогательные функции:

const { utils } = require('./index');

// randomTag() - генерирует случайный тег
const tag = utils.randomTag();
console.log(`Тег: ${tag}`);

// parseWaitTime(response) - парсит время ожидания из ответа
const waitTime = utils.parseWaitTime("Подождите 5 минут");
console.log(`Время ожидания: ${waitTime} секунд`);

// parseCurrency(symbol) - парсит символ валюты в enum Currency
const currency = utils.parseCurrency("₽");
console.log(`Валюта: ${currency}`); // Currency.RUB

// RegularExpressions - регулярные выражения для парсинга сообщений
const regex = new utils.RegularExpressions();
const orderIdMatch = "Заказ #ABC12345".match(regex.ORDER_ID);
if (orderIdMatch) {
    console.log(`Найден ID заказа: ${orderIdMatch[0]}`);
}

Типы данных

Модуль предоставляет множество типов данных для работы с FunPay:

Category

Класс категории.

const category = account.getCategory(754);
console.log(category.id);              // ID категории
console.log(category.name);            // Название категории
console.log(category.position);        // Позиция категории
console.log(category.getSubcategories()); // Получить все подкатегории
console.log(category.getSubcategory(SubCategoryTypes.COMMON, 3486)); // Получить подкатегорию
console.log(category.getSortedSubcategories()); // Получить отсортированные подкатегории

SubCategory

Класс подкатегории.

const subcategory = account.getSubcategory(SubCategoryTypes.COMMON, 3486);
console.log(subcategory.id);           // ID подкатегории
console.log(subcategory.name);         // Название подкатегории
console.log(subcategory.type);         // Тип подкатегории (COMMON или CURRENCY)
console.log(subcategory.category);     // Категория, к которой относится
console.log(subcategory.position);    // Позиция подкатегории
console.log(subcategory.fullname);     // Полное название
console.log(subcategory.public_link);  // Публичная ссылка
console.log(subcategory.private_link); // Приватная ссылка (для редактирования)

Chat

const chat = await account.getChat(123456789);
console.log(chat.id);        // ID чата
console.log(chat.name);      // Имя чата
console.log(chat.link);      // Ссылка на чат
console.log(chat.text);      // Текст чата
console.log(chat.messages);  // Массив сообщений (Message[])
console.log(chat.html);      // HTML код страницы чата

Message

const messages = await account.getChatHistory(123456789);
messages.forEach(msg => {
    console.log(msg.id);           // ID сообщения
    console.log(msg.text);          // Текст сообщения
    console.log(msg.author);        // Автор
    console.log(msg.chat_id);       // ID чата
    console.log(msg.type);         // Тип сообщения (MessageTypes)
    console.log(msg.date);         // Дата (timestamp)
    console.log(msg.html);         // HTML код сообщения
});

Order

const order = await account.getOrder('ABC12345');
console.log(order.id);              // ID заказа
console.log(order.description);     // Описание
console.log(order.price);           // Цена
console.log(order.currency);         // Валюта (Currency enum)
console.log(order.status);          // Статус (OrderStatuses enum)
console.log(order.buyer);           // Покупатель (UserProfile)
console.log(order.seller);          // Продавец (UserProfile)
console.log(order.review);          // Отзыв (Review)
console.log(order.subcategory);     // Подкатегория (SubCategory)
console.log(order.html);            // HTML код страницы заказа

LotPage

const lotPage = await account.getLotPage(12345678);
console.log(lotPage.lot_id);              // ID лота
console.log(lotPage.short_description);    // Краткое описание
console.log(lotPage.detailed_description); // Подробное описание
console.log(lotPage.seller_id);           // ID продавца
console.log(lotPage.seller_username);     // Имя продавца
console.log(lotPage.images);              // Массив URL изображений
console.log(lotPage.subcategory);         // Подкатегория (SubCategory)

LotFields

const lotFields = await account.getLotFields(12345678);
console.log(lotFields.lot_id);           // ID лота (0 для нового)
console.log(lotFields.title_ru);          // Название RU
console.log(lotFields.title_en);          // Название EN
console.log(lotFields.description_ru);     // Описание RU
console.log(lotFields.description_en);    // Описание EN
console.log(lotFields.payment_msg_ru);    // Сообщение об оплате RU
console.log(lotFields.payment_msg_en);    // Сообщение об оплате EN
console.log(lotFields.price);              // Цена
console.log(lotFields.amount);             // Количество
console.log(lotFields.active);             // Активен
console.log(lotFields.auto_delivery);      // Автовыдача
console.log(lotFields.deactivate_after_sale); // Деактивировать после продажи
console.log(lotFields.images);             // Массив ID изображений
console.log(lotFields.secrets);            // Массив секретов
console.log(lotFields.subcategory);        // Подкатегория
console.log(lotFields.currency);           // Валюта
console.log(lotFields.csrf_token);         // CSRF токен
console.log(lotFields.public_link);       // Публичная ссылка
console.log(lotFields.private_link);      // Приватная ссылка
console.log(lotFields.calc_result);        // Результат расчета (CalcResult)

// Методы LotFields
lotFields.editFields({ "price": "1500" }); // Редактировать поля
lotFields.setFields({ ... });              // Установить все поля
lotFields.renewFields();                    // Обновить поля перед сохранением
console.log(lotFields.fields);             // Получить все поля

UserProfile

const user = await account.getUser(1234567);
console.log(user.id);              // ID пользователя
console.log(user.username);        // Имя пользователя
console.log(user.online);          // Онлайн
console.log(user.banned);          // Забанен
console.log(user.rating);          // Рейтинг продавца (number: 0-5, например 3.4, или null)
console.log(user.reviews_count);  // Количество отзывов (number, например 7, или null)
console.log(user.getLots());       // Получить все лоты
console.log(user.getLot(lotId));   // Получить лот по ID

Balance

const balance = await account.getBalance(12345678);
console.log(balance.total_rub);        // Общий баланс RUB
console.log(balance.available_rub);    // Доступный баланс RUB
console.log(balance.total_usd);        // Общий баланс USD
console.log(balance.available_usd);    // Доступный баланс USD
console.log(balance.total_eur);        // Общий баланс EUR
console.log(balance.available_eur);    // Доступный баланс EUR

PaymentMethod

Метод оплаты из результата расчета.

const calcResult = await account.calc(SubCategoryTypes.COMMON, 3486, null, 1000);
const method = calcResult.methods[0];
console.log(method.name);      // Название метода
console.log(method.price);     // Цена
console.log(method.currency);  // Валюта
console.log(method.position);  // Позиция

ChatShortcut

Краткая информация о чате.

const chats = await account.requestChats();
const chat = chats[0];
console.log(chat.id);           // ID чата
console.log(chat.name);         // Имя чата
console.log(chat.last_message);  // Последнее сообщение
console.log(chat.unread);        // Количество непрочитанных

OrderShortcut

Краткая информация о заказе.

const [nextOrderId, orders] = await account.getSales();
const order = orders[0];
console.log(order.id);          // ID заказа
console.log(order.description); // Описание
console.log(order.price);       // Цена
console.log(order.currency);    // Валюта
console.log(order.status);      // Статус

LotShortcut

Краткая информация о лоте.

const lots = await account.getSubcategoryPublicLots(SubCategoryTypes.COMMON, 3486);
const lot = lots[0];
console.log(lot.id);           // ID лота
console.log(lot.description);  // Описание
console.log(lot.price);        // Цена
console.log(lot.currency);     // Валюта
console.log(lot.subcategory);  // Подкатегория

MyLotShortcut

Краткая информация о вашем лоте (как продавца).

const myLots = await account.getMySubcategoryLots(3486);
const lot = myLots[0];
console.log(lot.id);           // ID лота
console.log(lot.description);  // Описание
console.log(lot.price);        // Цена
console.log(lot.currency);     // Валюта
console.log(lot.active);      // Активен
console.log(lot.auto);        // Автовыдача
console.log(lot.amount);      // Количество

SellerShortcut

Краткая информация о продавце.

const lotPage = await account.getLotPage(12345678);
const seller = lotPage.seller;
console.log(seller.id);        // ID продавца
console.log(seller.username);  // Имя продавца

BuyerViewing

Информация о просмотре лота покупателем (используется в Runner).

// Используется внутри Runner для отслеживания просмотров
// Доступ через Account._parseBuyerViewing(jsonResponse)

ChipOffer

Предложение чипа (валютного лота).

const chipFields = await account.getChipFields(1);
console.log(chipFields.offers); // Массив ChipOffer
chipFields.offers.forEach(offer => {
    console.log(offer.amount);  // Количество
    console.log(offer.price);   // Цена
});

ChipFields

Поля чипа (валютного лота) для редактирования.

const chipFields = await account.getChipFields(1);
console.log(chipFields.subcategory_id); // ID подкатегории
console.log(chipFields.game_id);        // ID игры
console.log(chipFields.min_sum);        // Минимальная сумма
console.log(chipFields.price);          // Цена
console.log(chipFields.amount);         // Количество
console.log(chipFields.offers);         // Массив предложений (ChipOffer)
console.log(chipFields.csrf_token);     // CSRF токен

// Методы ChipFields
chipFields.editFields({ "price": "1500" }); // Редактировать поля
chipFields.setFields({ ... });              // Установить все поля
chipFields.renewFields();                    // Обновить поля перед сохранением
console.log(chipFields.fields);             // Получить все поля

Утилиты (Utils)

Модуль предоставляет вспомогательные функции:

const { utils } = require('./index');

// randomTag() - генерирует случайный тег (10 символов)
const tag = utils.randomTag();
console.log(`Тег: ${tag}`);

// parseWaitTime(response) - парсит время ожидания из ответа
const waitTime = utils.parseWaitTime("Подождите 5 минут");
console.log(`Время ожидания: ${waitTime} секунд`);

// parseCurrency(symbol) - парсит символ валюты в enum Currency
const currency = utils.parseCurrency("₽");
console.log(`Валюта: ${currency}`); // Currency.RUB

// RegularExpressions - регулярные выражения для парсинга сообщений
const regex = new utils.RegularExpressions();
const orderIdMatch = "Заказ #ABC12345".match(regex.ORDER_ID);
if (orderIdMatch) {
    console.log(`Найден ID заказа: ${orderIdMatch[0]}`);
}

// Доступные регулярные выражения:
// regex.ORDER_PURCHASED - заказ оплачен
// regex.ORDER_CONFIRMED - заказ подтвержден
// regex.NEW_FEEDBACK - новый отзыв
// regex.FEEDBACK_CHANGED - отзыв изменен
// regex.FEEDBACK_DELETED - отзыв удален
// regex.NEW_FEEDBACK_ANSWER - новый ответ на отзыв
// regex.FEEDBACK_ANSWER_CHANGED - ответ на отзыв изменен
// regex.FEEDBACK_ANSWER_DELETED - ответ на отзыв удален
// regex.ORDER_REOPENED - заказ открыт повторно
// regex.REFUND - возврат средств
// regex.REFUND_BY_ADMIN - возврат средств администратором
// regex.PARTIAL_REFUND - частичный возврат
// regex.ORDER_CONFIRMED_BY_ADMIN - заказ подтвержден администратором
// regex.ORDER_ID - ID заказа
// regex.DISCORD - сообщение о Discord
// regex.DEAR_VENDORS - сообщение "Уважаемые продавцы"
// regex.PRODUCTS_AMOUNT - количество товаров
// regex.PRODUCTS_AMOUNT_ORDER - количество товаров в заказе
// regex.EXCHANGE_RATE - курс обмена

Перечисления (Enums)

EventTypes

Типы событий для Runner.

const { EventTypes } = require('./index').enums;

EventTypes.INITIAL_CHAT              // 0
EventTypes.CHATS_LIST_CHANGED        // 1
EventTypes.LAST_CHAT_MESSAGE_CHANGED // 2
EventTypes.NEW_MESSAGE               // 3
EventTypes.INITIAL_ORDER             // 4
EventTypes.ORDERS_LIST_CHANGED       // 5
EventTypes.NEW_ORDER                 // 6
EventTypes.ORDER_STATUS_CHANGED      // 7

MessageTypes

Типы сообщений.

const { MessageTypes } = require('./index').enums;

MessageTypes.NON_SYSTEM              // 0
MessageTypes.ORDER_PURCHASED         // 1
MessageTypes.ORDER_CONFIRMED         // 2
MessageTypes.NEW_FEEDBACK            // 3
MessageTypes.FEEDBACK_CHANGED        // 4
MessageTypes.FEEDBACK_DELETED        // 5
MessageTypes.NEW_FEEDBACK_ANSWER    // 6
MessageTypes.FEEDBACK_ANSWER_CHANGED // 7
MessageTypes.FEEDBACK_ANSWER_DELETED // 8
MessageTypes.ORDER_REOPENED          // 9
MessageTypes.REFUND                   // 10
MessageTypes.PARTIAL_REFUND           // 11
MessageTypes.ORDER_CONFIRMED_BY_ADMIN // 12
MessageTypes.DISCORD                  // 13
MessageTypes.DEAR_VENDORS             // 14
MessageTypes.REFUND_BY_ADMIN          // 15

OrderStatuses

Статусы заказов.

const { OrderStatuses } = require('./index').enums;

OrderStatuses.PAID      // 0 - Оплачен
OrderStatuses.CLOSED    // 1 - Закрыт
OrderStatuses.REFUNDED  // 2 - Возвращен

SubCategoryTypes

Типы подкатегорий.

const { SubCategoryTypes } = require('./index').enums;

SubCategoryTypes.COMMON   // 0 - Обычные лоты
SubCategoryTypes.CURRENCY // 1 - Валютные лоты (чипы)

Currency

Валюты.

const { Currency } = require('./index').enums;

Currency.USD     // 0
Currency.RUB     // 1
Currency.EUR     // 2
Currency.UNKNOWN // 3

// Методы
Currency.toString(Currency.RUB);  // "₽"
Currency.getCode(Currency.RUB);    // "rub"

Wallet

Типы кошельков для вывода средств.

const { Wallet } = require('./index').enums;

Wallet.QIWI      // 0
Wallet.BINANCE   // 1
Wallet.TRC       // 2
Wallet.CARD_RUB  // 3
Wallet.CARD_USD  // 4
Wallet.CARD_EUR  // 5
Wallet.WEBMONEY  // 6
Wallet.YOUMONEY  // 7

Исключения (Exceptions)

Модуль предоставляет различные классы исключений:

const { exceptions } = require('./index');

// AccountNotInitiatedError - аккаунт не инициализирован
// UnauthorizedError - не авторизован
// RequestFailedError - ошибка запроса
// LotSavingError - ошибка сохранения лота
// MessageNotDeliveredError - сообщение не доставлено
// ImageUploadError - ошибка загрузки изображения
// WithdrawError - ошибка вывода средств
// RefundError - ошибка возврата средств
// RaiseError - ошибка поднятия лотов
// FeedbackEditingError - ошибка редактирования отзыва
// LotParsingError - ошибка парсинга лота

Обработка ошибок

Обработка сетевых ошибок

Модуль автоматически обрабатывает сетевые ошибки (таймауты, разрывы соединения) с бесконечными попытками повторного подключения. При потере соединения с FunPay модуль будет автоматически пытаться восстановить соединение.

try {
    await account.get();
} catch (error) {
    if (error instanceof exceptions.UnauthorizedError) {
        console.log('Ошибка авторизации. Проверьте golden_key.');
    } else if (error instanceof exceptions.RequestFailedError) {
        console.log(`Ошибка запроса: ${error.message}`);
    } else {
        console.log(`Неизвестная ошибка: ${error.message}`);
    }
}

Обработка ошибок 429 (Too Many Requests)

Модуль автоматически обрабатывает ошибки 429 с экспоненциальной задержкой.

Примеры использования

Полный пример работы с API

См. файл example.js для полного примера использования всех возможностей API.

Пример бота для автоматической обработки заказов

const { Account, Runner, enums } = require('./index');
const { EventTypes } = enums;

const account = new Account('your_golden_key', 'your_user_agent');
await account.get();

const runner = new Runner(account);

for await (const event of runner.listen(6.0)) {
    if (event.type === EventTypes.NEW_ORDER) {
        const order = event.order;
        console.log(`Новый заказ: ${order.id}`);
        
        // Получаем полную информацию о заказе
        const fullOrder = await account.getOrder(order.id);
        
        // Отправляем сообщение покупателю
        await account.sendMessage(
            fullOrder.buyer.id,
            `Спасибо за заказ! Ваш заказ #${order.id} принят в обработку.`
        );
    }
    
    if (event.type === EventTypes.NEW_MESSAGE) {
        const message = event.message;
        console.log(`Новое сообщение от ${message.author}: ${message.text}`);
        
        // Автоответ на сообщения
        if (message.text.toLowerCase().includes('привет')) {
            await account.sendMessage(
                message.chat_id,
                'Привет! Чем могу помочь?'
            );
        }
    }
}

Пример управления лотами

const { Account, types, enums } = require('./index');
const { Currency, SubCategoryTypes } = enums;

const account = new Account('your_golden_key', 'your_user_agent');
await account.get();

// Получаем подкатегорию
const subcategory = account.getSubcategory(SubCategoryTypes.COMMON, 3486);

// Создаем новый лот
const newLot = new types.LotFields(
    0,
    {
        "node_id": String(subcategory.id),
        "csrf_token": account.csrf_token,
        "fields[summary][ru]": "Новый лот",
        "fields[summary][en]": "New lot",
        "fields[desc][ru]": "Описание лота",
        "fields[desc][en]": "Lot description",
        "price": "1000",
        "amount": "1",
        "active": "on",
        "auto_delivery": "on",
        "fields[images]": "",
        "secrets": ""
    },
    subcategory,
    Currency.RUB
);

newLot.renewFields();
await account.saveLot(newLot);

// Получаем все мои лоты
const myLots = await account.getAllMyLots();
console.log(`Всего моих лотов: ${myLots.length}`);

// Обновляем лот
const lotFields = await account.getLotFields(newLot.lot_id);
lotFields.price = 1500;
lotFields.renewFields();
await account.saveLot(lotFields);

Структура проекта

FPAPIjs/
├── lib/
│   ├── account.js          # Основной класс Account
│   ├── types.js            # Типы данных (Chat, Order, Lot и т.д.)
│   ├── common/
│   │   ├── enums.js        # Перечисления (EventTypes, Currency и т.д.)
│   │   ├── exceptions.js   # Исключения
│   │   ├── utils.js        # Утилиты
│   │   └── index.js        # Экспорт общих модулей
│   └── updater/
│       ├── events.js       # События для Runner
│       └── runner.js       # Runner класс
├── index.js                # Главный файл модуля
├── example.js              # Примеры использования
├── package.json            # Конфигурация npm
└── README.md               # Документация

Методы Category и SubCategory

Category - методы

const category = account.getCategory(754);

// Получить все подкатегории
const subcategories = category.getSubcategories();

// Получить подкатегорию по типу и ID
const subcategory = category.getSubcategory(SubCategoryTypes.COMMON, 3486);

// Получить отсортированные подкатегории
const sorted = category.getSortedSubcategories();

SubCategory - свойства

const subcategory = account.getSubcategory(SubCategoryTypes.COMMON, 3486);

// Все свойства доступны только для чтения
console.log(subcategory.id);           // ID подкатегории
console.log(subcategory.name);         // Название
console.log(subcategory.type);         // Тип (COMMON или CURRENCY)
console.log(subcategory.category);     // Категория
console.log(subcategory.position);     // Позиция
console.log(subcategory.fullname);     // Полное название
console.log(subcategory.public_link);  // Публичная ссылка
console.log(subcategory.private_link); // Приватная ссылка

Дополнительные методы Account

addChats(chats)

Добавляет чаты в кэш аккаунта.

const chats = await account.requestChats();
account.addChats(chats);

getChatByName(name)

Получает чат по имени пользователя.

const chat = await account.getChatByName('ExampleUser');

getChatById(chatId)

Получает чат по ID.

const chat = await account.getChatById(123456789);

getSells(...) (устаревший)

Устаревший метод. Используйте getSales().

saveOffer(offerFields)

Внутренний метод для сохранения лота или чипа. Используйте saveLot() или saveChip().

Статические методы Account

Account.chatIdPrivate(chatId)

Проверяет, является ли ID чата приватным.

const isPrivate = Account.chatIdPrivate(123456789);  // true
const isPrivate2 = Account.chatIdPrivate('users-123-456');  // true
const isPrivate3 = Account.chatIdPrivate('invalid');  // false

Account._parseBuyerViewing(jsonResponse)

Парсит информацию о просмотре лота покупателем (внутренний метод).

Особенности

  • Полная функциональность: Модуль полностью повторяет функциональность Python версии FunPayAPI
  • Автоматическая обработка ошибок: Автоматическая обработка сетевых ошибок с бесконечными попытками повторного подключения
  • Обработка 429 ошибок: Автоматическая обработка ошибок "Too Many Requests" с экспоненциальной задержкой
  • Поддержка локалей: Поддержка русской, английской и украинской локалей
  • Типизация: Полная типизация всех данных
  • События в реальном времени: Поддержка получения событий в реальном времени через Runner с улучшенной логикой определения новых сообщений
  • Универсальный парсинг страниц: Метод getPageData() позволяет получить все данные со страницы (классы, data-атрибуты, формы, ссылки, изображения, meta-теги)
  • Рейтинг аккаунта: Поддержка получения рейтинга продавца и количества отзывов
  • Оптимизированное получение лотов: Методы getMyLotCategories() и getAllMyLots() получают лоты напрямую со страницы профиля пользователя, парся блок div.mb20 со списком категорий и получая все лоты (активные и неактивные) через страницу редактирования, без проверки всех подкатегорий на FunPay
  • Поддержка различных типов прокси: Модуль поддерживает HTTP, HTTPS, SOCKS4 и SOCKS5 прокси.

Последние изменения

v1.1.0

✨ Добавлено

  • Поддержка различных типов прокси: HTTP, HTTPS, SOCKS4, SOCKS5
  • ✅ Два формата конфигурации прокси: строковый URL и объектный формат
  • ✅ Автоматическое создание прокси-агентов для каждого типа прокси
  • ✅ Все запросы к FunPay теперь могут проходить через прокси-сервер

Важно: Использование прокси особенно важно при работе на серверах, так как IP-адрес сервера может быть заблокирован на FunPay. Прокси позволяет обойти блокировки и использовать любой доступный прокси-сервер. Подробности использования см. в разделе Конструктор.

v1.0.9

🐛 Исправлено

  • ✅ Улучшена обработка сетевых ошибок для работы на серверах
  • ✅ Добавлен User-Agent по умолчанию (если не указан явно)
  • ✅ Добавлены дополнительные HTTP-заголовки для совместимости с FunPay
  • ✅ Расширена обработка различных типов сетевых ошибок (EAI_AGAIN, EPROTO, ESOCKETTIMEDOUT, SSL/TLS ошибки)
  • ✅ Улучшено логирование ошибок с выводом кода ошибки и деталей

🔧 Улучшено

  • ✅ Модуль теперь корректно работает на Linux серверах
  • ✅ Более детальное логирование сетевых ошибок для диагностики проблем
  • ✅ Автоматическая установка стандартных HTTP-заголовков браузера

Важно: Если вы испытывали проблемы с подключением на серверах (особенно Linux), обновите до версии 1.0.9+. Модуль теперь автоматически устанавливает User-Agent и необходимые HTTP-заголовки, что должно решить большинство проблем с подключением.

v1.0.7

🚀 Оптимизировано

  • ✅ Методы getMyLotCategories() и getAllMyLots() теперь работают значительно быстрее
  • ✅ Получение лотов напрямую со страницы профиля пользователя (users/{userId}/)
  • ✅ Парсинг блока div.mb20 со списком категорий с лотами
  • ✅ Получение всех лотов (активных и неактивных) через страницу редактирования (/lots/{id}/trade)
  • ✅ Определение активности лота по наличию класса warning
  • ✅ Убрана необходимость проверки всех подкатегорий на FunPay (3742+ подкатегорий)

Важно: Теперь методы getMyLotCategories() и getAllMyLots() работают намного быстрее и эффективнее, так как они получают лоты напрямую со страницы профиля пользователя, без необходимости проверять все подкатегории на FunPay. Методы также возвращают неактивные лоты, которые определяются по классу warning на странице редактирования.

v1.0.6

✨ Добавлено

  • ✅ Метод updateLotPrice(lotId, newPrice) для быстрого изменения цены лота
  • ✅ Метод getBuyerViewing(buyerId) для получения информации о просмотре покупателя
  • ✅ Метод runner.getBuyerViewing(buyerId) для получения информации о просмотре из Runner
  • ✅ Автоматическая обработка событий buyer_viewing в Runner

v1.0.3

✨ Добавлено

  • ✅ Метод getAccountRating() для получения рейтинга аккаунта (продавца)
  • ✅ Поля rating и reviews_count в классе UserProfile
  • ✅ Автоматический парсинг рейтинга в методе getUser()

🐛 Исправлено

  • ✅ Улучшена логика обработки новых сообщений в Runner
  • ✅ Исправлена проблема с обработкой старых сообщений из других чатов
  • ✅ Более точное определение новых сообщений с использованием node_msg_id из событий
  • ✅ Runner теперь корректно фильтрует сообщения и обрабатывает только действительно новые сообщения

Важно для пользователей Runner: Если вы использовали Runner для обработки сообщений, обновите до версии 1.0.3+ для исправления проблемы с обработкой старых сообщений. Теперь Runner использует node_msg_id из событий для точного определения новых сообщений, что исключает обработку старых сообщений из других чатов.

Требования

  • Node.js >= 14.0.0
  • npm или yarn

Полный список всех методов и свойств

Account - все методы

Инициализация:

  • constructor(goldenKey, userAgent, requestsTimeout, proxy, locale)
  • get(updatePhpsessid) - инициализация/обновление аккаунта
  • logout() - выход из аккаунта

Геттеры/Сеттеры:

  • locale (getter/setter)
  • is_initiated (getter)
  • bot_character (getter)
  • old_bot_character (getter)
  • categories (getter)
  • subcategories (getter)

Категории:

  • getCategory(categoryId)
  • getSubcategory(subcategoryType, subcategoryId)
  • getSortedCategories()
  • getSortedSubcategories()

Чаты:

  • requestChats()
  • getChats(update)
  • addChats(chats)
  • getChatByName(name)
  • getChatById(chatId)
  • getChat(chatId, withHistory, locale)
  • getChatHistory(chatId, lastMessageId, interlocutorUsername, fromId)
  • getChatsHistories(chatsData)

Сообщения:

  • sendMessage(chatId, text, chatName, interlocutorId, imageId, addToIgnoreList, updateLastSavedMessage, leaveAsUnread)
  • sendImage(chatId, image, chatName, interlocutorId, addToIgnoreList, updateLastSavedMessage, leaveAsUnread)
  • uploadImage(image, type)

Заказы:

  • getSales(...)
  • getOrder(orderId, locale)
  • getOrderShortcut(orderId)
  • getSells(...) (устаревший)

Лоты:

  • getSubcategoryPublicLots(subcategoryType, subcategoryId, locale)
  • getMySubcategoryLots(subcategoryId, locale)
  • getMyLotCategories(userId, locale)
  • getAllMyLots(userId, locale)
  • getLotPage(lotId, locale)
  • getLotFields(lotId)
  • getPageData(url, locale)
  • calc(subcategoryType, subcategoryId, gameId, price)

Пользователи:

  • getUser(userId, locale)
  • getAccountRating(userId, locale)
  • getBuyerViewing(buyerId)

Отзывы:

  • sendReview(orderId, text, rating)
  • deleteReview(orderId)

Финансы:

  • getBalance(lotId)
  • refund(orderId)
  • withdraw(currency, wallet, amount, address)
  • getExchangeRate(currency)

Управление лотами:

  • getChipFields(subcategoryId)
  • saveLot(lotFields)
  • saveChip(chipFields)
  • saveOffer(offerFields) (внутренний)
  • deleteLot(lotId)
  • updateLotPrice(lotId, newPrice)
  • getRaiseModal(categoryId)
  • raiseLots(categoryId, subcategories, exclude)

Статические методы:

  • Account.chatIdPrivate(chatId)
  • Account._parseBuyerViewing(jsonResponse) (внутренний)

Runner - все методы

  • constructor(account, disableMessageRequests, disabledOrderRequests)
  • getUpdates() - запросить обновления
  • parseUpdates(updates) - парсить обновления
  • listen(requestsDelay, ignoreExceptions) - генератор событий
  • getBuyerViewing(buyerId) - получить информацию о просмотре покупателя
  • updateLastMessage(chatId, messageId, messageText) - обновить сохраненный ID последнего сообщения
  • markAsByBot(chatId, messageId) - пометить сообщение как отправленное ботом

Все типы данных

  • BaseOrderInfo
  • ChatShortcut
  • BuyerViewing
  • Chat
  • Message
  • OrderShortcut
  • Order
  • Category
  • SubCategory
  • LotFields
  • ChipOffer
  • ChipFields
  • LotPage
  • SellerShortcut
  • LotShortcut
  • MyLotShortcut
  • UserProfile
  • Review
  • Balance
  • PaymentMethod
  • CalcResult

Все перечисления (Enums)

  • EventTypes - типы событий (8 типов)
  • MessageTypes - типы сообщений (16 типов)
  • OrderStatuses - статусы заказов (3 статуса)
  • SubCategoryTypes - типы подкатегорий (2 типа)
  • Currency - валюты (4 валюты)
  • Wallet - типы кошельков (8 типов)

Все исключения (Exceptions)

  • AccountNotInitiatedError
  • RequestFailedError
  • UnauthorizedError
  • WithdrawError
  • RaiseError
  • ImageUploadError
  • MessageNotDeliveredError
  • FeedbackEditingError
  • LotParsingError
  • LotSavingError
  • RefundError

Все утилиты (Utils)

  • randomTag() - генерация случайного тега
  • parseWaitTime(response) - парсинг времени ожидания
  • parseCurrency(symbol) - парсинг символа валюты
  • RegularExpressions - класс с регулярными выражениями (17 паттернов)

Лицензия

ISC

Поддержка

При возникновении проблем или вопросов создайте issue в репозитории проекта.

Благодарности

Этот модуль является полным портом Python библиотеки FunPayAPI.