独自工作太累了,所以我创建了自己的助手
独自工作很棒......但是......我厌倦了处理所有这些......这些糟糕的、无趣的、重复的、乏味的任务......
我都不知道自己要回复多少封邮件,要开多少张发票。还要管理和安排多少任务?!
我有时会因为太忙而独自发疯,有时我会因为突然无事可做而发疯。
Console.log( my_life )
我需要一种无论发生什么都能让我保持稳定的东西。也许我需要一个经纪人。来管理我!(说来好笑,因为我辞职就是为了不被别人管理。哈哈)
有一瞬间,我想雇人,但我没有钱。(当然)
因此,我尝试使用 discord 和 notion API 创建我的个人助理,以及我从这个项目中学到了什么。
如果有任何错误,请告诉我。我很乐意向您学习!
1. 我学习了NLP
在我创建聊天机器人时,我首先想到的是如何分析我文字的意图。人们会用各种不同的表达方式表达同一件事。
- 你好吗?
- 怎么样了?
- 这是怎么回事?
我可以为每个表达式都写类似的代码if( text.includes('how are you') )
,但效率会有多低呢?这时 NLP 就派上用场了。
自然语言处理 (NLP) 是指计算机程序理解人类口头和书面语言(即自然语言)的能力。它是人工智能 (AI) 的一个组成部分。NLP 已存在 50 多年,其根源在于语言学领域。(来源:techtarget.com)
虽然我仍然不完全了解 NLP 的工作原理,但我的理解目前是这样的。
-
开发人员提交了一组未来用户可能会发送的句子
-
用户可以为每个文本分配三种类型的变量。
(1)内涵:句子中最重要的部分。一个句子只能分配一个。例如)我需要一部新 iPhone!-> Request_add_wishlist
(2)实体:这是一个较小的组件,基本上是定义意图的关键关键字。例如)我需要购物!-> 需要,购物。
(3)特征:(我暂时忽略这部分) -
NLP程序分析什么样的实体组合才具有特定的内涵。
-
下次用户发送完整的新文本时,经过训练的 NLP 将会表达出用户的意思。
在提供 NLP 的多种不同服务中,我选择使用 wit.ai 服务,这是 Facebook、Meta 开发的开源服务。
wit.ai 的实用之处在于,我通过 discord 发送的聊天文本也会出现在 wit.ai 训练课程中,因此即使机器人无法理解我的意思,我也可以随时向 wit 进行纠正。
缺点是文档不太清晰,所以……总之……没关系。我会接受的……
2. 我学习了Discord.js
最后,我选择创建一个 discord 机器人而不是 Slack 机器人,尽管我并不是一个真正的 discord 用户。
我为了寻求帮助而加入的一些服务器,侧边栏上总是有太多的频道,讨论也太多了。这感觉太过隐晦了。就像你走进一家夜店,看到满满的人都在完美地跳着迈克尔·杰克逊的惊悚舞,而我却不会跳那种该死的舞。“快,从那家夜店出去!”
无论如何,在这个项目中,我可以了解 discord.js,同时也可以更多地了解 discord 本身……
npm install discord.js
Discord JS 最令人兴奋的地方在于它提供了丰富的与其他用户交互的选项。可以创建按钮、斜线命令、与表情符号交互等等,远不止发送消息那么简单。
最有用的消息类型是嵌入消息。
(我将我的协调员设置为电视连续剧“好地方”中的 Tahani,因为我非常喜欢她在节目中的角色。真开心!)
嵌入消息返回格式精美的信息。您可以像这样直接添加字段。
_embed.addFields({name : "Count", value : Count })
或者您可以为每个键创建字典和循环
Object.keys(style).forEach( k=>{
_newEmbed.addFields({name : k , value :style[k].toString() })
})
Discord 机器人实用参考 -> Discord JS 指南
3. 我学习了 Notion API
我爱 NotionHQ。实际上,我对它着迷了。从它还不是主流的时候我就一直在用它了。最近我听说它收购了automate.io。NotionHQ,加油!越来越强大!但有那么几次……我考虑离开 Notion……是因为 Notion 没有循环任务选项!
就像我在简介里写的,重复做任务已经很无聊了,每次还要勾选?妈的,我才不想这样。
我一次又一次地离开 Notion,又回来,就像一个问题少年与父母争吵一样。一年前,Notion 发布了 Notion API;“伙计们,这是最后一次了。我要为你们构建一个自动化系统,从此以后幸福地陪伴你们。”
npm install @notionhq/client
Notion API 很棒!但不幸的是,目前 (v1.0.3) 有一些限制。
-
编辑区块功能目前尚不可用。基本上,如果您想勾选复选框区块,就需要删除当前的复选框项,然后重新添加一个重复的区块。这并非不可能,但有点烦人。复制单个区块还好,但如果您想复制整个页面怎么办?遗憾的是,您仍然需要删除整个页面并复制它。如果页面包含子元素,问题会更加棘手。
-
让子级阻止仅返回层次结构中的顶级项目。
var children = await NOTION.blocks.children.list({ block_id: _block.id });
例如,如果有这样的概念块
代码输出将仅为 [block_A, block_B]。因此,即使你将父块及其子块复制,[block_Aa, block_Ab, block_Ba, block_Bb] 也不会被复制。
如果您想要父母的所有孩子,那么除了不断询问孩子是否有曾孙之外别无他法……
if( block_A.hasChildren ){
children.push( await NOTION.blocks.children.list({ block_id: block_A.id }) )
}
- 某些块类型不受支持。想想看,像嵌入推文或嵌入 Figma 这样的非原生 Notity 块就不受支持,这完全没问题,但是……代码块也不支持,所以我有点难过。:(
我只想用代码块来保存代码,这样我就可以用“eval()”来运行它了,eval() 可以是任何文本块。只是没有我想象的那么漂亮,仅此而已。哈哈
var scripts = blocks.filter( block => Object.keys(block)[0] == "callout" )
await eval(scripts[0])
4. 我了解了 Cron
协调员机器人必须具备的功能之一是发送预定的消息,这样我就可以按时完成任务。
为此,我了解了Cron。
npm i cron
CRON 表达式是一个由五到六个字段组成的字符串,这些字段之间用空格[ 16]分隔,表示一组时间,通常作为执行某些例程的时间表。
来自维基百科
***??... 又是一个正则表达式.. 恐怖.. 但实际上,cron 时间的细分非常简单,min + hour + date + month + week.
现在我应该通过 Date() 来生成 cron 时间。这次我没有用 js 写,而是用了 Notion 内置的公式,这样即使我用 Notion 更新了计划,cron 时间值也能同时更新。
min :
empty(prop("Unit")) ? if(minute(prop("Date")) + minute(prop("Date")) == 0, format(minute(prop("Edited"))), format(minute(prop("Date")))) : if(prop("Unit") == "minute", "*/" + format(if(empty(prop("Recurring")), 1, prop("Recurring"))), if(prop("Unit") != "hour" or prop("Unit") != "minute", if(empty(prop("Date")), if(empty(prop("Date")), format(minute(prop("Edited"))), format(minute(prop("Date")))), format(minute(prop("Date")))), "*"))
就目前而言,这是一个如此丑陋的代码,但到目前为止,它似乎可以按预期运行。(完整代码在我的repo中)
虽然我可以用 Notion 创建新的计划事件,但我也希望通过聊天功能创建新的提醒。幸好 Wit.ai 内置了名为“duration”和“datetime”的实体,真是救星!
5. 我学会了 Puppeteer
我开始觉得自己越来越贪婪,越来越需要别人了。嘿,机器人,你现在可以显示天气、不同时区的时间、我今天的任务和项目截止日期了……不如……推荐一下今天的餐食?嗯……
首先,我找到了最大的食谱 API,称为Spoonacular API,但是......食物图片看起来有点......不是很鼓舞人心......
因此,我决定不使用食物 API,而是直接从我最喜欢的烹饪网站上获取信息。我听说 Puppeteer 很适合网页抓取,一直想试试,但这是我第一次尝试 Puppeteer!
npm i puppeteer
Puppeteer是一个非常棒的软件包,但也存在一些令人困惑的部分。
当我尝试通过 document.querySelector() 获取元素时,它返回的undefined
是null
对象。我当时很慌张,以为 Puppeteer 找不到该元素,但它就在那里……当我特意询问 textContent 或 src、href 时?
await page.evaluate(()=>{
return document.querySelectorAll(".selector").map( sel => sel.textContent)
});
据我了解,Puppeteer 给我的不是 HTML 元素,而是其他东西。(有没有人能给我解释得简单一点?我很无助,哈哈)
不管怎样,现在我得到了一个食谱推荐。耶
6. 我学习了 Heroku
因为当我不运行 bot.js 时我的机器人将被停用,所以我需要 Heroku 在云端为其提供服务。
虽然我的网站托管在 Netlify 上,但我对这项托管服务仍然不太熟悉。我之前误以为 Heroku 和 Netlify 是同一种服务,但这次我明白了它们并非如此。由于整篇文章都缺乏专业知识,所以以下是我目前对 Netlify 和 Heroku 的简单了解。
- Netlify 更适合前端,而 Heroku 更适合后端
- Netlify 始终处于活动状态,但 Heroku 处于休眠状态...zzz
- Netlify 是网站在线托管,但 Heroku 在 Linux 上运行脚本
- Netlify 开始按构建时间收费,Heroku 按称为Dyno 小时的方式收费
Dyno 是一个在 Linux 中运行命令的容器。应用程序越繁忙,需要购买的 Dyno 就越多。因为我是免费用户,所以我只有一个 Dyno。
免费用户有 1000 小时免费测功时间。这意味着即使我的应用程序连续运行一个月,也不会超过 730 小时。免费总是好的,这让我感觉很舒服。😊
结论
虽然我还想进一步改进,添加更多功能,但我的Tahani机器人现在运行得相当好。有个伴儿真好!(说起来真可惜。哈哈)
这次我尝试了很多新事物,学到了很多东西;然而,我感觉自己没有花足够的时间去更深入地了解每一个。也许这就是我下次参加 dev.to 时要做的事情。
除了拥有一个定制的虚拟助手来辅助我的日常工作之外,我学到的知识也非常宝贵。我的互动角色项目
还有很大的改进空间 。感谢您阅读这篇杂乱的文章。我并非训练有素的开发人员(我是一名视觉艺术家),但我很高兴能分享我的想法,并了解更多关于如何创造一些酷炫事物的知识。
如果您想修改我的帖子并指正我的观点,请留言。能向大家学习真是太棒了!
文章来源:https://dev.to/happping_min/working-alone-is-so-exhausting-so-i-created-my-own-assistant-4mki