专为程序员设计的浏览器自动化扩展

78 阅读2分钟

在开发 Steward 的过程中,设计过一些有用的 actions,比如阅读模式英语语法高亮,在后续迭代时发现 Steward 本身不适合也难以承载这类功能,因此 iHelpers 应运而生。

在 Chrome 应用商店搜索 iHelpers 安装,代码开源在 github.com/solobat/iHe…

sh_1-min.png

iHelpers 能做什么?

简单的

  • 如上图中显示的阅读模式
  • 给 Twitter / Reddit 添加翻译按钮
  • 同网站只保留一个标签页
  • 同网站视频或直播只令当前标签页播放
  • 配置快捷键可以:快速上一页、下一页,视频进退快慢与音量高低,文章、小说按段落滚动
  • 夜间模式
  • 自动签到

复杂的

  • 豆瓣上复制电影名,自动打开某个影视资源网站并搜索
  • 在某资源网站复制下载链接,直接打开云盘并创建下载任务

如何使用

动作

就是 iHelpers 内置的一些功能,通过右键菜单快捷键可以执行 sh_2-min.png

记录

大部分动作执行后都会产出一条记录(record),可以在 popup 的 Records 面板查看到。 对记录可以执行回放以及转为自动化的操作 sh_3-min.png

自动化

如果你想让某个动作在某些网站的页面自动执行,就需要用到自动化(Automation)。

自动化(Automation)可以单独添加,也可以从 Records 里转成。

它有两个参数,即指令(Instructions)模式(Pattern) : 指令(Instructions):用来描述动作与它的参数。以下图为例,readMode 是动作名,@.article-area 表示动作将应用于 .article-area 这个 css selector 代表的页面元素。

模式(Pattern):表明动作将在哪些页面会自动执行,如 https://juejin.im/post/* 就对应着掘金的所有 post 页面。 sh_4-min.png

脚本 IScript

随着一些复杂功能的加入,配置起来就有点麻烦了,在 ChatGPT 的帮助下,搞了个脚本语言,叫 IScript,基本能覆盖扩展的所有功能。

对比

配置式

Ins

脚本式

script

语法

以下为 IScript 的语法,还有不少问题,见笑了~

Script ::= *empty*
      ::= Automations

Automations ::= Automation
           ::= Automations
Automation ::= automation AutomationHead AutomationBody end

AutomationHead ::= for URLRegString on Stage
Stage ::= '"immediate"'
     ::= '"load"'
     ::= '"delay"'
     
URLRegString ::= string
     
AutomationBody ::= Statements
Statements ::= Statement
          ::= Statements
          
Statement ::= AssignStatement
         ::= NativeStatement
         ::= ApplyStatement
         ::= RequireStatement
         
AssignStatement ::= AssignExp = ValuableExp
               
ValuableExp ::= ValueExp
           ::= Identifier
           ::= ListenExp
           ::= GetValueExp
           ::= BuiltinFunctionCall
           
ValueExp ::= number
        ::= string
        ::= bool
           
ListenExp ::= listen EventNameExp on EventScopeExp
EventNameExp ::= string
EventScopeExp ::= '"global"'
             ::= CssSelectorExp
             
NativeStatement ::= OpenStatement
               ::= ActiveStatement
               ::= WaitStatement
               ::= CloseStatement
               ::= EmitStatement
               ::= ListenStatement
               
OpenStatement ::= OpenExp
OpenExp ::= open URLString as URLRegString
URLString ::= string

ActiveStatement ::= ActiveExp
ActiveExp ::= active

WaitStatement ::= WaitExp
WaitExp ::= wait number
                
CloseStatement ::= close

EmitStatement ::= emit EventNameExp with ArgPairs

ListenStatement ::= ListenExp

ApplyStatement ::= apply ActionNameExp with ArgPairs on CssSelectorExp 
ActionNameExp ::= string

ArgPairs ::= (ArgsExp)
        
ArgsExp ::= empty
       ::= ArgExp
       ::= ArgExp, ArgsExp
       
ArgExp ::= Identifier
      ::= Identifier = ValueExp
      ::= Identifier = Identifier

CssSelectorExp ::= string

RequireStatement ::= require Expression [, ErrorMessage]
ErrorMessage ::= string

Expression ::= ValuableExp ComparisonOperator ValuableExp
ComparisonOperator ::= '>=' | '>' | '<=' | '<' | '=='

BuiltinFunctionCall ::= FunctionName ( CssSelectorExp )
FunctionName ::= 'len' | 'exist'