我已经尝试自己学习葡萄牙人三年了。我梦想着流利,并以机智和魅力给伴侣的家人留下深刻的印象。不幸的是,学习语言需要大量精力。有助于拾取语言的东西正在扩大您的词汇量。我有一个我一直在学习的大约700个单词和短语的Google表格,但是有比看电子表格更好的学习方法。我受到这个article的启发,建立了一个具有个性的机器人,以教我葡萄牙语。本文将简要讨论我学会的技术和我遇到的一些挑战的技术。
目录
- 项目的目标
- 玩乐
- 学习Discord API
- 学习Google表API
- 创建一个命令来获取词汇单词
- 设置Cron Job
- 部署到Heroku
项目的目标
我的主要目标是建立一个机器人,每天都会向我发送一些词汇单词,而我的次要目标是使与之互动变得有趣。我的第一个决定是使用Discord,因为这是我每天使用的应用程序,并在所有设备上都打开,并且它具有用于构建机器人的Javascript API。我的第二个决定是将我的词汇列表保留在Google表中,并使用Google Sheets API连接到我的数据。我想要尽可能少的摩擦来使我的机器人启动并运行。
正玩得开心
欺骗我做某事的最佳方法是在做这件事时玩得开心。我想建立一个可以激发我参与巴西文化的机器人,所以我选择了一个心爱的民间传说角色来教我葡萄牙-Cucað。
cuca最著名的是儿童节目Sãtiodo picapau amarelo中的鳄鱼。如果您曾经在Netflix上观看过CidadeInvisãvel,那么您可能会知道她是可以进入人们梦想的女士。但是,我更喜欢她的鳄鱼形式ð。
每个词汇列表CUCA都会给我发送有趣的GIF。并且有a lot of fun gifs可供选择。
学习nodejs的Discord API
设置Discord Bot非常简单。有一个helpful guide,它可以带您通过NPM安装discord.js
并在developer's portal上创建新的机器人的基础知识。要注意的最重要的是您的机器人的安全令牌。您可以通过生成邀请链接来邀请机器人到服务器。邀请链接是带有bot的client_id的URL,并附加了一些权限和范围。范围和权限允许您的机器人某些功能,因此请确保选择所需的功能。对于我的机器人,我想创建 slash命令,因此我选择了bot
,guild
和applications.commands
范围以及Embed Links
和Mention 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)的漂亮消息块。
这是嵌入式代码的片段:
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语法就非常简单。
出于我的目的,我想每天上午8点发送一条消息。
星号表示您的工作将在该范围内的每个值中运行。
部署
我使用Heroku部署了我的机器人,即使我以前一直在努力。那是因为我从来不知道 procfile 是什么以及如何使用它。 Procfiles用于配置您的代码将运行的DYNO。就我而言,将快速设定为工人很重要。默认情况下,为Web进程配置了DYNOS,以接收HTTP流量。 Worker dynos适用于background jobs, queueing systems, and timed jobs,运行机器人时您将不会收到超时错误。
项目要点
这是一个非常有趣的项目。我有机会了解有关新API的更多信息,并在部署项目时获得了更多的信心。我现在流利葡萄牙吗?不,但是每天我都会好一点。我想为CUCA机器人添加更多功能,例如发出测试并跟踪我的分数的命令。
资源
感谢您阅读我的文章。如果您想了解更多详细信息,请在下面发表评论。我想继续提高文章的质量,因此对任何反馈都表示赞赏。
在下一个见!