最近在参加一个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.htmlpopup.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>

主要是用了插件的notificationsAPI,他的create方法接受三个参数(id,options,callback)
其中options可选项有

参数 描述
type 类型,必须指定,“basic”, “image”, “list”, “progress”
iconUrl 图标,必须指定
title 标题,必须指定
message 通知主要内容,必须指定
contextMessage 通知附加内容,以较小字体显示
buttons 会如下图所示出现最多两个按钮

此时点击popup页面中的按钮就会是这个效果:

有按钮就会有点击事件,有点击事件就会有返回值,那么系统通知的点击事件插件如何获取到呢,不急,咱们放在background.js里讲

三、创建background.js

消息提示的按钮点击事件通过notificationsAPI的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里通过backgroundscripts引入来解决,但是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的背景色

枯燥的生活需要每日情话相关推荐

  1. 每日情话之跟着大佬学撩妹,哦不node邮件服务器

    node-mail-service 基于node的邮件服务 定时每日给女朋友们发送情话嘿嘿嘿 就是照着大佬学习的 Github项目地址 启动服务 git clone 本项目 yarn install ...

  2. 微信每日推送天气预报每日情话-利用堡塔实现每天自动推送!

    本文思路以及源码来源于小红书 程序员七夕礼物 - 微信每日早安推送 简单部署一键启动_Sajor_的博客-CSDN博客大佬的文章! 上面文章利用的是docker实现的自动推送的功能,本文通过宝塔计划任 ...

  3. ❤️手把手教你做一个爱情保温软件❤️——python封装.exe文件+爬虫(每日情话系列)

    陪伴是最长情的告白 ❤️导读 ❤️可执行文件的准备阶段--爬虫 ❤️源码 ❤️封装成可执行文件 ❤️生成图标 ❤️可能会产生的报错 ❤️我的文件分享 ❤️特别推荐 ❤️导读 何为爱?很多人说在中国爱是 ...

  4. 微信小程序实战,用vue3实现每日浪漫情话推荐~

    浪漫情话微信小程序太阳码在这里,欢迎体验哈 1.前言 之前做了个恋爱话术微信小程序,满足了日常聊天的需要,实现高情商的恋爱聊天.最近也完成了话术库的优化更新,新增30万条话术数据,同时使用了分词技术, ...

  5. 发布了每日一文应用,每日一文,每天阅读,简单生活。每天精选一篇不同的文章,也可以随机阅读往日精选文章...

    每日一文是一个简单的中文阅读应用,每天精选一篇不同的文章给读者,同时也可以随机阅读往日精选文章. 每天花10分钟阅读一篇文章, 一个月可以有大约50000字的阅读量, 一年有近60万字的阅读量, 专注 ...

  6. 麦克风增强软件_唱吧麦克风不会唱歌用它唱都好听,《向往的生活》同款麦克风...

    当代年轻人的快乐,其实很简单. 被工作狠狠虐了千百遍后,只要到KTV吼几嗓子放松一下,就又和这个世界和解了. 唱歌,真的是一件解压又治愈的事情. 就像<向往的生活>里,何炅.黄磊和其他嘉宾 ...

  7. 【程序人生】跟小伙伴们聊聊我有趣的大学生活和我那两个好基友!

    写在前面 我的新书<海量数据处理与大数据技术实战>出版了,大家可以关注 冰河技术 微信公众号,查看<我的<海量数据处理与大数据技术实战>出版啦!>一文来了解更多的详 ...

  8. 4星|《心流:最优体验心理学》:如何在工作生活中发现幸福:找到意义与目标并且专注其中...

    心流:最优体验心理学 据郑也夫写的序言,英文原版是1990年出版的,台湾版书名是<幸福:从心开始>,大陆第一版书名是<幸福的真意>,大陆第二版书名是<当下的幸福>. ...

  9. 463种生活小窍门--转载

    463种生活小窍门 1 .生活窍门:巧用牙膏6:若有小面积皮肤损伤或烧伤.烫伤,抹上少许牙膏,可立即止血止痛,也可防止感染,疗效颇佳. 2 .生活窍门:巧除纱窗油腻3:可将洗衣粉.吸烟剩下的烟头一起放 ...

最新文章

  1. oracle存储while用mysql_oracle存储过程while
  2. Android端调用Caffe模型实现CNN分类
  3. Redis 安装 启动 连接 配置 重启
  4. 【技术干货】Spring事务原理一探
  5. img title属性值利用#13换行
  6. C++打印0到N的Catalan数卡特兰数(附完整源码)
  7. 网络验证php接口逆向,一个专利查错的逆向(网络验证)
  8. ucos ii 源代码中文注释详解 : OS_TIME.C
  9. Kafka : kafka重启报错 ZkClient allready closed
  10. vue中ref 的使用
  11. 暑假周进度总结报告4
  12. ArcGIS API for Silverlight 调用GP服务绘制等值面
  13. Jep 解析字符串数学公式
  14. 群晖windows文件服务器,小白玩群晖 篇六:群晖NFS远程加载管理Windows文件夹看电影...
  15. bim建模的过程的几个要点
  16. Newifi路由刷机R6830
  17. Word提示:“向程序发送命令时出现问题”解决方法
  18. 计算机应用能力考试ppt,全国专业技术人员计算机应用能力考试 PPT 2003 题库版...
  19. python调用DLL/EXE文件截屏的比较
  20. 图书管理系统java课设_JavaGUI图书管理系统(可作课程设计)

热门文章

  1. 网络编程之Socket零基础入门Demo
  2. 【娱见】乐视开始折腾路由器,小米与极路由还会好过吗?
  3. 健康数据的获取 Iphone
  4. BP神经网络原理(附实验程序)
  5. Android中手写签名的实现
  6. html5采集手写签名,前端canvas手写签名(含移动端)
  7. 仅需一个app就能像homeassistant一样实现跨品牌联动?
  8. linux中shell的小括号、大括号的用法区别
  9. 在visio中不借助公式编辑器在字母上方打波浪线
  10. Python中的微型巨人-Flask