1、前言
学习学习,弄清楚底层原理远远比记忆来的更重要
资本家落泪哈哈哈哈,这位朋友抓住了底层逻辑
闲话少扯,开始介绍一款自动化脚本浏览器工具-Tampermonkey
2、什么是油猴脚本?
油猴脚本是一种浏览器插件,用于修改网页的行为和外观。它基于用户自定义的JavaScript代码,可以通过向页面注入脚本来实现各种功能的定制化
很抽象对不对,但只要了解了它的运行场景,你瞬间你能了解它是什么
- 广告屏蔽:通过脚本屏蔽网页那让人不甚烦恼广告和弹窗。
- 功能增强:比如自动填写表单、登录信息、自动翻译页面上的文本内容等等
- 自定义:如批量下载网站图片,视频,爬取数据等等
只要是你对网页的操作,油猴脚本都可以替你完成,这意味这什么,所有重复耗时的事情,都可以交给油猴。这时可能就有人会讲,这不就是 Python 的一部分功能吗?没错~你可以理解为他是 web 端的 Python
那我直接学习 Python 不就可以了吗?听起来好像是没错了,但要深入掌握一门语音可不是说说而已~而且,作为一个前端工程师,可以使用 JavaScript 就能做到 Python 式的体验,即简单又相当的 cool 不是嘛!
同时,使用油猴脚本还能辅助我们进行各种调试,助力前端学习和开发
3、基本原理
油猴通过注入自定义的 JavaScript 代码来改变网页的行为和外观
- 匹配脚本:使用正则表达式或 URL 匹配模式来定义脚本应该运行的页面。当用户访问一个网页时,油猴会根据这些规则判断是否应该应用特定的脚本,一旦页面与某个脚本规则匹配,油猴会将该脚本注入到页面中。
- 执行脚本:一旦脚本被成功注入到页面中,它可以立即开始执行。通过自定义的JavaScript代码,可以实现对网页元素、事件和数据进行操作。
4、安装
不同浏览器有不同的油猴脚本插件,这里选择的是当前最好用 Chrome -> Tampermonkey
点击 Chrome 右上角 ... --> 拓展程序 --> 访问 Chrome 应用商店 --> 搜索篡改猴 --> 选择 Tampermonkey 添加到 Chrome 即可
注意:使用插件需要开启开发者模式;拓展程序 --> 管理拓展程序,右上角勾选开发者模式即可
这样就可以愉快的使用油猴脚本了~他就在右上角的拓展程序里
5、Tampermonkey 脚本初体验
在正式开始之前,先简单介绍一下核心头部信息
// ==UserScript==
// @name 文心
// @description Stores and logs a counter of executions.
// @version 0.1
// @match *://*.baidu.com/*
// @grant GM.setValue
// @grant GM.getValue
// @grant GM.xmlHttpRequest
// @connect *
// @grant unsafeWindow
// @require https://code.jquery.com/jquery-latest.js
// ==/UserScript==
- match:脚本匹配规则,支持正则和完整 URL 的形式;如
://*.baidu.com/将匹配所有二级域为 baidu.com 的网页 - grant GM.setValue 系统设置值,类似 localStorage,GM.getValue 则是读取
- grant GM.xmlHttpRequest Tampermonkey 内置的请求模块,用来发起请求
- require 引入外部资源,如 jQuery、自己编写的 js、css 等等
更多关于介绍可以查阅官方文档 Tampermonkey文档
5.1、文心一言
为什么选择文心一言注册而不是 chatGPT?
- 国内站点,更快速方便
- 更能理解国人的需求,如中国菜谱、国家文化、历史等等
大家要对国内的 AIGC 有信心,现在的文心一言已经不是当初那个闹出 红烧狮子头 笑话的 AI 了,它在上述场景中比 chatGPT 具有更好的结果反馈。
文心一言注册 前往官网交互式完成即可~
上周心血来潮,准备整几个小菜好好犒劳一下自己,媳妇大手一挥,转发给我一份菜单;好家伙,又是鱼香肉丝,又是宫保鸡丁,最离谱的是还有北京烤鸭~~~
好嘛,这不是犒劳自己,而是为难自己。但作为一个新时代的程序员 cook,就算学不会,也得先看看,先瞅瞅菜谱再说!
5.2、菜谱自动生成
提示工程:使用 AI 生成文案,是否符合预期,提升工程非常重要;我们的目标是学习做菜,那么肯定希望知道有哪些材料,什么步骤对不对,同时对于新手,应该注意些什么也很重要对不对?一个简单的提示工程如下:生成一篇青椒炒肉的菜谱;包含材料,步骤,注意事项;不得少于 200 字
如何编写油猴脚本?很简单,将你要进行的操作,交给脚本实现
1、构建菜单及结果数据结构
我们现在的目标是生成一系列的菜谱,拿到答案内容,那么首先就需要构建一个菜单数组,以及答案保存的对象
let menu = ['青椒肉丝', '红烧鱼块']; // 菜单
let QA = {}; // 答案
2、分析与 AI 交互行为
打开文心一言网站(需先登录),如果你要提问上述我们生成的提示工程问题,需要怎么做?肯定是在输入域填写内容,然后点发送按钮对不对~
那如果交给 JS 处理,则是获得输入域的 DOM,然后将我们的内容赋值给它;然后获取发送按钮的 DOM,触发点击事件.
通过 F12 即可拿到相关 DOM 的标识,一打开你就会发现进入无限 debugger 断点,这是一种常用的防止调试的办法;虽然不影响我们获取 DOM 标识,能解决掉后面调试代码会方便很多的说,参考 解决浏览器无限 debugger
let inputArea = document.querySelector('textarea'); // 输入域
let submitBtn = document.querySelector('.VAtmtpqL'); // 提交按钮
inputArea.focus();
inputArea.execCommand('inserttext', false, "生成一篇青椒炒肉的菜谱;包含材料,步骤,注意事项;不得少于 200 字");
submitBtn.click();
这里使用聚焦然后触发 inserttext 命令的形式来插入用户行为式填充内容,而不是通过 dom.value 的形式赋值。这是因为这个 textarea 不是一个普通的文本域,而是 react 生成具有双向绑定 dom。
至此,我们就完成了我们 JS 处理与 AI 交互的核心代码
3、完整代码与结果
完整代码
// ==UserScript==
// @name 文心
// @description Stores and logs a counter of executions.
// @version 0.1
// @match *://*.baidu.com/*
// @grant GM.setValue
// @grant GM.getValue
// @grant GM.xmlHttpRequest
// @connect *
// @grant unsafeWindow
// @require https://code.jquery.com/jquery-latest.js
// ==/UserScript==
(async function () {
let menu = ['青椒肉丝', '红烧鱼块']; // 菜单
let QA = {}; // 答案
// 等待页面加载完毕
await sleep(2000);
for (let i = 0; i < menu.length + 1; i++) {
let question = `生成一篇${menu[i]}的菜谱;包含材料,步骤,注意事项;不得少于 200 字`;
setTimeout(() => {
if (i === menu.length) {
// 结束,收集答案
let answerNodes = document.querySelectorAll('.q4y8uP0A');
for (let j = 0; j < answerNodes.length; j++) {
QA[menu[j]] = answerNodes[j].innerHTML
}
let str = JSON.stringify(QA)
alert(str)
} else {
// 提问
changeInputValue(document.querySelector('textarea'), question)
document.querySelector('.VAtmtpqL').click();
}
}, i*30*1000)
}
function sleep (time) {
return new Promise((resolve) => {
setTimeout(resolve,time);
})
}
function changeInputValue (dom,value) {
dom.focus();
document.execCommand('inserttext',false,value);
}
})();
结果展示
4、总结与思考
借助 Tampermonkey 与 AI 交互,拿到了问题答案的内容;不管是借助富文本展示,还是通过 DOM 解析内容再次处理,都拥有不错的适用场景~
上述代码中,我们通过定时器等待 30s,然后默认认为此时 AI 生成答案已经结束,但实际中,我们的问题有复杂有简单,统一等待 30s 肯定不合适; web api 中提供了 MutationObserver 来监听 DOM 元素变化,我们可以借此来精准的判断答案是否生成完全
// 创建一个 MutationObserver 实例,监听 body 元素内子元素的变化
const observer = new MutationObserver(function (mutations) {
let stopCreateBtn = document.querySelector('.mEKFkIX7'); // 停止生成按钮
if (stopCreateBtn && stopCreateBtn.style.display != 'none') {
// TODO: 生成失败,填入问题重新生成
}
let reCreateBtn = document.querySelector('.yyjIo3Fm'); // 重新生成按钮
if (reCreateBtn && reCreateBtn.style.display != 'none') {
// 创建完成,找到最后一个内容容器(即成功生成的内容)
let answerNodes = document.querySelectorAll('.q4y8uP0A');
let len = answerNodes.length;
let content = answerNodes[len - 1].innerHTML;
// TODO: 存储
location.reload();
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
以上,只是油猴脚本的简单使用介绍,抛砖引玉,还有更多有趣的内容等待着探索~
6、结束语
生活中,总有那么一种人,把刻薄当作耿直,把嘴贱当作坦诚,惹得我们心烦气躁,肝火上升。这里给大家介绍一剂良方:陈皮 4.5 克,半夏 3 克,茯苓 3 克,甘草 0.9 克,加 3 大碗水大火煎成 1 碗,然后趁其不备,泼他脸上。
开个玩笑;生活嘛,皮一点才会开心,毕竟