通过飞书构建一个史上最严格的自律机器人 - 飞书官网

通过飞书构建一个史上最严格的自律机器人

飞书

作者:小黄鸭​
​
推荐理由​
我们来做一个能提升效率的小助手吧!听说很多人用飞书做时间管理,但录入数据遇到困难。那今天我给你们的方案呢,不需要你动手录入,也不会有误差和遗漏,非常的方便简单!​
省流文字版​
00:00-00:50​
嗨我是小黄鸭!在上一期视频的评论区,有粉丝留言说呢,希望做一个摸鱼统计的小助手,我非常积极的对这个需求做了调研,成功的摸了一个礼拜的鱼。痛定思痛,我们还是做一个能够帮助我们,工作效率提升的小助手吧。我听说很多人用飞书做时间管理,但我看到的所有方案,都有一个共同的问题,那就是如何录入数据,有些人会随手记录,有些人则是每天晚上集中找时间记录。那今天我给你们的方案呢,不需要你动手录入,也不会有误差和遗漏,非常的方便非常的简单。​
00:51-02:19​
这里用到了一个软件叫xbar,它可以在固定的时间间隔,去调用某些脚本,比如说我就把我的b站粉丝数,还有最新视频的播放及评论数,显示在了我的状态栏上,可见我真的很在意你们的关注,还有三连。那这次需求呢,我同样是写一个脚本每秒钟调用一次,去查看当前在使用的应用到底是什么,并且在状态栏显示出,这个应用目前持续使用的时间,这样就能有助于提醒我专注,当前的工作,我就可以看到我目前已经,连续写作了多长时间了,当然仅仅是这样还太简单了,于是呢我加了一个提醒功能,当你访问黑名单内的网站的时候,就会收到提醒,如果多次提醒后你依然执迷不悟,这个小插件就会帮你把网页关掉,这就是你们片头看到那段视频了。那在这些能力的加持下呢,可以想到很多有趣的玩法,比如说设,定上班下班的不同模式,或者当你累计工作了一小时,可以换取10分钟看b站的时间,再比如当你专注工作了一段时间,我可以推送一个视频啊,提醒你要站起来跟着活动,总之用了这个小工具之后,不仅呢让我能够长时间沉浸在工作中,还能有效的劳逸结合,非常有效的提升了我的工作效率。以上就是本期视频的全部内容,那欢迎收看我们下期再见。​
02:20-03:08​
哦突然想起来,我们时间管理是不是还没做,前面已经收集了,我们使用每个应用的时间,之后只要把这些数据上传到表格,就可以清晰的查看一天的活动了,能不能再清晰一点呢,上多维表格,不用写代码,就可以获得一个这样的可视化图标,可以看到各个应用的使用时间段,应用的使用时长,还有各个网页访问的市场,这个多维表格那可真是仍然有很多的问题为了。证明我没有恰饭我决定呢,重点说一说他们的不足之处:比如说我这里的这些数值其实是时间,但是呢他没有办法格式化,再比如查看视图的时候呢,我希望能够过滤到一些数据,不要显示这么多的噪音,这个呢,目前也好像没有很好的办法去处理。当然了,瑕不掩瑜,这种低代码类的产品,做起来就是很复杂的,懂的都懂,所以长期呢我还是看好的啊,多维表格你们加油!​
03:09-03:46​
好的以上呢,真的就是本期视频的全部内容了啊,上期播放过万我说做一个谁是卧底,这个真的,已经在做了啊,相信呢不久之后呢,我就会放一个demo到我的群里边玩,想玩的朋友可以提前加我的群,那希望讨论机器人技术的朋友呢,也可以加这个群哦,还有给你们坦白一件事情,就是上期那个评论留言的呢,其实是我们自己的托,但我真的也希望,你们能够在评论区提提你们的想法啊,我会挑一些有意思的把它做出来,做成视频,我们一起分享交流,那这期就到这了,我们下期再见拜拜~​
​
软件地址​
​
附录:xbar脚本​
​
​
#!/usr/bin/env /usr/local/bin/node​
const activeWindow = require('active-win')​
const applescript = require('applescript')​
const { exec } = require('child_process')​
const axios = require('axios')​
const Datastore = require('nedb-promises')​
const dayjs = require('dayjs')​
const FSDK = require('/Users/nemo/Source/github.com/alili/feishuAPI/index.js')​
const datastore = Datastore.create(`./db/daily.db`)​
const metaStore = Datastore.create(`./db/meta.db`)​
let FAPI​
const ROBOT_APPID = 'cli_a27ecbb84679900d'​
const ME = 'e6288gb4'​
const BITABLE_ID = 'bascnfHgoh8uXhcwwFxCKJNoCWh'​
const TABLE_ID = 'tblqDr92aGmkNd8v'​
const GIFT_TIME = 1000 * 60 * 20​
const BAPI = {​
rankArchive: async ({ ps = 12, pn = 1, rid = 20 }) => {​
const url = `https://api.bilibili.com/x/web-interface/dynamic/region?ps=${ps}&pn=${pn}&rid=${rid}`​
const res = await axios.get(url)​
return res.data​
},​
}​
const closeTab = async () => {​
const str = `​
try​
tell window 1 of application "Google Chrome" to close active tab​
end try`​
await applescript.execString(str, (err, rtn) => {​
if (err) throw err​
console.log(rtn)​
})​
}​
const showRobot = async () => {​
exec(`open lark://applink.feishu.cn/client/bot/open?appId=${ROBOT_APPID}`)​
}​
const sendGift = async () => {​
let res = await BAPI.rankArchive({})​
await FAPI.sendTextMessage(ME, res.data?.archives[0].short_link_v2)​
showRobot()​
}​
const messages = ['别看视频了,好好工作吧', '求你别看了,上会儿班吧', '说你不听是吧,还看,再看我给你关了!']​
;(async () => {​
let app = await metaStore.findOne({ key: 'token' })​
let token = await metaStore.findOne({ key: 'token' })​
let blackList = (await metaStore.findOne({ key: 'blackList' })).blackList​
FAPI = new FSDK(app.id, app.secret)​
if (!token?.indate || token.indate <= new Date().getTime()) {​
token = await FAPI.getTenantToken()​
token.indate = new Date().getTime() + token.expire * 1000​
await metaStore.update(​
{ key: 'token' },​
{​
...token,​
key: 'token',​
}​
)​
}​
FAPI.setToken(token.tenant_access_token)​
let last = await metaStore.findOne({ key: 'last' })​
let res = await activeWindow()​
if (!res) return​
let data = {​
title: res.title,​
name: res.owner.name,​
url: res.url,​
startTime: new Date().getTime(),​
}​
if (last.title !== data.title && (last.url !== data.url || (!last.url && !data.url))) {​
// 多维表格title为中文,不是因为我英文不好​
const range = {​
应用名称: last.name,​
标题: last.title,​
URL: last.url || '',​
HOST: last.url ? last.url.split('/')[2] : '',​
开始时间: last.startTime,​
持续时间: new Date().getTime() - last.startTime,​
}​
// 写入数据库&飞书文档​
if (last.title) {​
await datastore.insert(range)​
await FAPI.bitableAddRecords(BITABLE_ID, TABLE_ID, range)​
}​
//黑名单行为​
if (data.url) {​
Object.keys(blackList).forEach(async (url) => {​
if (new RegExp(url).test(data.url)) {​
if (blackList[url] < 3) {​
await FAPI.sendTextMessage(ME, messages[blackList[url]])​
await metaStore.update(​
{ key: 'blackList' },​
{​
$set: {​
blackList: {​
[url]: blackList[url] + 1,​
},​
},​
}​
)​
showRobot()​
} else {​
await closeTab()​
await FAPI.sendTextMessage(ME, `${data.title}\n已经帮你关了!`)​
showRobot()​
}​
}​
})​
}​
last = data​
last.startTime = new Date().getTime()​
await metaStore.update(​
{ key: 'last' },​
{​
...last,​
key: 'last',​
}​
)​
}​
// 更新显示​
if (last.startTime) {​
// 定时奖励​
if (new Date().getTime() - last.startTime > GIFT_TIME) {​
sendGift()​
}​
console.log(​
`${data.title}: ${dayjs(new Date().getTime() - last.startTime)​
.subtract(8, 'hour')​
.format('HH:mm:ss')}`​
)​
} else {​
console.log('-')​
}​
})()​
​
预约飞书企业效能顾问 深度诊断企业痛点,定制专属 AI 办公方案

字节跳动旗下 AI 工作平台

关联文章推荐

优质内容,精华实践

先进团队,先用飞书

欢迎联系我们,飞书效能顾问将为您提供全力支持
分享先进工作方式
输送行业最佳实践
全面协助组织提效
标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题

字节跳动旗下 AI 工作平台

联系我们立即试用