Giter Site home page Giter Site logo

scriptscat / scriptcat Goto Github PK

View Code? Open in Web Editor NEW
1.2K 25.0 108.0 6.55 MB

脚本猫,一个可以执行用户脚本的浏览器扩展

Home Page: https://docs.scriptcat.org

License: GNU General Public License v3.0

JavaScript 5.20% TypeScript 93.58% HTML 0.62% Smarty 0.25% CSS 0.36%
userscript chrome-extension greasemonkey-userscript webextension

scriptcat's Introduction

ScriptCat

脚本猫,一个可以执行用户脚本的浏览器扩展,万物皆可脚本化,让你的浏览器可以做更多的事情!

文档 · 社区 · 脚本站

English README

GitHub stars Build Status codecov GitHub tag (latest SemVer) Chrome Edge FireFox GitHub All Releases

关于脚本猫

参考了油猴的设计思路并且支持油猴脚本,实现了一个后台脚本运行的框架,提供了一些特殊的 API,让脚本能够做更多的事情.并且提供了一个优秀的编辑器,让脚本代码编写开发更加舒服流畅.

如果觉得好用,顺手点个 Star 吧 ❤❤❤

特性

  • 脚本云同步,更换浏览器/重装,脚本恢复更方便.
  • 脚本订阅,创建自己的脚本合集或者让多个脚本配合使用.
  • 支持油猴脚本,无缝从其它油猴脚本管理器迁移.
  • 后台脚本,可以使你的脚本持续的运行在后台.
  • 定时脚本,可以每日定时执行,每天通过脚本定时处理事务.可用于自动签到,定时提醒等功能.
  • 丰富的 API,相比于油猴,扩展出了更多强大的 API,可以实现更多的功能.
  • 通过沙盒机制确保了用户的安全,用户确定后才会给脚本授予权限.
  • 优秀的编辑器,且提供了 API 的自动补全和 ESLint.
  • 美观的 UI

...更多丰富功能加入中

说明

安装脚本

可以从各大用户脚本市场获取脚本进行安装,脚本猫所支持的后台脚本专门建立了一个市场:后台脚本.

安装方式与油猴一样,同时也是兼容绝大部分油猴脚本的,如果遇到未兼容的脚本,你可以通过issue反馈给我们.

对于开发者来说,也可以参考这些脚本写出自己的脚本来.

开发文档

开发文档尽力完善中,因为是参考油猴的设计,与油猴脚本相通的地方很多,就算你使用其它油猴管理器,你也可以参考脚本猫的文档来开发!

如果开发文档有什么错误,或者你想进行补全,你可以点击下方的编辑此页进行修改.

安装扩展

我们已经上架了扩展商店,如果你无法访问商店内容,请在release中下载 zip 包手动进行安装

扩展商城

交流

License

本项目使用 GPLv3 协议开源, 请遵守协议规定.

FOSSA Status

贡献

请参考 贡献指南

鸣谢

感谢以下开发者对 ScriptCat 作出的贡献,有你们 ScriptCat 才能变得更好!

scriptcat's People

Contributors

cesaryuan avatar codfrm avatar dreamnya avatar duoluodexiaoxiaoyuan avatar fossabot avatar joriscai avatar liweny16 avatar przeblysk avatar rehtt avatar ssmjae avatar windrunnermax avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

scriptcat's Issues

GM_addValueChangeListener函数问题

最近在写一个跨网页的脚本,发现了GM_addValueChangeListener的这个问题。
同样的写法在 Tampermoney 里运行正常,而脚本猫里无效。由于脚本的代码过于复杂,下面的代码是同样的思路,能复现该问题。

// ==UserScript==
// @name         New Userscript
// @match        *://www.baidu.com/
// @match        *://fanyi.baidu.com/*
// @grant        GM_setValue
// @grant        GM_addValueChangeListener
// ==/UserScript==

if (document.domain == "fanyi.baidu.com")
    $('#baidu_translate_input').keyup(function () { GM_setValue("text", document.getElementById("baidu_translate_input").value) })
else
    GM_addValueChangeListener("text", function (name, old_value, new_value, remote) {
        console.log(name, old_value, new_value, remote)
        document.querySelector("#kw").value = new_value
    })

另外,脚本猫的编辑页面有些小问题:

  1. 脚本的META编辑后无法保存
  2. 打开多个编辑页使用快捷键Ctrl+S只保存最右侧标签

反馈集合

建议:GM_setValue储存的数据建议增加一栏,不要在数据前用数据类型英文首字母标注,手动修改时容易出错
建议:设置增加开关脚本时自动刷新当前网页功能,Tampermonkey 和暴力猴都有的,调试时挺有用的
bug:打开脚本列表主页后,拉动主页标签成独立窗口后,此时点击插件图标当前页运行脚本处会出现多个同名历史代码在同时运行,此bug我不知道什么操作引起的,你可以尝试复现

能不能脚本启动脚本?

