我建立了一个不脱机机器人来教我葡萄牙语
#网络开发人员 #node #discord #googlecloud

我已经尝试自己学习葡萄牙人三年了。我梦想着流利,并以机智和魅力给伴侣的家人留下深刻的印象。不幸的是,学习语言需要大量精力。有助于拾取语言的东西正在扩大您的词汇量。我有一个我一直在学习的大约700个单词和短语的Google表格,但是有比看电子表格更好的学习方法。我受到这个article的启发,建立了一个具有个性的机器人,以教我葡萄牙语。本文将简要讨论我学会的技术和我遇到的一些挑战的技术。

目录

  1. 项目的目标
  2. 玩乐
  3. 学习Discord API
  4. 学习Google表API
  5. 创建一个命令来获取词汇单词
  6. 设置Cron Job
  7. 部署到Heroku

项目的目标

我的主要目标是建立一个机器人,每天都会向我发送一些词汇单词,而我的次要目标是使与之互动变得有趣。我的第一个决定是使用Discord,因为这是我每天使用的应用程序,并在所有设备上都打开,并且它具有用于构建机器人的Javascript API。我的第二个决定是将我的词汇列表保留在Google表中,并使用Google Sheets API连接到我的数据。我想要尽可能少的摩擦来使我的机器人启动并运行。

正玩得开心

欺骗我做某事的最佳方法是在做这件事时玩得开心。我想建立一个可以激发我参与巴西文化的机器人,所以我选择了一个心爱的民间传说角色来教我葡萄牙-Cucað。

Image of Cuca. She's a large, confident crocodile with a blond wig. She's smiling for the camera while she sits in her best dress.

cuca最著名的是儿童节目Sãtiodo picapau amarelo中的鳄鱼。如果您曾经在Netflix上观看过CidadeInvisãvel,那么您可能会知道她是可以进入人们梦想的女士。但是,我更喜欢她的鳄鱼形式ð。

Screenshot of Cuca bot icon on Discord app

每个词汇列表CUCA都会给我发送有趣的GIF。并且有a lot of fun gifs可供选择。

GIF of Cuca dancing

学习nodejs的Discord API

设置Discord Bot非常简单。有一个helpful guide,它可以带您通过NPM安装discord.js并在developer's portal上创建新的机器人的基础知识。要注意的最重要的是您的机器人的安全令牌。您可以通过生成邀请链接来邀请机器人到服务器。邀请链接是带有bot的client_id的URL,并附加了一些权限和范围。范围和权限允许您的机器人某些功能,因此请确保选择所需的功能。对于我的机器人,我想创建 slash命令,因此我选择了botguildapplications.commands范围以及Embed LinksMention Everyone权限。

这是我生成的链接的一个示例:

https://discord.com/api/oauth2/authorize?client_id=XXXXXXXXX&permissions=147456&scope=applications.commands%20bot%20guilds

学习Google表API

我在项目中最重要的痛苦点是了解如何为Google Sheeps API进行身份验证。通常,对于我使用过的其他API,我会得到一个API键,并随我的要求发送。 Google Cloud为您提供了两个身份验证选项:OAUTH 2.0客户端ID和服务帐户。还有更多的tutorials解释了服务帐户,所以我走了那条路线。创建服务帐户时,提示您下载一个保存您的帐户详细信息和私钥的JSON文件。该文件是您用来验证API请求的内容。您的服务帐户也像Google帐户一样,您可以与该帐户共享Google Sheet文档(像任何其他Google帐户)。

创建一个斜杠命令来检索词汇单词

我创建了一个连接到我的Google API服务的Slash命令,并返回词汇单词及其翻译的随机列表。此/vocab命令连接到我的Google API service code,并通过我的电子表格ID以及我要返回的值范围。我的词汇列表是两列:葡萄牙语单词的一列,另一列是翻译的,因此我选择值的范围并随机选择20个值。

async function getWordsTranslationsMeanings() {
    try {
        const auth = await getAuthToken();
        const response = await getRangeSpreadSheetValues({
            spreadsheetId,
            sheetName,
            auth,
            range
        })

        const translationsArray = response.data.values;
        const translationsArrayLength = translationsArray.length;

        // Selecting random number of words
        const randomWords = []
        for (let index = 0; index < numOfWords; index++) { // numOfWords = 20
            const randomWordIndex = Math.floor(Math.random() * translationsArrayLength);
            randomWords[index] = translationsArray[randomWordIndex]
        }

        return randomWords;

    } catch (error) {
        console.log(error.message, error.stack);
    }
}

要将我的词汇单词发送到Discord,我使用了embed消息。这些是可容纳不同媒体(例如图像和gifs)的漂亮消息块。

Embed message from Cucabot. It lists a number of Portuguese words with their translations

这是嵌入式代码的片段:

    const embed = new MessageEmbed();

    await getWordsTranslationsMeanings().then( words => {
            let fields = words.map(word => { return { name: word[0], value: word[1] } })
            embed.setColor('#2A8947')
                .setTitle('Palavras de vocabulario')
                .setDescription('Agora vai!')
                .addField('\u200B', '\u200B')
                .addFields(fields)
                .setImage(getGucaGif())
                .setTimestamp()
                .setFooter({ text: 'Feito por Anneta Wamono');

            if (interaction) {
                interaction.channel.send({ embeds: [embed] });
            } 
        },
        err => {
            console.log(err);
        }
    );

SlashCommandBuilder代码:

const { SlashCommandBuilder } = require('@discordjs/builders');
const { createEmbedWith20Words } = require('../actions/send20Words.js');

module.exports = {
    data: new SlashCommandBuilder()
        .setName('vocab')
        .setDescription('Replies with a list of vocabulary words!'),
    async execute(interaction) {
        await createEmbedWith20Words({ interaction });
        await interaction.reply('Aqui estão suas palavras!');
    },
};

设置Cron Job

理想的情况是Cuca Bot在方便的练习时间每天将我的词汇列表发送给我。最好的解决方案是cron。一旦您理解,cron语法就非常简单。

Cron ranges. Starting from left to right - seconds, minutes, hours, day of month, months and day of week.

出于我的目的,我想每天上午8点发送一条消息。

My cron string. Starting from left to right - 00, 00, 08, asteriks, asteriks, asteriks.

星号表示您的工作将在该范围内的每个值中运行。

部署

我使用Heroku部署了我的机器人,即使我以前一直在努力。那是因为我从来不知道 procfile 是什么以及如何使用它。 Procfiles用于配置您的代码将运行的DYNO。就我而言,将快速设定为工人很重要。默认情况下,为Web进程配置了DYNOS,以接收HTTP流量。 Worker dynos适用于background jobs, queueing systems, and timed jobs,运行机器人时您将不会收到超时错误。

项目要点

这是一个非常有趣的项目。我有机会了解有关新API的更多信息,并在部署项目时获得了更多的信心。我现在流利葡萄牙吗?不,但是每天我都会好一点。我想为CUCA机器人添加更多功能,例如发出测试并跟踪我的分数的命令。

资源


感谢您阅读我的文章。如果您想了解更多详细信息,请在下面发表评论。我想继续提高文章的质量,因此对任何反馈都表示赞赏。

在下一个见!