Git Product home page Git Product logo

urlredirector's Introduction

URLRedirector

使用 WebExtension 方式编写的 Firefox URL 重定向扩展,并逐步发展到处理整个 webRequest 过程。

扩展的开发受 gooreplacer 启发,由于 gooreplacer 在 MAC 下运行时会遇到停止运行的问题,因此采用 WebExtension 方式实现,目前测试结果良好。扩展仅支持正则表达式替换方式,不支持通配符。

扩展可以处理 URL 的自动重定向,可用于帮助网页开发和调试,以及解决国内无法访问 google CDN 之类的问题( stackoverflow 等国外网站再也不用等了^_^)。

firefox 版本已上线,上架地址 https://addons.mozilla.org/zh-CN/firefox/addon/urlredirector/,安装扩展前,请升级 firefox 到 48.0 以上的最新版本。

chrome 版本已上线,商店地址 https://chrome.google.com/webstore/detail/maolmdhneopinciaokgohljhpdedekee。 (无法科学上网时可通过开发者模式加载扩展:在 release 中找到 chrome 版本的 zip 压缩包,解压后,在 chrome 中打开开发者模式,加载已解压的扩展程序)

edge 版本提供离线包(注册需要 RMB :-< ),在 release 中可找到 edge 版本的 zip 压缩包,解压后,在 edge 的 about:flags 中启用开发者模式 (英文说明),加载已解压的扩展程序。

Release 中包含了各个版本的压缩包 https://github.com/fengyc/URLRedirector/releases

供用户使用的在线规则有:

其它用户提供的规则:

版本和特性列表

版本变更历史请查看 CHANGELOG 。

目前支持的浏览器:firefox、chrome、edge

目前支持的特性:

  1. 支持在线规则订阅、在线规则自动更新
  2. 可禁用在线规则的某条特定规则(更新后被覆盖)
  3. 支持自定义规则
  4. 支持规则测试示例
  5. 支持浏览器同步(chrome 或 firefox 53.0)
  6. 支持云盘同步(目前支持onedrive)

限于 WebExtension 的能力,目前不支持以本地文件方式导入、导出配置。

其它说明

  1. 规则示例

    简单规则,将 a.com 替换为 b.com :

     原始地址 a.com  目标地址 b.com
     原始请求 https://www.a.com
     重定向到 https://www.b.com
    

    简单正则表达式:

     原始地址 a.*.com 目标地址 b.com
     原始请求 https://www.abc.com
     重定向到 https://www.b.com
    

    使用原始地址的部分信息:

     原始地址 (\d+).com  目标地址 com/$1
     原始请求 https://www.a.1.com
     重定向到 https://www.a.com/1
    
  2. 内部实现

    内部规则 Rule 为简单 javascript 对象,具体可见 src/model.js

     {
         description: <规则描述,可选>
         origin: <原始地址正则表达式,必需>
         exclude: <排除地址正则表达式,可选>,
         methods: <原始请求方法列表,可选>
         types: <URL 资源类型列表,可选>
         target: <目标地址正则表达式,必需>
         example: <用于测试的示例地址,可选>
         enable: <是否启用,可选>
     }
    

    不在 Rule 对象描述中的字段可随意添加,不影响结果; 请求方法可为 GET / POST / DELETE 等等,如 ["GET", "POST"]; URL 资源类型见 ResourceType

    在线规则使用一个包含了规则列表的 json 格式的文件表示:

     {
         version: <版本号,可选>,
         rules: <规则列表,必须>
     }
    

    整合了在线规则和规则对象的示例文件见 tools 目录下的 rules_demo.json

    目前支持两种格式,通过 version 进行区分。 (1)不包含 version 或 version < 1.0 时,使用 gooreplacer 定义的格式,见 tools/gooreplacer.gsonhttps://github.com/jiacai2050/gooreplacer4chrome/raw/master/gooreplacer.gson ; (2)包含 version 且 version >= 1.0 时,使用新格式,见 tools/rules.json

    两种格式的主要区别在于 rules 字段,在 gooreplacer 中 rules 为对象,在新格式中,rules 为列表(为了在后期能更加方便地支持规则排序)。

