作者:小黄鸭
推荐理由
我们来做一个能提升效率的小助手吧!听说很多人用飞书做时间管理,但录入数据遇到困难。那今天我给你们的方案呢,不需要你动手录入,也不会有误差和遗漏,非常的方便简单!
省流文字版
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 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 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 () => {
}
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
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('-')
}
})()