比如说 await CAT_runScript('scriptName'); 这样可以从一些页面脚本,直接调用后台脚本、定时脚本;或者定时脚本相互调用。

登录状态丢失

每次登录以后,关闭浏览器过一段时间打开浏览器,插件的登录状态丢失,导致云同步经常失败。
操作系统:win7 、win11、UOS
浏览器:360极速浏览器、EDGE

GM_xmlhttpRequest 不兼容,无法发送自定义的请求头

在scriptcat中使用如下代码指定headers

GM_xmlhttpRequest({
        method: 'GET',
        url: 'http://xxxx',
       headers:    {
            referer:  "http://microsoft.com",
            origin:   "http://microsoft.com"
       }

发现它会把Origin和Referer请求头变成

X-Cat-20379D59-3753-4Bc2-9Aac-7Fd1601C4454-Origin: http://microsoft.com
X-Cat-20379D59-3753-4Bc2-9Aac-7Fd1601C4454-Referer: http://microsoft.com

而且还莫名多了一个X-Cat-xxx-Scriptcat的出来
X-Cat-20379D59-3753-4Bc2-9Aac-7Fd1601C4454-Scriptcat: true

导致最终请求失败。

而我换成用tampermonkey去验证了一下,发送的请求头则都是标准和正确的值,也没有多余的X-Cat-xxx-Scriptcat出现。

这是为什么,需要如何避免?

Firefox最新版,后台脚本

local html file not run in scriptcat

when you set match is local file
the script is show run this user script
but not any operation
my code only have alert
but it is not run and show alert
`// ==UserScript==
// @name New Userscript
// @namespace http://tampermonkey.net/
// @Version 0.1
// @description try to take over the world!
// @author You
// @match file:///C:/Users/%E6%B5%8B%E8%AF%95/test.html
// @ICON https://www.google.com/s2/favicons?sz=64&domain=undefined.
// ==/UserScript==

(function() {
'use strict';
alert('888')

// Your code here...

})();`

GM_addValueChangeListener逻辑问题

脚本猫侦听到两次值的更改,开始侦听到一次,3秒后再侦听到一次值的更改,但旧值与新值获取逻辑有问题

This is an image

同样的代码油猴只侦听3秒后的更改值,运行如下:

三秒后输出
This is an image

不能很好的兼容油猴

自动无缝翻页这个脚本,有一个双击左边空白选项(默认打开好像),点击后(点击一下想要关闭)就会多一个你将要打开的选项(关闭的选项),然后在点击回去(打开的选项)脚本数就涨,再点击回去(关闭的选项)脚本数接着涨。目前就发现了这一个脚本有这毛病。
snipaste_20211230_175503
snipaste_20211230_175529
snipaste_20211230_175628

一些小建议...

  1. 日志带时间
  2. 支持在网页上的点击右键菜单中运行
  3. 新建脚本之后默认开启
  4. 保存之后列表自动刷新

脚本列表的设计小瑕疵

脚本列表里的最后一个脚本,它的编辑按钮——一个笔一样的icon,被那个大的加号“+”挡住了

如果导入?

我tampermonkey,一堆脚本,想迁移过来。
tampermonkey 能很方面的导出到压缩包,但我还不清楚怎么导入压缩包。
是不是还没这功能

[重构]一些代码重构记录

之前eslint配置错误,现在修复后代码大片大片的红。。。。。这种eslint的错误就看一个处理一个吧,太多了😭。

然后一些设计的地方也比较乱,期望进行整理,记录如下

消息中心重构

此处将sendResponse删除,将返回值作为send内容,undefined不进行发送,另外对其他发消息的代码进行整理:apps/Manager::listenerMessage 主要是规范好 Promise的返回值 <any> 表示将发送数据 <void> 表示将由方法自己发送数据

export type MessageCallback = (body: any, sendResponse: (response?: any) => void, sender?: chrome.runtime.MessageSender) => Promise<any> | any;

    // 监听msg操作的只能有一个
    public static listenerMessage(topic: string, callback: MessageCallback) {
        const val = new Map();
        topicMap.set(topic, val);
        val.set(callback, (msg: any, port: chrome.runtime.Port) => {
            callback(msg, (resp) => { port.postMessage(resp) }, port.sender);
        });
    }

后台grant通信

一些油猴的API通信方式优化一下,主要是postMessage,让返回值/resolve也支持返回

export type Api = (grant: Grant, postMessage: IPostMessage, script?: Script) => Promise<any> | any;

资源释放

支持资源释放freed

// 资源释放,后台脚本只有脚本id,当窗口是关闭而不是刷新时windowClose为true
// TODO: 实现脚本id
export type FreedCallback = (id: number, tabId?: number, windowClose?: boolean) => void;

GM_registerMenuCommand优化

将释放的逻辑放到freed中,获取和点击的逻辑放到listener中,删除 ScriptManager::listenScriptMath 中的相关逻辑

[BUG]获取脚本存储的值为旧值

在调试脚本时,发现GM_getValue每次获取都为旧值。
如下图,值已经修改为字符串的123123,但是获取到还是123(这个值是修改为123123之前的值)
image

image

debug插件源码

通过调试插件源码,发现插件调用了background.js的buildScriptCache方法
image
在buildScriptCache方法中debug,发现resolve的值已经是最新的值了。
image
image
然而在实际获取的返回值,发现是旧的值,如下图:
image

怀疑的问题出现的地方

插件代码中有其他对返回值进行转换?

我测试过firefox,发现firefox也有这个问题,个人比较偏向是插件层做了数据传输过程的转换,从而导致数据前后不一致,但是在查看源码暂时没找到。大佬是否能解答一下?

浏览器的问题

background和前端的代码属于不同进程,进程之间传输数据出错了?

低版本浏览器运行异常

低版本浏览器好像会因为Monaco-editor的原因导致打开显示空白页面,background报错

某打包浏览器可复现

后台脚本 xhr 加载blob 进不了onload

// ==UserScript==
// @name         New Userscript2222
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      0.1.0
// @description  try to take over the world!
// @author       You
// @crontab      * * once * *
// @grant        GM_log
// @grant    GM.xmlHttpRequest
// @grant        GM_xmlhttpRequest
// @connect baidu.com
// @connect httpbin.org
// ==/UserScript==
console.log = (...arg) => {
    GM_log(arg.map(it => typeof it == 'string' ? it : JSON.stringify(it)).join(","))
}

return new Promise((resolve, reject) => {
    // Your code here...
    // downloadImg('http://httpbin.org/image/jpeg').then(resolve);
    GM.xmlHttpRequest(
        {
            method: 'GET',
            url: 'http://httpbin.org/image/jpeg',
            // headers: { 'Content-Type': 'text/xml', "Accept": "text/xml" },
            responseType: "blob",
            // data: xmlstring,
            onload: function (response) { console.log('load');resolve() },
            onreadystatechange: function (response) { console.log('statechange', response) },
        }
    )
});

页面能进onload, 后台就进不了

[BUG]后台脚本无法使用xlsx导出数据文件?

chrome版本: 97.0.4692.71(正式版本) (64 位)
脚本猫版本: 0.7.7

以下测试脚本, 在脚本猫的后台脚本中无法生成文件, 在普通脚本中可以

脚本:

// ==UserScript==
// @name         New Userscript
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      0.1.0
// @description  try to take over the world!
// @author       You
// @background
// @require      https://cdn.bootcdn.net/ajax/libs/xlsx/0.17.4/xlsx.full.min.js
// ==/UserScript==

return new Promise((resolve, reject) => {
    let output = [
        {name: 'John', Age: 18}, 
        {name: 'Mike', Age: 20}
    ];
    let o = XLSX.utils.json_to_sheet(output);
    let wb = XLSX.utils.book_new();
    XLSX.utils.book_append_sheet(wb, o, 'Sheet1');
    XLSX.writeFile(wb, 'test 2022-1-7.xlsx');
    resolve();
});

GM_xmlhttpRequest 提交blob的时候有问题

在tampermonkey 和scriptcat里行为不一样;
scriptcat里没有提交上去,好像只提交了一个[object object]字符串

// ==UserScript==
// @name         test Userscript
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        http*://*/*
// @icon         https://www.google.com/s2/favicons?domain=httpbin.org
// @grant        GM_xmlhttpRequest
// ==/UserScript==

(function () {
    'use strict';
    const url = 'http://httpbin.org/image/jpeg'
    GM_xmlhttpRequest({
        method: 'GET',
        url: url,
        responseType: "blob",

        onload: function (req) {
            console.log(req.status, req.response, typeof req.response)
            GM_xmlhttpRequest({
                method: 'PUT',
                url: 'http://httpbin.org/anything',
                data: req.response,
                onload: function (req) {
                    console.log(req.status, req.response)
                }
            })

        }
    });

    // Your code here...
})();

@require 不支持本地文件

// ==UserScript==
// @name         New Userscript
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://www.baidu.com/*
// @icon         https://www.google.com/s2/favicons?domain=baidu.com
// @require      file:///Users/xxx/xxx/xxx/bundle2.js
// @grant        GM_log
// ==/UserScript==

(function() {
    'use strict';
// Your code here...
    console.log('window.initDb')
    console.log(window.initDb())

    // Your code here...
})();

我已经开启了 允许访问文件网址 选项

[BUG]x-javascript的脚本加载为空

我想接入腾讯云的前端监控,来做一些日志上报。脚本链接为:https://cdn-go.cn/aegis/aegis-sdk/latest/aegis.min.js

测试时,发现脚本的响应头类型为:application/x-javascript。导出加载时,content为空,如下图

image

image

调试发现,代码中有判断响应头返回的类型。在这个map中加上application/x-javascript则可以正常了。

image

建议加上application/x-javascript这个响应类型。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.