您好,游客!

您好,新朋友。点击以下按钮加入我们!

脚本审核 [Assessment]

About: Bilibili Fixer - Perfect!
最后编辑于 May 2014 脚本讨论
您好,该脚本目前需要审核,因为您引用了 @require 白名单之外的脚本。
如果需要通过审核(如显示于脚本列表),请将脚本引用改为网络公开的 CDN。

引用的脚本
http://firebfplite.duapp.com/BFP/JS/hmac-sha1.js
http://firebfplite.duapp.com/BFP/JS/enc-base64-min.js
更改为骑牛 CDN:
http://cdn.staticfile.org/crypto-js/3.1.2/rollups/hmac-sha1.js
http://cdn.staticfile.org/crypto-js/3.1.2/components/enc-base64-min.js
如果需要,您也可以将 jQuery 转移到骑牛:
http://cdn.staticfile.org/jquery/1.11.0/jquery.min.js
如果您对 @require 尚有疑问,欢迎参阅代码提交规则

几点:
1. 建议不要使用 Cookie 传递大量数据,另外没发现哪里定义 __secureJS 的值 (外部脚本建议作为「脚本库」提交到站点然后 @require 引用)。参见 2L
2. 避免 eval 的使用; 部分更改范例如下所示:
#683
if (!localStorage.isQSAdded) {
#690
localStorage.isQSAdded = true;
#1808
delete localStorage.isQSAdded;
checkFlagExist 函数可科学避免 Eval 滥用,比如 #280 的 checkLoaded 可以参见这个 JsFiddle 演示

3. 善用 jQuery.. 这样很多代码可以简化很多,如:

#378
$('#setting').click(function () {
$('#settingForm').fadeToggle()
});
#422
$(xml_a).click(function (e) {
e.stopPropagation();
});
#549, jQuery 的 attr 批量设定属性看上去挺美观的。
var createPlayer = function(type) {
var BFP_Player;
if (videoPlay == "lebili" || videoPlay == "videoPlay1") {
BFP_Player = $('').attr({
quality: 'high',
allowfullscreeninteractive: true,
allowscriptaccess: 'always',
allowfullscreen: true,
rel: 'noreferrer',
wmode: 'window',
type: 'application/x-shockwave-flash',

/* 个人更偏向这样写…

flashvars: $.param ({
cid: 'xxx',
...
}),

jQuery 也提供了方便的合并对象的方法:
$.extend ({
a: 1,
b: 2
}, {
c: 3
});

*/
flashvars: VT.getPath() + "&vid=" + VT.getVid()
});
} else {
BFP_Player = $('').css({
overflow: 'hidden',
border: '0'
}).ready(function () {
unsafeWindow.securePlayerFrameLoaded = true;
});
}
BFP_Player.attr ({
id: 'BFP_Player',
src: UT.getURL(videoPlay)
}).addClass('player');

// 如果需要将 jQuery 对象传下去的话就去掉 [0] 吧。
// 如果想保留兼容性可以这样: $(createPlayer()) 初始化。
return BFP_Player[0];
};
#604 多余的 else 分支,另外也可以用 jQuery 来搞
domRemover: function (anything) {
$(DT.domFinder(anything)).remove();
},
最后,建议开发的时候启用 JsHint 插件,很多编写时的提示,如
if (details["onerror"]) {
> ['onerror'] is better written in dot notation.
纯字母可以建议用 details.onerror 这样写更直观。

setTimeout('alert(123);', 500);
> Implied eval. Consider passing a function instead of a string.
因为传入文本等价于 Eval 代码,因此建议将文本转换为(匿名)函数传递。
这样的提示。

另外静态 css 可以作为项目托管到 GitHub 然后引用。虽然国内速度可能没那么快但是够稳定 ( ´_ゝ`)

评论

  • 我没看过这代码,不过__secureJS这个我还是知道是怎么回事的。

    哔哩哔哩的视频引用自新浪等网站,为了不像这些网站发送Referer必须使用HTTPS加载播放器。
    所以播放器在一个HTTPS的iframe里面。
    但是播放器页面全屏需要让top窗格做一些样式上的改变。
    所以需要从iframe向外面做通讯。
    通讯会默认使用postMessage,但是如果浏览器不支持postMessage就会用set/get Cookies的方式来传递数据。
    而且网站自己的策略就是把postMessage过来的数据slice一下就直接扔给eval……

    这一段可以参考 http://static.hdslb.com/js/page.arc.js 这段脚本。
    (hdslb.com 是 bilibili.tv 的一个静态缓存服务器,这段脚本是这个网站自己的。)
    里面会有形如 __SetCookie("__secureJS",""),eval(evalCode) 的代码。
  • 我没看过这代码,不过__secureJS这个我还是知道是怎么回事的。

    哔哩哔哩的视频引用自新浪等网站,为了不像这些网站发送Referer必须使用HTTPS加载播放器。
    所以播放器在一个HTTPS的iframe里面。
    但是播放器页面全屏需要让top窗格做一些样式上的改变。
    所以需要从iframe向外面做通讯。
    通讯会默认使用postMessage,但是如果浏览器不支持postMessage就会用set/get Cookies的方式来传递数据。
    而且网站自己的策略就是把postMessage过来的数据slice一下就直接扔给eval……

    这一段可以参考 http://static.hdslb.com/js/page.arc.js 这段脚本。
    (hdslb.com 是 bilibili.tv 的一个静态缓存服务器,这段脚本是这个网站自己的。)
    里面会有形如 __SetCookie("__secureJS",""),eval(evalCode) 的代码。
    原来如此 多谢解答
  • @JixunMoe 关于JQ的问题 事实上我也是无奈之举 Chrome自从32开始 TM的支持就有点崩坏了 JQ脚本不间断的抽风导致undefined 用Unsafewindow也不是办法 所以就7.0开始慢慢的去除了大部分JQ相关代码(少数未去除其实就是懒)

    关于localStorage的问题 我看到建议说最好使用getItem()和setItem(),清除键值对使用removeItem()所以就没有采取别的方式

    eval的建议非常好 checkFlagExist的例子也不错 32个赞

    domRemover的多余分支其实是打算干点别的事情 所以暂且留着吧...我注释掉好了

  • @JixunMoe 关于JQ的问题 事实上我也是无奈之举 Chrome自从32开始 TM的支持就有点崩坏了 JQ脚本不间断的抽风导致undefined 用Unsafewindow也不是办法 所以就7.0开始慢慢的去除了大部分JQ相关代码(少数未去除其实就是懒)

    关于localStorage的问题 我看到建议说最好使用getItem()和setItem(),清除键值对使用removeItem()所以就没有采取别的方式

    eval的建议非常好 checkFlagExist的例子也不错 32个赞

    domRemover的多余分支其实是打算干点别的事情 所以暂且留着吧...我注释掉好了
    localStorage 我都是怎么觉得方便怎么用(…
    TamperMonkey Beta 没怎么遇到 jQuery 加载失败的情况,很奇怪呢(…
    嘛w
  • 你要不要考虑把你兼容模式的时候那脚本也移动到这个网站上来,然后标记成library?
  • @JixunMoe 被删掉了 几个意思啊= = 删之前给个解释也好吧

    Script has been deleted.
  • 看日志( https://greasyfork.org/moderator_actions )是说是 @srazzano 干的。
    我怀疑是你那兼容模式的脚本是从外面引入的?(但是原因填写的是require有问题啊?)
    你要不要考虑把兼容模式的脚本也传到这个站上来?
  • 看日志( https://greasyfork.org/moderator_actions )是说是 @srazzano 干的。
    我怀疑是你那兼容模式的脚本是从外面引入的?(但是原因填写的是require有问题啊?)
    你要不要考虑把兼容模式的脚本也传到这个站上来?
    不明...我已经改了require了 七牛的CDN

  • 不明...我已经改了require了 七牛的CDN
    猴子挂掉之后你不是从自己服务器上下载了个兼容模式的脚本吗?是不是那个的问题?
    总之再召唤一下管理员……

    @srazzano , Could you please tell him what has been wrong with this script, and what should be modified? thx.
  • 严格来说,脚本调用了白名单地址外的链接…
    GF 对外部脚本的定义不仅限于 @require 的指定

    https://greasyfork.org/help/external-scripts
    User scripts have the technical ability to load and execute other scripts. The @require metadata key is the most straightforward way to accomplish this, but scripts can also, for example, use an XmlHttpRequest to download a script and then inject it into the DOM.

    「用户脚本」可以加载及执行其它脚本,其中最常见的方式为使用 @require 标签引用。但是,脚本也可以通过其他方式,如 xmlHttpRequest 请求一个脚本然后插入到页面。
    囧…
  • 严格来说,脚本调用了白名单地址外的链接…
    GF 对外部脚本的定义不仅限于 @require 的指定

    https://greasyfork.org/help/external-scripts
    User scripts have the technical ability to load and execute other scripts. The @require metadata key is the most straightforward way to accomplish this, but scripts can also, for example, use an XmlHttpRequest to download a script and then inject it into the DOM.

    「用户脚本」可以加载及执行其它脚本,其中最常见的方式为使用 @require 标签引用。但是,脚本也可以通过其他方式,如 xmlHttpRequest 请求一个脚本然后插入到页面。
    囧…
    嘛...兼容模式就是为了万一@require里面的东西没法载入才设置的...总之现在脚本恢复了
  • 你要不要考虑把你兼容模式的时候那脚本也移动到这个网站上来,然后标记成library?
    兼容模式的脚本就是本体 只是用了标签引人到head里面然后自动运行而已
登录注册后才能评论。