李恒道 发表于 2021-12-30 19:17:23

[油猴脚本开发指南]本地文件访问权限与外部开发

# 前文

请注意,如果你准备打开本地文件访问权限,请注意风险性

如果你不了解此功能的危害性,无法权衡利弊,则不建议开启

关于安全性可以大概参考

[油猴脚本开发指南]沙盒机制的前世今生(课外篇,可不看)

https://bbs.tampermonkey.net.cn/thread-182-1-1.html

# 关于浏览器选择问题

该情况通常应用于脚本开发

根据我的个人设置,火狐浏览器是无法打开本地文件权限的

所以本文强制使用Chrome浏览器

如果你使用其他浏览器我是没法提供任何意见的

# Chrome浏览器如何开启文件访问权限

![图片.png](data/attachment/forum/202112/30/190407g55nio79go9t0895.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

点击右侧三个点-》更多工具-》拓展程序-》详情

![图片.png](data/attachment/forum/202112/30/190443rp092mmzrypi6176.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

打开允许访问文件网址

![图片.png](data/attachment/forum/202112/30/190453v8glwawl8aqllicl.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

# 打开Tampermonkey文件访问地址

打开设置-》高级

![图片.png](data/attachment/forum/202112/30/190611ppp4q0p1qm3137p3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

进入安全项-》允许脚本访问本地文件,选择所有本地文件

![图片.png](data/attachment/forum/202112/30/190637hi4rnw1wenjw5uwz.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片.png")

你就可以获取到本地文件啦~

# 关于如何读取本地txt

注意,如果读取本地txt文件,则一定是file:///开头,是三个斜杠!

我们可以使用GM函数,获取

```javascript
// ==UserScript==
//...
// @resource txt1 file:///D:/2.txt
// @grant GM_getResourceText
// ==/UserScript==

const txt = GM_getResourceText('txt1');
console.log(txt);
```

这种情况是在脚本一次性初始化的时候获取txt

如果你想动态获取txt则可以

通过gm_xhr函数进行获取,文本可能出现乱码,所以我们可以使用二进制下载,然后进行编码转换等操作

注意一个问题:gm_xhr函数访问本地文件的时候疑似会忽略我们正常post或get的一些参数以及属性。

如overrideMimeType之类的字段都会被自动抛弃

```javascript

GM_xmlhttpRequest({
    method: "get",
    responseType:'arraybuffer',
    url: "file:///C://Users/30832/Downloads/2.txt",
    headers: { "Content-Type": "text/json,charset=utf-8" },
    onload: async function(r) {
      console.log('-----------------------')
      console.log(r)
      console.log("responseText=",await ab2str(r.response));
    }
});

//ArrayBuffer转字符串
function ab2str(u,f) {
    return new Promise((resolve,reject)=>{
      var b = new Blob();
      var r = new FileReader();
      r.readAsText(b, 'utf-8');

      r.onload = ()=>{
            resolve(r.result)
      }
    })

}
```

我们也可以通过require函数来外部引用代码

这个时候我们可以使用vscode编译器等



这个时候代码是完全同步并且无缓存的,但是关于UserScript头是必须要在脚本编辑器里来进行写的

```javascript
// ==UserScript==
// @name         New Userscript
// @namespace    http://tampermonkey.net/
// @version      0.1
// @descriptiontry to take over the world!
// @author       You
// @match      https://bbs.tampermonkey.net.cn/*
// @icon         https://www.google.com/s2/favicons?domain=baidu.com
// @require      file:///C:/CloudMusic/1.txt
// ==/UserScript==
```

# 关于编辑器问题的一点碎碎念

关于require引用也算经常跟大家重复这些问题

如果你不require file地址

而去require 网络js地址,包括127.0.0.1等局域网地址

依然是存在缓存的,也就是说即使你设置经常刷新,依然会刷新多次才能同步一次你的代码

所以油猴目前常见的方案也就只有这样来进行外部通信,使用外部编辑器来进行书写代码

我也尝试了使用tamperdav

但是效果不显著

https://bbs.tampermonkey.net.cn/forum.php?mod=viewthread&tid=1078&highlight=tamper

其同步速度是极其缓慢的,完全不适用于开发

而且会莫名其妙的同时激活ftp软件、putty软件等乱七八糟的软件

所以不推荐使用tamperdav

tampermonkey对外部编辑器支持还是蛮差的,所以更推荐使用scriptcat做外部编辑器支持

另外重复一遍

如果你require代码则相当于

function (){

require的代码块

你的代码块

}

如果碰到问题请先回忆一下这个

# 结语

那么这节课我们就学习了如何使用外部编辑器来进行开发

撒花~

LinLin00 发表于 2023-12-1 13:16:13

我写的构建工具似乎可以解决外部编辑器的问题, 理论上可以使用任何外部编辑器来写油猴脚本, 比如vscode vim, 能利用上 copilot 插件, 还可以热重载脚本, 自动生成油猴脚本的元数据

https://github.com/LinLin00000000/usbuild

陈公子的话 发表于 2021-12-30 19:38:27

nb                              

王一之 发表于 2021-12-30 19:45:11

为什么不用脚本猫vscode

李恒道 发表于 2021-12-30 20:12:37

王一之 发表于 2021-12-30 19:45
为什么不用脚本猫vscode

其同步速度是极其缓慢的,完全不适用于开发

而且会莫名其妙的同时激活ftp软件、putty软件等乱七八糟的软件

所以不推荐使用tamperdav

tampermonkey对外部编辑器支持还是蛮差的,所以更推荐使用scriptcat做外部编辑器支持
哥哥不看!

王一之 发表于 2021-12-30 22:18:50

李恒道 发表于 2021-12-30 20:12
其同步速度是极其缓慢的,完全不适用于开发

而且会莫名其妙的同时激活ftp软件、putty软件等乱七八糟的软 ...

az。。。。
tampermonkey对外部编辑器支持还是蛮差的,所以更推荐使用scriptcat做外部编辑器支持
这段刚好略过{:4_90:}

李恒道 发表于 2021-12-31 01:18:50

王一之 发表于 2021-12-30 22:18
az。。。。
tampermonkey对外部编辑器支持还是蛮差的,所以更推荐使用scriptcat做外部编辑器支持
这段刚 ...

没关系,因为是你看完我才加的
哈哈哈哈哈

BlenderB 发表于 2023-1-20 16:44:12

gegeniubixxl

lisirgo 发表于 2023-2-7 20:18:10

火狐浏览器 如何读取本地文件?我不清楚如何设置权限,请大神指点。
@require: couldn't load @require from URL 'file:///home/ubuntu/Desktop/demo/es.js': Access to this or all local files is forbidden!

李恒道 发表于 2023-2-7 20:37:49

lisirgo 发表于 2023-2-7 20:18
火狐浏览器 如何读取本地文件?我不清楚如何设置权限,请大神指点。
@require: couldn't load @require fro ...
我也没找到
文章里写了的
你也可以再努努力
找到发个贴~

wwwwwllllk 发表于 2023-4-8 09:56:07

lisirgo 发表于 2023-2-7 20:18
火狐浏览器 如何读取本地文件?我不清楚如何设置权限,请大神指点。
@require: couldn't load @require fro ...

哥哥开启允许访问本地文件应该就可以了
https://bbs.tampermonkey.net.cn/thread-4374-1-1.html   
页: [1] 2
查看完整版本: [油猴脚本开发指南]本地文件访问权限与外部开发