[Mirai-js] Cómo hacer un robot QQ rápidamente

Inicio rápido

Para obtener la documentación completa, consulte -> https://Drincann.github.io/Mirai-js

Clone el proyecto al local:

$ git clone https://github.com/Drincann/Mirai-js.git

Entrada de interfaz ubicada ./src/Mirai-js.jsdeconstrucción del archivo:

const {
    
     Bot, Message } = require('./src/Mirai-js');

iniciar sesión

Puede ingresarlo directamente en la consola mirai/login qq password .

Si desea controlar remotamente el inicio de sesión de mirai-console , mediante el Botmétodo de clase sendCommendpara enviar comandos:

await Bot.sendCommand({
    
    
    // mirai-api-http 服务的网络位置
    baseUrl: 'http://example.com:8080',
    // 在 mirai-api-http 的配置中设置的 authKey
    authKey: 'authKey',
    // 指令名
    command: '/login',
    // 指令参数列表,这条指令等价于 /login 1019933576 password
    args: ['1019933576', 'password'],
});

Preste atención al valor de retorno de este método, problemas conocidos:

Error de inicio de sesión: Mirai no pudo completar la verificación del control deslizante. Utilice el protocolo ANDROID_PHONE para forzar la verificación del control deslizante, cambie el protocolo y vuelva a intentarlo. Consulte también: https://github.com/project-mirai/mirai-login-solver -selenio '

¡No inicie sesión repetidamente!

establecer conexión

Obtenga una Botinstancia y luego llame a un openmétodo en la instancia para conectarse a su servicio mirai-api-http :

const bot = new Bot();

// 连接到一个 mirai-api-http 服务
await bot.open({
    
    
    baseUrl: 'http://example.com:8080',
    authKey: 'authKey',
    // 要绑定的 qq,须确保该用户已在 mirai-console 登录
    qq: 1019933576,
});

Las llamadas repetidas al openmétodo restablecerán la conexión, si es necesario restablecer la conexión, puede pasar los parámetros que desea modificar.

Si no se proporcionan parámetros, se mantendrá la configuración original.

enviar mensajes

Envíe un mensaje a un amigo:

await bot.sendMessage({
    
    
    // 好友 qq 号
    friend: '1019933576',
    // Message 实例,表示一条消息
    message: new Message().addText('hello world!').addImageUrl('http://exapmle/image.jpg')});

¡Nota! Estos métodos son asincrónicos

También puede usar el formato original requerido por la interfaz mirai-api-http como mensaje.

Envíe un mensaje al grupo:

await bot.sendMessage({
    
    
    // 群号
    group: '123456789',
    // 是 http server 接口所需的原始格式,若提供则优先使用
    messageChain: [
    	{
    
     type: 'Plain', text: 'hello world!'},
        {
    
     type: 'Image', url:;'http://example/image.jpg'},
	],
});

Para MessageChaintipos de mensajes específicos , consulte MessageType .

Recibe mensajes y eventos

Registre el controlador de eventos para recibir mensajes de amigos:

// 监听好友消息事件
bot.on('FriendMessage', async data => {
    
    
    await bot.sendMessage({
    
    
        friend: data.sender.id,
        message: new Message().addText('hello world!'),
    });
});

La estructura del mensaje del evento FriendMessage:

{
    
    
    messageChain,
    sender: {
    
    
        id,
        nickname,
        remark
    }
}

El marco proporciona el contenido específico del mensaje en la forma del messageChain original. Su estructura es una matriz de MessageType. Ver MessageType para varios MessageTypes.

No importa si no quieres verlo, si solo te enfocas en los mensajes de texto, entonces podemos resolver este problema fácilmente usando el middleware predefinido por el framework.

Recibir mensajes grupales:

// 监听群消息事件
bot.on('GroupMessage', async data => {
    
    
    await bot.sendMessage({
    
    
        group: data.sender.group.id,
        message: new Message().addText('hello world!'),
    });

    // 你可以像这样来判断群成员的权限
    switch (data.sender.permission) {
    
    
        case Bot.GroupPermission.OWNER:
            // 群主
            break;
        case Bot.GroupPermission.ADMINISTRATOR:
            // 管理员
            break;
        case Bot.GroupPermission.MEMBER:
            // 普通群成员
            break;
    }
});

La estructura del mensaje del evento GroupMessage:

{
    
    
    messageChain,
    sender: {
    
    
        id,
        memberName,
        permission,
        group: {
    
    
            id,
            name,
            permission
        }
    }
}

Para tipos de eventos específicos y estructura de mensajes, consulte EventType .

Utilice middleware

El marco también proporciona una serie de middleware predefinido para procesar mensajes:

const {
    
     Middleware } = require('./src/Mirai-js');

Obtenga Middlewareejemplos:

const middleware = new Middleware();

Llame al middleware que necesita en la instancia (encadenado):

textProcessorPara unir messageChaintodos los mensajes de texto y colocarlos data.text, groupFilterfiltrará el número de grupo designado de eventos de mensajes de grupo.

middleware.textProcessor().groupFilter([123456789, 987654321]);

Al llamar al donemétodo, pasando su controlador de eventos, el controlador de eventos se obtiene con un middleware:

const processor = middleware.done(async data => {
    
    
    bot.sendMessage({
    
    
        friend: data.sender.id,
        message: new Message().addText(data.text),
    });
});

Registrarse en un evento:

bot.on('FriendMessage', processor);

También se puede combinar entre sí:

bot.on('FriendMessage', new Middleware()
    .textProcessor()
    .groupFilter([123456789, 987654321])
    .done(async data => {
    
    
        bot.sendMessage({
    
    
            friend: data.sender.id,
            message: new Message().addText(data.text),
        });
    })
);

Además, también puede personalizar el middleware mediante use:

Finalmente, la llamada nexttransfiere el control al siguiente middleware.

const processor = middleware.use((data, next) => {
    
    
    data.text = data.messageChain
        .filter((val) => val.type == 'Plain')
        .map((val) => val.text)
        .join('');
    next();
}).done(/* callback */);

Problemas conocidos

Cuando nuestro bot se desconecta y vuelve a iniciar sesión, la sesión actual entrará en un estado que no se invalida pero no se puede operar. Las operaciones forzadas (como enviar un mensaje) arrojarán una excepción del servidor (estado 500).

Llamar al openmétodo nuevamente después de iniciar sesión nuevamente puede evitar este problema.

O use un autoReLoginmiddleware predefinido en un evento que requiera volver a iniciar sesión , y se iniciará automáticamente después de que se interrumpa la conexión, por ejemplo:

bot.on('BotOfflineEventForce',
    new Middleware()
       .autoReLogin({
    
     bot, baseUrl, authKey, password })
       .done()
);

Supongo que te gusta

Origin blog.csdn.net/qq_16181837/article/details/113702321
Recomendado
Clasificación