Задать вопрос
Ответы пользователя по тегу Node.js
  • Как создать пользователя в marzban?

    zdev-online
    @zdev-online
    Backend Node.JS Developer
    Может быть поможет:
    import axios, { AxiosInstance } from 'axios';
    import { MARZBAN_BASE_URL, MARZBAN_PASSWORD, MARZBAN_USERNAME } from '../config';
    import { AxiosError } from 'axios';
    import { IAuthorizeResponse, ICreateUserRequest, ICreateUserResponse } from '../types';
    import axiosRetry from 'axios-retry';
    import { generate as getRandomString } from 'randomstring';
    import { getRandomInt } from '../utils';
    
    class Marzban {
    	private token?: string;
    	private client: AxiosInstance = axios.create({ baseURL: MARZBAN_BASE_URL });
    	private tokenHeader = 'Authorization';
    
    	constructor(private username: string, private password: string) {
    		this.init();
    	}
    
    	public async authorize() {
    		const response = await this.client.post<IAuthorizeResponse>('admin/token', this.getAuthData());
    
    		this.token = response.data.access_token;
    
    		return response.data;
    	}
    
    	public async currentAdmin() {
    		const response = await this.client.get('admin');
    		return response.data;
    	}
    
    	public async createUser(
    		userId: number,
    		telegramId: string,
    		username: string | null,
    		durationInDays: number,
    	) {
    		const response = await this.client.post<ICreateUserResponse>(
    			'user',
    			this.createUserData(userId, telegramId, username, durationInDays),
    		);
    		return response.data;
    	}
    
    	public async removeUser(username: string) {
    		const response = await this.client.delete(`user/${username}`, {
    			validateStatus: status => status === 404 || status === 200,
    		});
    		return response.status === 200;
    	}
    
    	private createUserData(
    		userId: number,
    		telegramId: string,
    		username: string | null,
    		durationInDays: number,
    	) {
    		const user: ICreateUserRequest = {
    			data_limit: 0,
    			expire: this.getExpireDuration(durationInDays),
    			status: 'active',
    			proxies: {
    				vless: {
    					flow: 'xtls-rprx-vision',
    				},
    			},
    			inbounds: {
    				vless: ['VLESS TCP REALITY'],
    			},
    			username: this.generateUsername(),
    			note: `Proxy for user#${userId} (Telegram: ${username ?? telegramId})`,
    		};
    		return user;
    	}
    
    	private generateUsername() {
    		return getRandomString({
    			capitalization: 'lowercase',
    			length: getRandomInt(8, 32),
    			charset: 'alphanumeric',
    		});
    	}
    
    	private getExpireDuration(durationDays: number) {
    		return (Date.now() + 1000 * 60 * 60 * 24 * durationDays) / 1000;
    	}
    
    	private getAuthData() {
    		const formData = new FormData();
    		formData.append('username', this.username);
    		formData.append('password', this.password);
    		return formData;
    	}
    
    	private init() {
    		this.client.interceptors.request.use(async config => {
    			if (!config.headers[this.tokenHeader] && this.token) {
    				config.headers[this.tokenHeader] = `Bearer ${this.token}`;
    			}
    			return config;
    		});
    
    		axiosRetry(this.client, {
    			retries: 3,
    			retryDelay: retryDelay => retryDelay * 500,
    			retryCondition: error => axiosRetry.isNetworkError(error) || error.response?.status === 401,
    			onRetry: async (retryCount, error, request) => {
    				await this.authorize();
    				if (request.headers) request.headers[this.tokenHeader] = `Bearer ${this.token}`;
    				console.warn(
    					`Authorization. Retry request (${retryCount}). Status: ${
    						error.response?.status
    					}. Has token: ${!!request.headers?.['Authorization']}`,
    				);
    			},
    		});
    	}
    }
    
    export const marzban = new Marzban(MARZBAN_USERNAME, MARZBAN_PASSWORD);
    Ответ написан
    Комментировать
  • Написал интервалы для проверки на мут и бан, не правильно работает?

    zdev-online
    @zdev-online
    Backend Node.JS Developer
    Проверяй на наличие мута либо через Cron, либо непосредственно при поступлении от пользователя сообщения и только тогда проверяй, и если нужно снимай его.

    vk.updates.on('message_new', async (ctx, next) => {
    	if (!ctx.isChat) return await next();
    
    	await mongo.models.chatsusers.findOneAndUpdate(
    		{
    			muted: true,
    			mutedTime: { $lte: now },
    			vkId: ctx.senderId,
    			join_chat: ctx.chatId,
    		},
    		{
    			muted: false,
    			mutedTime: 'None',
    			mutedReason: 'None',
    		},
    	);
    
    	await mongo.models.chatsusers.findOneAndUpdate(
    		{
    			banned: true,
    			bannedTime: { $lte: now },
    			vkId: ctx.senderId,
    			join_chat: ctx.chatId,
    		},
    		{
    			banned: false,
    			bannedTime: 'None',
    			bannedReason: 'None',
    		},
    	);
    });
    Ответ написан
    Комментировать
  • Есть ли разница, если приложение node.js запустить с cluster либо же 2 приложения в разных ядрах процессора?

    zdev-online
    @zdev-online
    Backend Node.JS Developer
    На одном порту 2 >= приложений не запустятся
    Ответ написан
    Комментировать
  • Подходит ли react для fullstack разработки?

    zdev-online
    @zdev-online
    Backend Node.JS Developer
    Fullstack — это сфера деятельности разработчика широкого профиля, который умеет работать с фронтендом (клиентская сторона, пользовательский интерфейс) и бэкендом (сторона сервера + база данных).


    Это значит то, что независимо от того, что ты используешь для разработки на стороне frontend и backend - все равно это будет считаться fullstack, т.к занимаешься разработкой обоих "сторон" сайта.
    Ответ написан
    Комментировать
  • Подключение api к боту?

    zdev-online
    @zdev-online
    Backend Node.JS Developer
    В каком смысле API для бота?

    Подними сервер на Express, понатыкай endpoint`ов, да отдавай по ним данные.
    Либо, если это бот VK - шли данные в Payload`e, но их поместиться не больно много.
    Ответ написан
    Комментировать
  • Не могу понять, как реализовать систему предупреждений (варнов)?

    zdev-online
    @zdev-online
    Backend Node.JS Developer
    Создай таблицу для предупреждений, где:
    id - автоинкремент
    chat_id - чат где получен варн
    user_id - кто получил варн
    reason - причина

    Потом в обработчике проверяй:
    SELECT * FROM warns WHERE user_id = ИД_ВК_ПОЛЬЗОВАТЕЛЯ AND chat_id = НОМЕР _ЧАТА
    Ответ написан
    Комментировать
  • Как исправить "io is not defined"?

    zdev-online
    @zdev-online
    Backend Node.JS Developer
    Клиент:
    <script src="/socket.io/socket.io.js"></script>

    Сервер:
    io.serveClient(true);
    Ответ написан
    Комментировать
  • Почему не работает подключение proxy node js?

    zdev-online
    @zdev-online
    Backend Node.JS Developer
    Попробуй с VPN сделать запрос. А так, советую Axios или встроенный в nodejs (>= 17.5v) fetch.

    63cb61abed097922459349.png
    А то, пакет request - deprecated :).
    Ответ написан