Anime365Wrapper — это современная TypeScript обёртка для API anime365.ru (smotret-anime), обеспечивающая полную типизацию и поддержку как ESM, так и CommonJS модулей.
- 🔥 Полная поддержка TypeScript с экспортом всех типов
- 📦 ESM и CommonJS совместимость
- 🛡️ Безопасность - корректная обработка авторизации
- 🚀 Современный API с async/await поддержкой
- 📚 Полная типизация всех методов и возвращаемых данных
- 🔧 Гибкая настройка базового URL и User-Agent
- ⚡ Быстрая работа с кэшированием токенов
- Node.js 10.0.0 или выше
- TypeScript 4.0+ (опционально, для типизации)
# npm
npm install anime365wrapper
# yarn
yarn add anime365wrapper
# pnpm
pnpm add anime365wrapperimport { SmotretAnimeAPI, UserSession } from 'anime365wrapper';
import type { Translation, Series } from 'anime365wrapper';
const api = new SmotretAnimeAPI();
// Получение списка переводов
const translations: Translation[] = await api.getTranslations('recent');
console.log(`Получено переводов: ${translations.length}`);
// Получение списка аниме
const series: Series[] = await api.getSeriesList({ limit: 10 });
console.log(`Получено серий: ${series.length}`);const { SmotretAnimeAPI, UserSession } = require('anime365wrapper');
const api = new SmotretAnimeAPI();
// Получение списка переводов
api.getTranslations('recent')
.then(translations => {
console.log(`Получено переводов: ${translations.length}`);
})
.catch(console.error);import { SmotretAnimeAPI } from 'anime365wrapper';
const api = new SmotretAnimeAPI();
// Авторизация
try {
const token = await api.login('your_email@example.com', 'your_password');
console.log('Токен получен:', token);
// Теперь можно использовать методы, требующие авторизации
const user = await api.getCurrentUser();
console.log('Пользователь:', user);
} catch (error) {
console.error('Ошибка авторизации:', error.message);
}import { UserSession } from 'anime365wrapper';
const session = new UserSession();
// Авторизация с автоматическим сохранением токена
try {
const token = await session.login('your_email@example.com', 'your_password');
console.log('Успешная авторизация');
// Токен автоматически сохраняется для последующих запросов
const translations = await session.getTranslations('recent');
console.log('Переводы:', translations);
} catch (error) {
console.error('Ошибка:', error.message);
}new SmotretAnimeAPI(baseUrl?: string, userAgent?: string, accessToken?: string)Параметры:
baseUrl- Базовый URL API (по умолчанию:https://smotret-anime.online/api)userAgent- User-Agent для запросов (по умолчанию:Anime365Wrapper/1.0)accessToken- Токен авторизации (опционально)
// Установка токена
setAccessToken(token: string): void
// Авторизация по email и паролю
login(email: string, password: string): Promise<string>// Получение списка переводов
getTranslations(feed?: 'recent' | 'id' | 'all', afterId?: number): Promise<Translation[]>
// Получение перевода по ID
getTranslationById(id: number): Promise<Translation>
// Получение данных для встраивания
getTranslationEmbed(id: number): Promise<EmbedTranslation>// Получение списка аниме
getSeriesList(params?: {
fields?: string;
chips?: string;
myAnimeListId?: number;
query?: string;
pretty?: number;
limit?: number;
offset?: number;
}): Promise<Series[]>
// Получение аниме по ID
getSeriesById(id: number): Promise<Series>// Получение эпизода по ID
getEpisodeById(id: number): Promise<Episode>// Получение информации о текущем пользователе (требует авторизации)
getCurrentUser(): Promise<User>// Конструктор
new UserSession(apiBaseUrl?: string, userAgent?: string)
// Авторизация с сохранением токена
login(email: string, password: string): Promise<string>
// Установка токена
setAccessToken(token: string): void
// Прокси-методы
getTranslations(feed?: 'recent' | 'id' | 'all', afterId?: number): Promise<Translation[]>import { SmotretAnimeAPI } from 'anime365wrapper';
const api = new SmotretAnimeAPI();
// Поиск по названию
const searchResults = await api.getSeriesList({
query: 'naruto',
limit: 10
});
console.log('Найдено аниме:', searchResults.length);
searchResults.forEach(series => {
console.log(`- ${series.title} (${series.year})`);
});import { SmotretAnimeAPI } from 'anime365wrapper';
const api = new SmotretAnimeAPI();
// Получение последних переводов
const recentTranslations = await api.getTranslations('recent');
if (recentTranslations.length > 0) {
const firstTranslation = recentTranslations[0];
// Получение детальной информации
const detailedTranslation = await api.getTranslationById(firstTranslation.id);
console.log('Детали перевода:', detailedTranslation);
// Получение данных для встраивания
const embedData = await api.getTranslationEmbed(firstTranslation.id);
console.log('Embed данные:', embedData);
}import { UserSession } from 'anime365wrapper';
const session = new UserSession();
async function main() {
try {
// Авторизация
await session.login('your_email@example.com', 'your_password');
// Получение переводов (токен автоматически используется)
const translations = await session.getTranslations('recent');
// Получение информации о пользователе
const user = await session.getCurrentUser();
console.log('Пользователь:', user);
} catch (error) {
console.error('Ошибка:', error.message);
}
}
main();Библиотека экспортирует все необходимые типы:
import type {
Translation,
Series,
Episode,
User,
EmbedTranslation,
ApiResponse
} from 'anime365wrapper';interface Translation {
id: number;
title: string;
type: string;
seriesId: number;
episodeId: number;
isActive: number;
priority: number;
authorsList: string[];
// ... и другие поля
}interface Series {
id: number;
title: string;
year: number;
type: string;
numberOfEpisodes: number;
isActive: number;
isAiring: number;
allTitles: string[];
// ... и другие поля
}git clone https://github.com/thedvxchsquad/anime365wrapper.git
cd anime365wrapper
npm installnpm run buildnpm test- 🐛 Баги и предложения: GitHub Issues
- 📖 Документация API: TSDocs
- 💬 Обсуждения: GitHub Discussions