由于在线规则使用 json 格式,因此需要注意 json 转义符问题, json 在线校验工具 可检查文件内容是否符合 json 格式。

用户定制的本地规则优先于在线规则,可覆盖在线规则。

( grunt 是个好工具,打包真方便)

帮助 URLRedirector

我需要你的帮助来提高 URLRedirector 的功能和质量,你可以从以下几个(但不限于)方面提供你力所能及的帮助:

  1. 在 issue 中提出你遇到的问题或需要的功能
  2. fork 本仓库,贡献你的代码或文档,并提交 pull request
  3. 参与功能和 bug 的讨论

下载代码和构建

  1. 下载代码

    fork 之后从 github 上下载代码

     git clone <xxx>
    
  2. 安装工具

    安装 node.js 和 grunt (用于打包)

    MAC 上安装 node.js ::

     brew install node
    

    ubuntu 上安装 node.js ::

     sudo apt-get install nodejs
    

    检查是否安装成功 ::

     which npm
     npm --version
    

    安装 grunt ::

     npm install -g grunt-cli
    

    在源代码根目录上 ::

     npm install
    

    检查是否安装成功 ::

     which grunt
     grunt --version
    
  3. 构建

    在源代码根目录上 ::

     grunt
    

    将在 dist 目录下生成 2 个 zip 文件,文件名格式为 URLRedirector-<浏览器>-<版本号>.zip,为可上传到 firefox 和 chrome 商店进行审核和发布。

License

Copyright © 2016 Yingcai FENG

The MIT License (MIT)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

urlredirector's People

Contributors

ettavolt avatar fengyc avatar krasnayaploshchad avatar urbalazs 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

urlredirector's Issues

BUG:请求URL包含重定向目标地址时,会发生反复重定向

请求的地址:
URL1: https://meta.stackoverflow.com/questions/258288/use-of-ajax.proxy.ustclug.org-not-china-friendly

下面是在URLRedirector上自定义的规则:
{ "version": "1.0", "rules": [ { "description": "", "origin": "fonts.googleapis.com", "exclude": "", "methods": [ "GET" ], "types": [], "target": "fonts.proxy.ustclug.org", "example": "", "enable": true }, { "description": "", "origin": " themes.googleusercontent.com", "exclude": "", "methods": [ "GET" ], "types": [], "target": "google-themes.proxy.ustclug.org", "example": "", "enable": true }, { "description": "", "origin": "secure.gravatar.com", "exclude": "", "methods": [ "GET" ], "types": [], "target": "gravatar.proxy.ustclug.org", "example": "", "enable": true }, { "description": "", "origin": "ajax.googleapis.com", "exclude": "", "methods": [ "GET" ], "types": [], "target": "ajax.proxy.ustclug.org", "example": "", "enable": true } ] }

当启用重定向下,上述url地址被反复重定向。
错误截图如下:
default
default

当我在 自定义规则->排除地址 中,加入meta.stackoverflow.com后,可正常访问,但从正向逻辑上看有点说不通,希望作者进一步进行验证,谢谢。

软件配置:firefox 56.0 64bit; URLRedirector version:1.3.11

在此,感谢作者。

无法下载在线规则

插件版本:1.3.10
Chrome版本: 73.0.3683.103(正式版本) 64 位,目前最新版本
插件安装方式:谷歌插件商店
问题:点进下载在线规则就一直显示正在下载,重启也没有用

增强建议:自动保存

很不习惯去点保存按钮,测试时经常忘记,希望能够 新建规则-确定 后自动保存生效。

chrome上架

整理和测试 chrome 的兼容性,为上传到 chrome 商店做准备。

几点易用性改进和功能性改进建议

