枯燥的生活需要每日情话
最近在参加一个up主/博主(不晓得怎么描述哈哈)举办的的mini黑客马拉松(群友自发玩票,图个开心) ,具体是谁就不透露了,免得有打广告的嫌疑
tips:黑客马拉松概念源自美国,一群高手云集一堂,几十个小时里开发出一款作品,累了或坐或卧,现场休息,做完当场交作品,是"世界上最酷的开发者狂欢"。
当然受困于技术水平(不是高手,上限和下限都很突出)和组织形式(群友自发玩票),没法做到几十个小时不眠不休开发一个作品,所以时间、作品形式都是无限制的;没有过多考虑就选择了用浏览器插件做一个每日情话的消息提示notifications,原因是:
- 一我是从事前端开发的,ChromeExtension除开一些特殊的API与限制,其他的完全可以基于前端三件套html、css、JavaScript来开发,所以前端福音jQuery、angular、react、vue也是可以使用的;
- 二是因为白天要做本职工作,精力、能力有限,做不了高精尖的产品,插件在不发布到商店的前提下还是蛮方便的,直接拖进浏览器就行,不用部署,就挺好。
这里使用了MV3版本来创建,因为chrome商店将在2022年6月停止接受新的MV2扩展上传,在2023年1月过后停止接受已有的MV2扩展更新,并且停止运行MV2扩展,所以文中也会提到一些2和3的不同
一、首先是创建插件的入口文件manifest.json
它包含了插件的名称、版本等信息,
{"manifest_version": 3, //2或3,告诉浏览器你是使用哪个版本"name": "hackathon", //插件/扩展的名称"version": "1.0.0", //插件的版本/*前三项是必须有的*/"action": { "default_popup": "popup.html" },"permissions": [// 需要用到的权限"notifications"],"background": {"service_worker": "background.js"}
}
如果你希望使用MV2版本来创建,则需要把清单文件中的"manifest_version": 3
改为2,"action"
改为"browser_action"
,"background"
中"service_worker"
改为"scripts"
或者"page"
,MV2中background.js会自动生成一个html的背景页,MV3为了提升性能将后台脚本放在了service works环境中,因此不会常驻后台,而且也没有后台页面了,所以也无法操作DOM相关了
{"manifest_version": 2,"browser_action": {},"background": {"scripts": ["background.js"]// "page": "background.html"}
}
二、然后创建插件的图标弹窗页面popup.html和popup.js
这里有些方法可能会重复使用,就做了简单的封装,放在utils中,API使用了故梦:https://api.gmit.vip/Docs#/Doc/go的随机一言,这个是免费的感谢故梦大佬
// utils
const $ = selector => document.querySelector(selector)
async function request() {const req = await fetch('https://api.gmit.vip/Api/YiYan?format=json')const res = await req.json()const { text } = res.dataconst options = {title: '每日情话',message: text,type: 'basic',iconUrl: '/assets/logo.png',buttons: [{title: '毁灭吧'}, {title: '再来一个'}]}return options
}
// popup.js
const btn = $('#btn')
btn.onclick = async () => {const options = await request()chrome.notifications.create('random', options, () => console.log('桌面通知已就绪'))
}
<body><button id="btn">每日情话</button><script src="utils.js"></script><script src="popup.js"></script>
</body>
主要是用了插件的notifications
API,他的create方法接受三个参数(id,options,callback)
其中options可选项有
参数 | 描述 |
---|---|
type | 类型,必须指定,“basic”, “image”, “list”, “progress” |
iconUrl | 图标,必须指定 |
title | 标题,必须指定 |
message | 通知主要内容,必须指定 |
contextMessage | 通知附加内容,以较小字体显示 |
buttons | 会如下图所示出现最多两个按钮 |
此时点击popup页面中的按钮就会是这个效果:
有按钮就会有点击事件,有点击事件就会有返回值,那么系统通知的点击事件插件如何获取到呢,不急,咱们放在background.js里讲
三、创建background.js
消息提示的按钮点击事件通过notifications
API的onButtonClicked.addListener获取,该方法会传入一个回调函数,函数的参数可以获取到消息通知的id和点击的button的下标,因为最多两个按钮所以下标的值是0或1
chrome.notifications.onButtonClicked.addListener(async (notificationId, buttonIndex) => {console.log('click',notificationId, buttonIndex)if (buttonIndex === 1) {const options = await request()chrome.notifications.update(notificationId, options, (wasUpdated) => console.log('update', notificationId, wasUpdated))}
})
MV3此时是会报错的,因为request封装在了utils.js里,如果是MV2我们可以通过在背景页直接引入utils.js或者在manifest.json
里通过background
的scripts
引入来解决,但是MV3没有背景页而且也没有scripts
如何获取到外部js呢?MV3可以在manifest.json
里通过background
的"type": "module"
开启权限,就可以在background.js中使用import导入外部的方法,或者通过在background.js中使用importScripts(‘xx.js’, ‘yy.js’)语句引入外部方法
此处我们使用第二种方法,因为引入可能会因为路径原因出错,js是至上而下执行,遇到错误就不往后执行了,所以我们用try/catch将其包裹起来,当我们点击下标为1的按钮,我们再次请求随机一言的接口,通过notifications
的update方法更新消息提示,该方法可以传入三个参数(id,options,callback),与创建的create方法类似,甚至回调函数还可以接收到布尔值
try {importScripts('utils.js')
}catch (e) {console.log(e)
}
chrome.notifications.onButtonClicked.addListener(async (notificationId, buttonIndex) => {console.log('click',notificationId, buttonIndex)if (buttonIndex === 1) {const options = await request()chrome.notifications.update(notificationId, options, (wasUpdated) => console.log('update', notificationId, wasUpdated))}
})
至此一个简单的消息通知demo就完成啦!当然这还很初级,还有很多玩法,比如可以在插件栏对图标做文章(vue和react的devtools插件在是对应语法开发的网页图标会亮起,平时灰色状态,看了下代码,vue的插件是通过切换亮色和灰色的图片来实现的,react的没有深究过不知道是不是一样的,知道的小伙伴可以在评论区评论下)
// mv2
chrome.browserAction.setIcon({path: ''}) // 设置展示的图标
chrome.browserAction.setTitle() // 设置鼠标划过的提示文字
chrome.browserAction.setBadgeText({text: ''}) // 设置图标下方badge的文字
chrome.browserAction.setBadgeBackgroundColor({color: ''}) // 设置图标下方badge的背景色
// mv3
chrome.action.setIcon({path: ''}) // 设置展示的图标
chrome.action.setTitle({title: ''}) // 设置鼠标划过的提示文字
chrome.action.setBadgeText({text: ''}) // 设置图标下方badge的文字
chrome.action.setBadgeBackgroundColor({color: ''}) // 设置图标下方badge的背景色
枯燥的生活需要每日情话相关推荐
- 每日情话之跟着大佬学撩妹,哦不node邮件服务器
node-mail-service 基于node的邮件服务 定时每日给女朋友们发送情话嘿嘿嘿 就是照着大佬学习的 Github项目地址 启动服务 git clone 本项目 yarn install ...
- 微信每日推送天气预报每日情话-利用堡塔实现每天自动推送!
本文思路以及源码来源于小红书 程序员七夕礼物 - 微信每日早安推送 简单部署一键启动_Sajor_的博客-CSDN博客大佬的文章! 上面文章利用的是docker实现的自动推送的功能,本文通过宝塔计划任 ...
- ❤️手把手教你做一个爱情保温软件❤️——python封装.exe文件+爬虫(每日情话系列)
陪伴是最长情的告白 ❤️导读 ❤️可执行文件的准备阶段--爬虫 ❤️源码 ❤️封装成可执行文件 ❤️生成图标 ❤️可能会产生的报错 ❤️我的文件分享 ❤️特别推荐 ❤️导读 何为爱?很多人说在中国爱是 ...
- 微信小程序实战,用vue3实现每日浪漫情话推荐~
浪漫情话微信小程序太阳码在这里,欢迎体验哈 1.前言 之前做了个恋爱话术微信小程序,满足了日常聊天的需要,实现高情商的恋爱聊天.最近也完成了话术库的优化更新,新增30万条话术数据,同时使用了分词技术, ...
- 发布了每日一文应用,每日一文,每天阅读,简单生活。每天精选一篇不同的文章,也可以随机阅读往日精选文章...
每日一文是一个简单的中文阅读应用,每天精选一篇不同的文章给读者,同时也可以随机阅读往日精选文章. 每天花10分钟阅读一篇文章, 一个月可以有大约50000字的阅读量, 一年有近60万字的阅读量, 专注 ...
- 麦克风增强软件_唱吧麦克风不会唱歌用它唱都好听,《向往的生活》同款麦克风...
当代年轻人的快乐,其实很简单. 被工作狠狠虐了千百遍后,只要到KTV吼几嗓子放松一下,就又和这个世界和解了. 唱歌,真的是一件解压又治愈的事情. 就像<向往的生活>里,何炅.黄磊和其他嘉宾 ...
- 【程序人生】跟小伙伴们聊聊我有趣的大学生活和我那两个好基友!
写在前面 我的新书<海量数据处理与大数据技术实战>出版了,大家可以关注 冰河技术 微信公众号,查看<我的<海量数据处理与大数据技术实战>出版啦!>一文来了解更多的详 ...
- 4星|《心流:最优体验心理学》:如何在工作生活中发现幸福:找到意义与目标并且专注其中...
心流:最优体验心理学 据郑也夫写的序言,英文原版是1990年出版的,台湾版书名是<幸福:从心开始>,大陆第一版书名是<幸福的真意>,大陆第二版书名是<当下的幸福>. ...
- 463种生活小窍门--转载
463种生活小窍门 1 .生活窍门:巧用牙膏6:若有小面积皮肤损伤或烧伤.烫伤,抹上少许牙膏,可立即止血止痛,也可防止感染,疗效颇佳. 2 .生活窍门:巧除纱窗油腻3:可将洗衣粉.吸烟剩下的烟头一起放 ...
最新文章
- oracle存储while用mysql_oracle存储过程while
- Android端调用Caffe模型实现CNN分类
- Redis 安装 启动 连接 配置 重启
- 【技术干货】Spring事务原理一探
- img title属性值利用#13换行
- C++打印0到N的Catalan数卡特兰数(附完整源码)
- 网络验证php接口逆向,一个专利查错的逆向(网络验证)
- ucos ii 源代码中文注释详解 : OS_TIME.C
- Kafka : kafka重启报错 ZkClient allready closed
- vue中ref 的使用
- 暑假周进度总结报告4
- ArcGIS API for Silverlight 调用GP服务绘制等值面
- Jep 解析字符串数学公式
- 群晖windows文件服务器,小白玩群晖 篇六:群晖NFS远程加载管理Windows文件夹看电影...
- bim建模的过程的几个要点
- Newifi路由刷机R6830
- Word提示:“向程序发送命令时出现问题”解决方法
- 计算机应用能力考试ppt,全国专业技术人员计算机应用能力考试 PPT 2003 题库版...
- python调用DLL/EXE文件截屏的比较
- 图书管理系统java课设_JavaGUI图书管理系统(可作课程设计)