jiacai2050 / gooreplacer.xpi

DEPRECATED. 本仓库采用的 Add-on SDK 技术以废弃。 可参考最新的 WebExtensions 在
https://github.com/jiacai2050/gooreplacer
200 stars 34 forks source link

火狐版gooreplacer貌似有个bug #27

Closed gggccc44 closed 6 years ago

gggccc44 commented 7 years ago

起因是这个帖子https://www.zhihu.com/question/37871481,让有土鳖直接显示中文字幕,但是火狐上的重定向工具没有Owl-redirector这种(我估计又也说不定存在gooreplacer这个bug),然后弄了个重定向规则


https://www.youtube.com/api/timedtext\?(.*)
https://www.youtube.com/api/timedtext?$1&tlang=zh-Hans

在谷歌内核浏览器用gooreplacer测试能正常使用,但是在火狐上不行,研究了半天发现gooreplacer貌似会对XHR这种注入不停重复执行重定向

以上

ArcticLampyrid commented 7 years ago

或许是因为替换后的URL仍然符合https://www.youtube.com/api/timedtext\?(.*)这条正则?

jiacai2050 commented 7 years ago

是的,所以导致无限重定向了。

jiacai2050 commented 7 years ago

可以这么做:

youtube.com/api/timedtext\?(.*)[^(?:tlang=zh\-Hans)]$
youtube.com/api/timedtext?$11&tlang=zh-Hans

注意,这里用的是 $11,正则表达式好像有些问题:

var y = new RegExp("www.youtube.com/api/timedtext\\?(.*)[^(?:tlang=zh\\-Hans)]$")

var s = 'https://www.youtube.com/api/timedtext?hl=en_US&v=lkh4hjyHdWA&caps=asr&signature=7DD9C69C7A8B1CAB0A7A726B864E871D301C151E.D194FCAEFFFCDBC60E759E493ED83BAABDFE1066&asr_langs=it%2Cko%2Cde%2Cja%2Cen%2Cfr%2Cpt%2Cru%2Ces%2Cnl&expire=1500221134&key=yttt1&sparams=asr_langs%2Ccaps%2Cv%2Cexpire&kind=asr&lang=en&fmt=srv1'
console.log(y.exec(s))

输出

[ 'www.youtube.com/api/timedtext?hl=en_US&v=lkh4hjyHdWA&caps=asr&signature=7DD9C69C7A8B1CAB0A7A726B864E871D301C151E.D194FCAEFFFCDBC60E759E493ED83BAABDFE1066&asr_langs=it%2Cko%2Cde%2Cja%2Cen%2Cfr%2Cpt%2Cru%2Ces%2Cnl&expire=1500221134&key=yttt1&sparams=asr_langs%2Ccaps%2Cv%2Cexpire&kind=asr&lang=en&fmt=srv1',
  'hl=en_US&v=lkh4hjyHdWA&caps=asr&signature=7DD9C69C7A8B1CAB0A7A726B864E871D301C151E.D194FCAEFFFCDBC60E759E493ED83BAABDFE1066&asr_langs=it%2Cko%2Cde%2Cja%2Cen%2Cfr%2Cpt%2Cru%2Ces%2Cnl&expire=1500221134&key=yttt1&sparams=asr_langs%2Ccaps%2Cv%2Cexpire&kind=asr&lang=en&fmt=srv',
  index: 8,
  input: 'https://www.youtube.com/api/timedtext?hl=en_US&v=lkh4hjyHdWA&caps=asr&signature=7DD9C69C7A8B1CAB0A7A726B864E871D301C151E.D194FCAEFFFCDBC60E759E493ED83BAABDFE1066&asr_langs=it%2Cko%2Cde%2Cja%2Cen%2Cfr%2Cpt%2Cru%2Ces%2Cnl&expire=1500221134&key=yttt1&sparams=asr_langs%2Ccaps%2Cv%2Cexpire&kind=asr&lang=en&fmt=srv1' ]

可以看到,输出的 group[1] 最后是 srv,不是 srv1,还不知道原因, 在 StackOverflow 上提了个问题

ArcticLampyrid commented 7 years ago

[^(?:tlang=zh\\-Hans)] 这显然是错误用法

ArcticLampyrid commented 7 years ago

我最初的想法是使用零宽断言,然而^(.*)(?!a)$仍然能成功匹配111111111a

jiacai2050 commented 7 years ago

有那么明显嘛? 只是不知道 [^] 里面不能用 group 而已。 😳

有个 trick 的办法,判断 url 最后一个是不是 Hans 结尾:

youtube.com/api/timedtext\?(.*)([^H][^a][^n][^s])$
youtube.com/api/timedtext?$1$2&tlang=zh-Hans
jiacai2050 commented 7 years ago

@1354092549 你说的方式我也试过,主要是*是 greedy 的,所以会尽可能多的匹配。