易用性改进

  • 重复申请 #23 中的以下需求

    • URL Encode 和 URL Decode 功能,很多跳转链接 encode 了目标链接
      具体实现可以参考Redirector

    • 自动测试规则是否匹配
      Redirector即为自动测试,十分方便
      该界面为用户输入界面,自动检测规则强度不会很高,一般不会产生性能问题

    • 在左侧勾选上的规则和禁用的规则用不同的颜色加以区分
      建议已禁用规则用灰色或其他淡色表示,以下为Redirector中的示例

  • 排序按钮很小并且没有对中,按起来稍有不便,而且看起来不爽。建议增加按钮尺寸及所在单元格的覆盖率
    当前样式

    改动后样式(示例)

  • 和上一条类似,winform风格的规则复选框很小,按起来很别扭,希望采用更加metro风格的较大的复选框,如果可以的话最好可以整行选择。另外截图中也有禁用规则变灰色的样式示例
    当前样式

    更大的复选框,灰色区分的禁用规则

    整行选择的示例(百度网盘)

功能性改进

  • 建议当用户更改了规则及其他选项而没有保存时,在离开、关闭、刷新设置页面时弹出模态提示对话框,提醒用户是否要放弃更改。(例如:confirm("你有未保存的改动,如果离开页面这些改动将丢失\n是否继续?")
  • 用户点击保存按钮后提供反馈信息(例如显示500ms的保存成功标签或Notification通知)
  • 进行删除规则等操作时提示用户,确认操作(那几个按钮很小而且靠的很近,一不小心就一夜回到解放前)
  • 若所有危险操作均有提示,可以考虑自动保存所有更改(就像Redirector一样)
  • "目标地址"可以接受一个函数 (src_uri)=>{return dst_uri}
    说明一下,这是Mason及其某个改版所增加的功能,因为在某些特殊情况下,仅靠正则的反向引用无法或者难以完成所需的重定向操作。
    假设需求将abc.com/f-{x}.html重定向到abc.com/f-{y}.asp,其中{x}, {y}为相关但不相同的字符串。例如y=x+4,需要将abc.com/f-14.html重定向到abc.com/f-18.html,该操作无法简单以正则表达式完成。
    若目标地址接受一个接收并返回一个字符串的函数,则很容易能够解决。例如,上述需求,只需在“目标地址”内填入href=>{let fid=href.match(/-(\d+)/)[1];return href.replace(fid, parseInt(fid)+4);}

题外话

话说这个扩展地址里填的究竟是通配符还是正则表达式?似乎能够识别一些正则语法,但是又不强制要求转义特殊字符?
原来直接从界面里得到的regex会自动转义/之类的符号,只需要像字面regex一样写就可以了。

建议增加订阅规则展开功能

怎么说呢,就是ABP那样,订阅了一个列表,能取消或启用其中的任意规则。
这样一来可以给最终用户以更大的自由和选择,也可以使 #13 在订阅列表下生效。
现在有点像uBlock,一荣俱荣,一损俱损。

规则执行之疑问

订阅这条规则:
https://raw.githubusercontent.com/ivysrono/URLRedirectorRules/master/gooreplacerWithDecentraleyes.json

生效后就很奇怪了,大多数测试都很快捷,如:
https://themes.googleusercontent.com/static/fonts/antic/v4/hEa8XCNM7tXGzD0Uk0AipA.ttf
https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js

但部分测试完全不成功,空白页面一直转圈,如:
https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js
https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js

这是为什么?是不是排除规则导致的问题?

另外,正则表达式与简单规则对比,会不会有性能上的差距?

能否增加 UpgradeMixedContent 功能

功能来自:UpgradeMixedContent 扩展
简述:
main_frame 为 https 但页内有 http 资源时,浏览器会默认禁止主动性资源如 JS,目前还会放行被动型资源如 image,这一行为由浏览器完成,扩展基本不能干预。
昨天发现的 UpgradeMixedContent 扩展提供了目前仅见的干预思路:给所有的 http 资源插入一个 upgrade-insecure-requests ,这样浏览器就会尝试用 https 来访问本会被 MCB 的资源。
缺陷:
UpgradeMixedContent 扩展是默认全局使用的,于是部分资源,主要是图片就会被破坏,如 好奇心日报
该扩展作者是个极端派,他认为没有加密的资源就不应该被载入。

建议:
本扩展重定向包含所有资源类型,能否加入该功能,这样我就能把部分页面默认重定向到 https 了,如 https://i.gtimg.cn/

HTTPS-Everywhere 也开始讨论这个问题了:EFForg/https-everywhere#8506

Cant get it to work - "storage is null"

Hi there, sorry no chinese, using google translate to follow you. Found this plugin to be very forward-looking and it should cover most of my daily needs.

But I'm stuck at a very early stage of installing it to Firefox, tried offline 1.3.2 last release (https://github.com/fengyc/URLRedirector/blob/master/tools/urlredirector_offline-1.3.2-an%2Bfx.xpi)

I can't create rules, download rules (found that button using google translate :)), I always see "storage is null" and it's variations in console.
I tried installing on clean profile, then tried to manually enable in about:config every storage option, but still no luck.
Please help and advise, as I want this plugin for daily use and follow your Issues here though don't know chinese.. in forward maybe I can be usefull to translate menu at least to english.

This is what console shows in different versions of firefox, my last try to install it was few days ago:

===============51.0.1 release

Error: storage is null (unknown)
TypeError: storage is null[Learn More] options.js:499:9
moz-extension://00eea6c7-4e0f-4a34-9d5d-e9a4244cb788/options/options.js:499:9
jQuery.event.dispatch moz-extension://00eea6c7-4e0f-4a34-9d5d-e9a4244cb788/static/js/jquery.js:4736:16
jQuery.event.add/elemData.handle moz-extension://00eea6c7-4e0f-4a34-9d5d-e9a4244cb788/static/js/jquery.js:4549:6
TypeError: storage is null[Learn More] options.js:215:1
displayAll moz-extension://00eea6c7-4e0f-4a34-9d5d-e9a4244cb788/options/options.js:215:1
moz-extension://00eea6c7-4e0f-4a34-9d5d-e9a4244cb788/options/options.js:525:5
jQuery.event.dispatch moz-extension://00eea6c7-4e0f-4a34-9d5d-e9a4244cb788/static/js/jquery.js:4736:16
jQuery.event.add/elemData.handle moz-extension://00eea6c7-4e0f-4a34-9d5d-e9a4244cb788/static/js/jquery.js:4549:6

===============52b9
storage is null background.js:139
handleRedirect moz-extension://5832083b-dc46-4bb0-9bde-a9b30dbb3077/background.js:139:1
runSafeSyncWithoutClone resource://gre/modules/ExtensionUtils.jsm:71:14
runSafeSync resource://gre/modules/ExtensionUtils.jsm:104:37
runSafe resource://gre/modules/ExtensionCommon.jsm:123:32
receiveMessage resource://gre/modules/ExtensionChild.jsm:586:49
_callHandlers/< resource://gre/modules/MessageChannel.jsm:574:17
_callHandlers resource://gre/modules/MessageChannel.jsm:573:14
_handleMessage/deferred.promise< resource://gre/modules/MessageChannel.jsm:637:7
_handleMessage resource://gre/modules/MessageChannel.jsm:634:24
bound _handleMessage self-hosted:917:17
receiveMessage resource://gre/modules/MessageChannel.jsm:165:5

TypeError: storage is null[Learn More] options.js:150:22
moz-extension://5832083b-dc46-4bb0-9bde-a9b30dbb3077/options/options.js:150:22
jQuery.event.dispatch moz-extension://5832083b-dc46-4bb0-9bde-a9b30dbb3077/static/js/jquery.js:4736:16
jQuery.event.add/elemData.handle moz-extension://5832083b-dc46-4bb0-9bde-a9b30dbb3077/static/js/jquery.js:4549:6

Error: storage is null (unknown)

===============nightly 030517

storage is null background.js:139
handleRedirect moz-extension://45e88511-8a3a-499f-bd26-bd276faba481/background.js:139:1
runSafeSyncWithoutClone resource://gre/modules/ExtensionUtils.jsm:71:14
runSafeSync resource://gre/modules/ExtensionUtils.jsm:104:37
runSafe resource://gre/modules/ExtensionCommon.jsm:123:32
receiveMessage resource://gre/modules/ExtensionChild.jsm:633:49
_callHandlers/< resource://gre/modules/MessageChannel.jsm:580:17
_callHandlers resource://gre/modules/MessageChannel.jsm:579:14
_handleMessage/deferred.promise< resource://gre/modules/MessageChannel.jsm:643:7
_handleMessage resource://gre/modules/MessageChannel.jsm:640:24
bound _handleMessage self-hosted:915:17
receiveMessage resource://gre/modules/MessageChannel.jsm:165:5

TypeError: storage is null[Learn More] options.js:150:22
moz-extension://45e88511-8a3a-499f-bd26-bd276faba481/options/options.js:150:22
dispatch moz-extension://45e88511-8a3a-499f-bd26-bd276faba481/static/js/jquery.js:4736:16
add/elemData.handle moz-extension://45e88511-8a3a-499f-bd26-bd276faba481/static/js/jquery.js:4549:6

Error: storage is null (unknown)

TypeError: storage is null[Learn More] options.js:499:9
moz-extension://45e88511-8a3a-499f-bd26-bd276faba481/options/options.js:499:9
dispatch moz-extension://45e88511-8a3a-499f-bd26-bd276faba481/static/js/jquery.js:4736:16
add/elemData.handle moz-extension://45e88511-8a3a-499f-bd26-bd276faba481/static/js/jquery.js:4549:6

增加事件监听点 events 和执行动作 action 支持

监听点 events https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/webRequest 在指定的事件上进行处理

为支持更加丰富的功能,引入可扩展的 action 支持,用于表示该条规则的动作,包括:

  • cancel 取消请求
  • redirect 重定向
  • skip 跳出执行
  • 其它更多的动作...

此功能影响较大,需要小心设计,实现此项功能在支持 #10 #15 方面更加简单,同时能带来更强的扩展能力。

能否对重定向的URL做出类型区分

比方说区分纯地址栏地址/页内图片/脚本/等等。
有些东西,比方说谷歌图片外链,我只想在地址栏时显示原图,重定向页内元素的话会导致页面布局混乱。

增加规则测试功能

增加规则测试功能,在规则创建时,允许加入一个 example ,同时对该 example 进行转换测试,便于及时发现规则的问题

正则匹配测试正常,但是打开地址不工作

地址示例 https://apps.apple.com/ca/app/keyboard-maestro-control/id298045982?l=fr
原始地址 (ht|f)tp(s?)://apps.apple.com/.*?/
目标地址 https://apps.apple.com/cn/
image

地址示例 https://avmoo.net/cn/movie/f9fad9ca70773497
原始地址 (ht|f)tp(s?)://avmoo.(.*?)/
目标地址 https://avmoo.asia/
image

插件是正常工作的,随便测试了一个不用匹配的1.com替换为baidu.com是正常工作的。
既然测试地址替换都正常,为什么没起作用呢?

工作环境 Chrome 版本 77.0.3865.75(正式版本) (64 位)

how to get apis.google.com/js/platform.js?

  1. now only can do:
    "origin": "apis.google.com/js/(api|plusone).js$",
    "target": "cdn.rawgit.com/jiacai2050/gooreplacer/gh-pages/proxy/$1.js",

  2. but cdn.rawgit.com/jiacai2050/gooreplacer/gh-pages/proxy/platform.js not exist!

thank you !!!

关于 CORS 的问题

替换 cdnjs.cloudflare.com 域名至国内反代后,在访问 cdnjs.com 时会出现 js 无法加载的状况。

返回的 console log 类似于:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://cdnjs.cloudflare.com/ajax/libs/pace/1.0.2/themes/orange/pace-theme-minimal.min.css. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
None of the “sha256” hashes in the integrity attribute match the content of the subresource.

看起来似乎是因为 CORS 的问题...

扩展设置标签页打开时从图标启用扩展失效

重现步骤:

1、打开本扩展设置标签(moz-extension://3f879fe5-b00d-4b1d-9a1a-15607d3909e3/options/options.html ),取消勾选“开启重定向”并保存。不要关闭该标签页;

2、点击扩展图标“R”,弹出选项,勾选“开启重定向”;

3、切换到前述标签页并刷新,或新打开一个本扩展设置标签,可见“开启重定向”依然没有勾选。但此时点开扩展图标“R”,可见“开启重定向”保持勾选状态。此时实际测试也可以确定本扩展未启用。

4、如果是之前为勾选状态,打开着本扩展设置标签页,从图标弹出菜单中取消勾选,则设置标签页会同步取消。

$10+ 不能正常解析

"origin":
^http://((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))/video.study.163.com/(edu|yooc)-video/

"target":
https://video.study.163.com/$11-video/

"example":
http://153.99.174.201/video.study.163.com/yooc-video/nos/mp4/2014/11/27/958007_shd.mp4……

"result":
https://video.study.163.com/153.99.174.2011-video/nos/mp4/2014/11/27/958007_shd.mp4……

建议在选项页面中实现响应式设计

我在 Firefox for Android 使用这个扩展程序的时候感觉效果非常好,很多因为某些 CDN 的问题受到影响的页面都能流畅加载。但问题是,选项页面在手机上感觉不太方便,如果能运用响应式网页设计来改进,使页面上的一些选项能根据屏幕宽度来适配,操作起来就方便多了。

是否提供排除规则

总有些场合需要对主规则进行排除,无论是简化规则复杂程度,还是变通解决 #6

Opera 上架

在 addons.opera.com 上架以后,URLRedirector 扩展就可以为 Opera、Yandex 用户所用。

希望添加几个功能

  • URL Encode 和 URL Decode 功能,很多跳转链接 encode 了目标链接
  • 加入是否只重定向一次的选项,防止无限循环
  • 自动测试规则是否匹配
  • 在左侧勾选上的规则和禁用的规则用不同的颜色加以区分
  • 当页面滚动到以下两行的下面时,悬浮起来方便点击按钮
    2017-04-16_181123
    2017-04-16_181206

另外提个小建议,可否更换图标为透明底色?自从不小心看了一眼浏览器右上角跟其他灰图标比较了下后强迫症上来了,不过不改也无所谓,我自己用样式更换也行
2017-04-16_181726

附上我用的CSS,有想更换图标的朋友可以直接使用:

@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
#urlredirector_fengyc-browser-action {
  list-style-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACDUlEQVR4nO3a603DMBiF4dcWA3QDRsDyBLBBR+gI3YAyAWwATAIM0KhsABuwQG1+UIFaoHESXz43OT8j1/V51EviBKZMmTJlxFF/HbTWrpRS17kXkzGP6/V6AaALL6REvsvD+AD2ysO4AH6Vh/EA/FkexgHwb3k4fYCj5QHO+szqvb/ptZzhmSulLgLHtpaHngBN06z6vG5IrLWL2OWhkq/Arvx94PDg8lABQMryIBwgdXkQDJCjPAgFyFUeBALkLA/CAHKXB0EAJcqDEABjjAFuA4dHKw8CAIwxRmv9pJSaBQyPWh4KA5QuDwUBJJSHQgBSykMBAEnlITOAtPKQEUBiecgIoLVeBJZnu93epV3NT7IBNE2zBB5Dxmqtn3YnR8mT9Tdg97FuRVBKzXIhZP8XkIZQ5DxAEkKxM0EpCEWvBSQgFL8aLI1QHADKIogAgDwIxpjZ4TExAJAWwVq70FovD4+LAoAvBO/9S9u4LgjH9hvFAQA45+be+9e2cSEIbZutIgE2m82Hc+5yKELITrNIABiOELrNLhYA+iN0uccgGgD6IXS4wSIfALojdJm7CgDohtAl1QBAGoSqACA+QnUAsIfwPnSuKgEAtNZzpdT54HliLCZ3Oj5LcDTVAcQsD5UBxC4PFQGkKA+VAKQqD/88LO2cewCeU7xhnzjn3oCrCFO9RZhjypQpU04nn+EmPy1mBxzFAAAAAElFTkSuQmCC');
}

兼容Decentraleyes

Decentraleyes 直接将部分常用库存在本地,避免了网络请求,比各种重定向都彻底。
现在如果重定向到科大镜像,就浪费了,能否做到让Decentraleyes优先适用?

支持云盘同步功能

支持云盘同步功能,让配置可在不同的平台之间进行同步,先尝试支持 onedrive

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.