Openwrt已经提供了一个很强大的web管理界面Luci,可以方便的管理路由器。我们在开发智能路由器时,一般就需要在OpenWrt的WEB界面增加内容。

1.Luci简介
LuCI是OpenWrt上的Web管理界面,LuCI采用了MVC三层架构,使用Lua脚本开发,所以开发LuCI的配置界面不需要编辑任何的Html代码,除非想自己单独去创建网页(View层),否则我们基本上只需要修改Model层就可以了。

2. 添加选项Test
接下来介绍如何在“System”添加Test选项卡。

在文件系统目录“/usr/lib/lua/luci/controller/admin”下创建test.lua文件,文件内容如下:

[python]

module("luci.controller.admin.test", package.seeall)

function index()
entry({"admin", "test"}, alias("admin", "test", "test"), _("Test1"), 30).index = true
entry({"admin", "test", "control"}, cbi("admin_test/control"), _("ControlTest"), 1)
end

 

[/python]

/etc/init.d/uhttpd restart 重启http服务之后,刷新界面之后(有时候因为缓存,界面没有及时变化,rm -rf /tmp/luci-* 删除缓存就可以了),界面变成


test.lua中 entry表示添加一个新的模块入口,entry的定义如下,其中后两项都是可以为空:

[python]
entry(path, target, title=nil, order=nil)
[/python]

“path”是访问的路径,路径是按字符串数组给定的,比如路径按如下方式写“{“admin”, “test”, “control”}”,那么就可以在浏览器里访问“http://192.168.1.1/cgi-bin/luci/admin/test/control”来访问这个脚本。其中的“admin”表示为管理员添加脚本,“test”即为一级菜单名,“control”为菜单项名。系统会自动在对应的菜单中生成菜单项。比如想在“System”菜单下创建一个菜单项,那么一级菜单名可以写为“system”。
“target”为调用目标,调用目标分为三种,分别是执行指定方法(Action)、访问指定页面(Views)以及调用CBI Module。
第一种可以直接调用指定的函数,比如点击菜单项就直接重启路由器等等,比如写为“call(“function_name”)”,然后在该lua文件下编写名为function_name的函数就可以调用了。
第二种可以访问指定的页面,比如写为“template(“myapp/mymodule”)”就可/usr/lib/lua/luci/model/cbi以调用/usr/lib/lua/luci/view/myapp/mymodule.htm文件了。
第三种主要应用在配置界面,比如写为“cbi(“myapp/mymodule”)”就可以调用/usr/lib/lua/luci/model/cbi/myapp/mymodule.lua文件了。
title和order是针对管理员菜单的,其中的title即是显示在网页上的内容。这里我们创建“/usr/lib/lua/luci/controller/admin/test.lua”文件,定义我们的入口为“test”。
3添加cbi脚本
由test.lua中cbi指示的目录,在“/usr/lib/lua/luci/model/cbi/admin_test”目录下有control.lua脚本。

1.在/usr/lib/lua/luci/model/cbi在新建admin_test目录

2.在admin_test中新建control.lua文件,添加内容

 

[python]
require("luci.sys")
require("luci.sys.zoneinfo")
require("luci.tools.webadmin")
require("luci.fs")
require("luci.config")

local m, s, o

m = Map("test", translate("Test"), translate("This is simple test."))
m:chain("luci")

s = m:section(TypedSection, "controlboard", translate("Control Board"))
s.anonymous = true
s.addremove = false

s:tab("led", translate("Control LED"))
s:tab("beep", translate("Control Beep"))
–s:tab("adc", translate("Control Adc"))


— LED

o = s:taboption("led", ListValue, "lednum", translate("LED NUM:"))
o.default = 0
o.datatype = "uinteger"
o:value(0, translate("LED0"))
o:value(1, translate("LED1"))
o:value(2, translate("LED2"))

o = s:taboption("led", ListValue, "ledstatus", translate("LED STATUS:"))
o.default = 1 –off status
o.datatype = "uinteger"
o:value(0, translate("LED ON"))
o:value(1, translate("LED OFF"))


— BEEP

o = s:taboption("beep", ListValue, "beepstatus", translate("BEEP STATUS:"))
o.default = 1 –off status
o.datatype = "uinteger"
o:value(0, translate("ON"))
o:value(1, translate("OFF"))

o = s:taboption("beep", Value, "beepfreq", translate("BEEP FREQ:"))
o.datatype = "uinteger"
[/python]

[python]<span style="color: rgb(92, 92, 92); font-family: Consolas, monospace; letter-spacing: 0.100000001490116px; line-height: 1.3;">return m</span><span style="color: rgb(92, 92, 92); font-family: Consolas, monospace; letter-spacing: 0.100000001490116px; line-height: 1.3;">return m</span>

[/python]

该脚本表示读取/etc/config下的test文件,因此我们需要在/etc/config/中添加test文件。并在文件中添加:config controlboard

重启uhttpd服务后,刷新后界面为:

 

 其实之前就有发现,我在路由器(openwrt)后面的机器不能正常解析映射到内网地址的域名,我当时的做法是在openwrthosts文件里加上相应的项来workaround这个问题。当时我还以为只是我自己网络配置出的问题。直到昨晚,微博上有同学跟我聊起这个问题,我才意识到这可能是个普遍性的问题,于是便想google一下解决这个问题。

  最终呢,确认是openwrtdnsmasq的配置问题。只需将openwrt/etc/config/dhcp 文件下,dnsmasq块下的这一句:

option rebind_protection 1

改为

option rebind_protection 0

即可。
  你可以通过下面这一句命令来修改

sed -i ‘s/option rebind_protection 1/option rebind_protection 0/’  /etc/config/dhcp

  看了一下openwrtwikirebind_protection这一个选项的作用是Enables DNS rebind attack protection by discarding upstream RFC1918 responses。按我的理解,即是为了保护网络不受DNS rebind attackDNS重定向攻击?),路由器会将上由路由的对RFC1918域(0.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16,即内网IP段)的响应包扔掉。
  显然这是一个dnsmasqDNS解析的问题,因此如果我们把/etc/resolv.conf下的nameserver 127.0.0.1删除掉,也能workaround这个问题,但那样就相当于放弃了dnsmasqDNS缓存功能,得不偿失

 或者在luci界面DHCP/DNS关闭冲绑定保护

Snipaste 2018 03 10 19 20 28 - 暴力的wordpress缓存插件wp-rocket v2.11.6最新汉化破解版
缓存插件喵叔之前一直在使用wp super cache,总的来说还是非常好用的。前天无意中发现了一款非常暴力的wp缓存插件——wp-rocket,这是一款收费的插件,年费最低39美金,而且它并没有上架wp插件库。
这款插件使用非常简单,安装启用后就开始工作了,都不需要额外的设置,下面请看实测效果:
这是没有启用任何缓存插件的效果,测试网站17ce.com,时间为18:59
Snipaste 2018 03 10 19 20 28 - 暴力的wordpress缓存插件wp-rocket v2.11.6最新汉化破解版Snipaste 2018 03 10 19 21 00 - 暴力的wordpress缓存插件wp-rocket v2.11.6最新汉化破解版
下面是启用插件后的效果,启用后没有额外设置,用隐身模式打开网站访问了几篇文章进行缓存,时间为19:17
Snipaste 2018 03 10 19 21 19 - 暴力的wordpress缓存插件wp-rocket v2.11.6最新汉化破解版Snipaste 2018 03 10 19 22 27 - 暴力的wordpress缓存插件wp-rocket v2.11.6最新汉化破解版
可以看到启用插件后全部变绿色,可以说非常牛逼了,wp super cache的效果都要逊色一些。
安装完其实我们可以根据自身情况对插件进行一些简单的配置,达到更好的效果。
最后要说明的是,使用nginx的可以额外配置达到更好的效果,方法大家网上搜索一下就有了,其实不配置也可以,因为喵叔就是用的nginx,并没有做额外配置。
这里分享的wp-rocket v2.11.6是喵叔在国外网站上面找到的,国内目前能找到的最新是2.11.5,因为是网络上的资源,所以安全性本人无法保证,请大家自己自测

单纯的伪装ShadowsocksR流量,不需要Nginx/Apache配置相复杂的HTTP服务器,用Caddy就好了。

目的:
访问站点ss8.augustdoit.men(80/443跳转到1080或其他端口),能正常看到网站,同时通过ssr链接(节点ip/域名ss8.augustdoit.men,端口:80或443)也能正常使用。

注意:
如果要用这个同端口伪装功能,请不要开启 协议(origin)和混淆插件(obfs)的兼容原版模式(_compatible),不要使用原版SS链接!
同时,Shadowsocks-libev版服务端的simple-obfs功能,并不能实现本教程所说的同端口共存功能!

Caddy 配置

Caddy 是 Go语言编译好的二进制程序

wget -N --no-check-certificate https://softs.loan/Bash/caddy_install.sh && chmod +x caddy_install.sh && bash caddy_install.sh install http.filemanager

# 如果上面这个脚本无法下载,尝试使用备用下载:
wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/caddy_install.sh && chmod +x caddy_install.sh && bash caddy_install.sh install http.filemanager

成功后,继续下面的步骤

注意:以下示例域名皆为 ss8.augustdoit.men ,请注意更换为自己的域名,并做好域名解析。

HTTP(80端口)

若要伪装 80端口(ShadowsocksR服务端的用户端口是 80),那么你可以在 Caddy中随便配置一个监听端口,例如1080。

编辑配置文件

vi /usr/local/caddy/Caddyfile
# 添加如下内容
http://ss8.augustdoit.men:1080 {
 root /usr/local/caddy/www/ssr
 timeouts none
 gzip
}

或者

底下的 xxxx.win改成你的域名
对了,域名记得要提前指向你的vps。同时确保全球解析生效。
https://xxxx.win:6666 {
 gzip
 tls mmmwhy12@gmail.com
 proxy / https://www.baidu.com
}

HTTPS(443端口)

如果你想要伪装 443端口(ShadowsocksR服务端的用户端口是 443),那么你可以在 Caddy中随便配置一个监听端口,例如6666

如果你没有 SSL证书和密匙

下面的 xxxx@xxx.xx 改成你的邮箱,同时需要注意的是,申请 SSL证书前,请务必提前解析好域名记录(解析后最好等一会,全球生效),否则 Caddy会申请并配置失败!,配置文件是这样:

ss8.augustdoit.men:6666 {
 root /usr/local/caddy/www/ssr
 timeouts none
 tls xxxx@xxx.xx
 gzip
}

如果一切正常,那么Caddy会自动帮你申请 SSL证书并配置好,而且会定时续约SSL证书 和 强制 http重定向至https !

如果你有 SSL证书和密匙

把 SSL证书(xxx.crt)和密匙(xxx.key)文件放到/root文件夹下(也可以是其他文件夹,自己改下面代码),然后编辑配置文件:

vi /usr/local/caddy/Caddyfile
# 添加如下内容
ss1.augsutdoit.men:6666 {
  root /usr/local/caddy/www/ssr
  timeouts none
  tls /root/xxx.crt /root/xxx.key
  gzip
}

然后 HTTP 重定向为 HTTPS

由于是手动指定 SSL证书和密匙,Caddy只会监听 HTTPS端口(6666),并不会自动设置HTTP的重定向(如果是Caddy自动申请的SSL证书,那么已经自动做好了)

下面这个示例HTTP依然监听的80端口,如果你的ShadowsocksR服务端同时做了 80和443 两个端口的伪装,那么你可以把 80改成其他的比如 2333 端口。

http://ss8.augustdoit.men:80 {
 timeouts none
 redir https://ss8.augustdoit.men:443{url}
}
ss8.augustdoit.men:6666 {
 root /usr/local/caddy/www/ssr
 gzip
 tls /root/xxx.crt /root/xxx.key
}

创建网站目录上传网站

mkdir /usr/local/caddy/www && mkdir /usr/local/caddy/www/ssr

然后去网上随便下载一个 HTML的网页模板(随便找个html5英文模板),解压后把网页文件通过SFTP 上传到刚才新建的虚拟主机文件夹中: /usr/local/caddy/www/ssr

重启 Caddy

/etc/init.d/caddy restart

还没有结束,我们还需要继续配置ShadowsocksR服务端。

Caddy 使用说明

启动:/etc/init.d/caddy start

停止:/etc/init.d/caddy stop

重启:/etc/init.d/caddy restart

查看状态:/etc/init.d/caddy status

查看Caddy启动日志: tail -f /tmp/caddy.log

Caddy配置文件位置:/usr/local/caddy/Caddyfile

ShadowsocksR 配置步骤

想搞清楚可以看看我的这篇: SSR单端口多用户配置方法

一般设置

编辑配置文件 user-config.json 修改 server_port 和 redirect 参数就可以了

HTTP(80端口)

"server_port": 80,
"redirect": ["*:80#127.0.0.1:1080"],

HTTPS(443端口)

"server_port": 443,
"redirect": ["*:443#127.0.0.1:6666"],

多端口配置

redirect": ["*:888#127.0.0.1:1080", "*:666#127.0.0.1:6666"],

现在就可以了,网站可以直接访问,SSR服务器/节点IP 既可以写IP地址也可以写域名(ss8.augustdoit.men)。

DJANGO-SSPANEL 单端口多用户设置

前端添加节点

服务器ip既可以填ip也可以填域名,混淆参数要加上域名

后端设置

修改好 userapiconfig.py 后仍需要配置 user-config.json

HTTP(80端口)配置文件

#修改如下字段

"additional_ports": {
    "443": {
        "passwd": "augustdoit",
        "method": "aes-128-ctr",
        "protocol": "auth_aes128_sha1",
        "protocol_param": "#",
        "obfs": "http_simple",
        "obfs_param": "ss8.augustdoit.men"
    }
},

# 以及字段
"redirect": ["*:80#127.0.0.1:1080"],

HTTPS(443端口)

#修改如下字段

"additional_ports": {
    "443": {
        "passwd": "augustdoit",
        "method": "aes-128-ctr",
        "protocol": "auth_aes128_sha1",
        "protocol_param": "#",
        "obfs": "http_simple",
        "obfs_param": "ss8.augustdoit.men"
    }
},

# 以及字段
"redirect": ["*:443#127.0.0.1:6666"],

魔改版 单端口多用户后端设置

前端可以参照:魔改版单端口多用户教程

仍需修改user-config.json

"redirect": ["*:443#127.0.0.1:6666"],

跟朋友闲聊说到翻墙和SSH隧道,刚开始我对SSH的理解就是远程连接,然而SSH隧道并非那么简单,利用SSH隧道可以干很多事,翻墙就是其中之一。

VPN vs SSH

VPN和SSH隧道翻墙有如下区别:

  1. VPN的设置是全局的,即电脑一旦挂上VPN,所有的联网程序都将自动使用VPN;而建立好SSH隧道后,需要程序设定使用隧道才会使用隧道联网
  2. 如果使用商用的VPN一般要花钱,如果自己搭,VPN的搭建难度大于SSH隧道。因为SSH隧道只要一台可以SSH的服务器即可,根本不需要在服务器上配置任何东西

SSH动态绑定

这是SSH翻墙的基本原理:利用SSH动态绑定的功能。那么何谓SSH动态绑定呢?动态绑定是SSH端口转发功能的一种形式,借用一张图:

  1. 首先,墙内的客户机跟墙外的代理服务器,建立好SSH连接,并设定动态绑定
  2. 此时墙内客户机上的SSH会监听本地的一个端口7001
  3. 客户机上的程序,将对www.youtube.com:80的请求告知7001端口的SSH,SSH将此请求通过SSH加密连接发送到墙外服务器的SSH上
  4. 由于建立的动态绑定,服务器会将www.youtube.com:80的请求发送给www.youtube.com上的80端口,并在收到回复后,通过原路返回给客户机的SSH,客户机的SSH返回给应用程序

在这里SSH客户端已经不仅仅是个客户端了,它同时打开了7001端口侦听本机应用程序的请求。这是SSH跟传统用法最大的区别。而服务端的SSH也不仅仅是处理客户端的请求,而是将请求转发到对应的主机和端口,这里的动态二字体现在服务端的SSH的转发目标是不固定的,是根据客户端的请求而定的。

那么如何让应用程序知道应该把请求发送给本机的7001端口呢?

SOCKS代理

答案就是SOCKS代理。

理解SOCKS代理其实非常简单。HTTP代理都用过吧,浏览器其实也是支持SOCKS代理的,玩法几乎一样,只是SOCKS代理通常不限制端口,所谓来者不拒

实际上SOCKS代理普遍被许多应用程序支持:QQ、浏览器、MSN…

所以在上述的模型中,客户机的SSH实际上就是实现了一个SOCKS代理的角色,这个SOCKS代理侦听了7001端口,并将所有的请求都代理给服务器的SSH,并利用SSH动态绑定,让服务器进一步转发请求。

SSH隧道的搭建

那么我们来看看搭建一个SSH隧道翻墙,究竟有多简单。首先你需要有一台支持SSH的墙外服务器,此服务器啥都不需要,只要能SSH连接即可。

客户端SSH执行如下命令:

ssh -D 7001 username@remote-host

上述命令中-D表示动态绑定,7001表示本地SOCKS代理的侦听端口,可以改成别的,后面的username@remote-host就是你登录远程服务器的用户名和主机。当然,这个命令后会提示输入密码,就是username这个用户的密码(除非你配置了SSH公钥认证,可以不输入密码)

这样隧道就打通了!是不是超级简单。

最后在浏览器或者其他应用程序上设置SOCKS代理(设置v4的SOCKS就可以了,v5的SOCKS增加了鉴权功能),代理指向127.0.0.1,端口7001即可,这样免费的翻墙就做好了。最后再盗一张图:

SSH相当强大,还有很多好用的功能,可以参阅:

假设在package/network/zigbeeservice_test目录下是要编译的代码。

先make menuconfig

找到对应的选项,然后配置该选项为’M’,保存退出

然后输入make package/network/zigbeeservice_test/compile即可编译出ipk文件。

如何把canvas元素作为网站背景总结详解

 

>  、总结(点击显示或隐藏总结内容)

一句话总结:最简单的做法是绝对定位并且z-index属性设置为负数

1、如何把canvas元素作为网站背景的两种方法?

a、设置层级(本例代码就是用的这种方法):

position:absolute;z-index:-2;

b、是将canvas转变为一个路径通过url作为背景

document.getElementById('YST').style.backgroundImage = 'url("' + context.canvas.toDataURL() + '")';

二、如何将&lt;canvas&gt;元素作为网站背景

相较于传统的一张图片作为网站背景,使用CSS动画和HTML5画图明显是更出色、更具时代性的新前端做法。如果在2017年还在使用静态背景,没准人家真的会觉得你有5年以上开发经验呢。

今天来讲一下如何将绘制出的作为背景,从而使其他元素可以在canvas背景下正常排列,达到就像gif图背景一样的效果。

首先我们看代码:

 

作为示例,我们定义了一个元素。引入background.js绘制。具体的background.js是一个拥有scrollWidth和scrollHeight的全屏的星空动画。具体实现大家不必理会,效果是这样滴:

 

(其实整个星空一直在动)

出了元素外,我们还添加了一个宽、高30px的红色

进行测试,看看能否,或者说如何将其放置在画布上。

 

好,编译。我们发现空空如也。只有一片星空。
打开控制台,将的高度修改成200px,我们发现,噢,原来div被顺序排列在了canvas之后。

 

解决这个问题最简单有效的方法:

  1. z-index : -1;
  2. position : absolute;

看看结果:

 

 

如你所见,最简单的将设为背景的方法即1.将其绝对定位,2.将其z-index设做负数。

拓展:
除了z-index,其实当一个元素被设置了opacity,transforms, filters, css-regions, paged media等属性时,也会产生新的层。比如当你将opacity设为一个小于100%的数,元素也会移至最下层。不过笔者还是觉得不如设置z-index来的直接。具体的,看你咯。

三、在HTML5里把canvas作的画作为背景的方法

这里是用canvas做一个动态的生长树并将其作为背景,我查阅了很多资料发现一般两种方法,

1、设置层级(本例代码就是用的这种方法):

position:absolute;z-index:-2;

2、是将canvas转变为一个路径通过url作为背景

document.getElementById('YST').style.backgroundImage = 'url("' + context.canvas.toDataURL() + '")';

但是该方法我没有成功,希望前端大神帮我解决一下,谢谢大笑

这里生长树的代码借鉴的简书作者michaelgbw
废话少说,贴代码

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>将canvas作为背景</title>
</head>
<body style="margin: 0 auto">
<canvas id='d1' width="600" height="700" style="left: 500px; border:dashed 2px #ccc;position:absolute;z-index:-2;filter: alpha(opacity:50);opacity: 0.5"></canvas>
<script>

    var drawtree = function (ctx, startx, starty, length, angle, depth, branchWidth) {
            var rand = Math.random,
                    n_length, n_angle, n_depth, maxbranch = 4,
                    endx, endy, maxangle = 2 * Math.PI / 4;
            var subbranch;
            ctx.beginPath();
            ctx.moveTo(startx, starty);
            endx = startx + length * Math.cos(angle);
            endy = starty + length * Math.sin(angle);
            ctx.lineCap = 'round';
            ctx.lineWidth = branchWidth;
            ctx.lineTo(endx, endy);
            if (depth <= 2) {
                //树的枝干
ctx.strokeStyle = 'rgb(0,' + (((rand() * 64) + 128) >> 0) + ',0)';
            }
            else {
                //树的叶子
ctx.strokeStyle = 'rgb(0,' + (((rand() * 64) + 64) >> 0) + ',50,25)';
            }
            ctx.stroke();
            n_depth = depth - 1;
            //判断树是否结束
if (!n_depth) {
                return;
            }
            subbranch = (rand() * (maxbranch - 1)) + 1;
            branchWidth *= 0.5;
            for (var i = 0; i < subbranch; i++) {
                n_angle = angle + rand() * maxangle - maxangle * 0.5;
                n_length = length * (0.5 + rand() * 0.5);
                setTimeout(function () {
                    drawtree(ctx, endx, endy, n_length, n_angle, n_depth, branchWidth);
                    return;
                }, 500)
            }
        };

        var canvas1 = document.getElementById('d1');
        var context = canvas1.getContext('2d');
        //初始化的树
drawtree(context, 300, 700, 200, -Math.PI / 2, 12, 12);
        //context.fill();
        //document.getElementById('YST').style.backgroundImage = 'url("' + context.canvas.toDataURL() + '")';
</script>
<div id="YST" style="width:600px; height:700px;border:dashed 2px #ccc;text-align: center;left: 500px;position:absolute">
    <h4>青花瓷</h4>
    <p align="center">素胚勾勒出青花笔锋浓转淡<br>
        瓶身描绘的牡丹一如你初妆<br>
        冉冉檀香透过窗心事我了然<br>
        宣纸上走笔至此搁一半<br>
        釉色渲染仕女图韵味被私藏<br>
        而你嫣然的一笑如含苞待放<br>
        你的美一缕飘散<br>
        去到我去不了的地方<br>
        天青色等烟雨<br>
        而我在等你<br>
        炊烟袅袅升起<br>
        隔江千万里<br>
        在瓶底书汉隶仿前朝的飘逸<br>
        就当我为遇见你伏笔<br>
        天青色等烟雨<br>
        而我在等你<br>
        月色被打捞起<br>
        晕开了结局<br>
        如传世的青花瓷自顾自美丽<br>
        你眼带笑意<br>
        色白花青的锦鲤跃然於碗底<br>
        临摹宋体落款时却惦记着你<br>
        你隐藏在窑烧里千年的秘密<br>
        极细腻犹如绣花针落地<br>
        帘外芭蕉惹骤雨<br>
        门环惹铜绿<br>
        而我路过那江南小镇惹了你<br>
        在泼墨山水画里<br>
        你从墨色深处被隐去</p>
</div>
</body>
</html>

 

 

科学上网担心 IP 被墙? 你可以使用 Cloudflare 中转 V2Ray WebSocket 的流量来避免 IP 被墙。简单说就是使用 V2Ray 的 WebSocket + TLS 传输协议,并且,由于使用了 Cloudflare 中转,所以墙根本不知道背后的 IP 是多少,还怎么墙你的 IP 呢?

提醒

如果你不是使用 移动宽带 的用户,那么使用 Cloudflare 中转的速度相对来说是比较慢的,这个是因为线路的问题,无解。
警告警告警告
该教程目前写得比较简陋,以后应该会增加详细图文教程
V2Ray 的 WS + TLS 不是神话,如果你没学会走路就不要急着跑
大佬。。。你如果是从来没接触过 V2Ray 的人一上来就开玩 WS + TLS
你真的不怕摔跤吗
你有解析过域名吗,知道什么是 A 记录吗,会修改 NS 吗。。
如果不懂,那就先补上这些知识再往下看
如果实在想玩 WS + TLS,请认认真真看教程
教程真的写得比较简陋,如果实在折腾不成功,那也很正常的,改天再来
或者直接放弃

准备

一个域名,建议使用免费域名
确保域名已经可以在 Cloudflare 正常使用。
在 Cloudflare 的 Overview 选项卡可以查看域名状态,请确保为激活状态,即是: Status: Active

添加域名解析

在 DNS 选项卡那边添加一个 A 记录的域名解析,假设你的域名是 233blog.com,并且想要使用 www.233blog.com 作为翻墙的域名
那么在 DNS 那里配置,Name 写 www,IPv4 address 写你的小鸡的 IP,务必把云朵点灰,然后选择 Add Record 来添加解析记录即可
(如果你已经添加域名解析,请务必把云朵点灰,即是 DNS only)

OK,确保操作没有问题的话,继续

安装 V2Ray

如果你已经使用本站提供的 V2Ray 一键安装脚本并安装了 V2Ray,那就直接输入 v2ray config 修改传输协议为 WebSocket + TLS

如果你并没有使用本站提供的 V2Ray 一键安装脚本来安装 V2Ray
那么现在开始使用吧,最好用的 V2Ray 安装脚本,保证你满意
使用 root 用户输入下面命令安装或卸载

bash <(curl -s -L https://233yes.com/v2ray.sh)

如果提示 curl: command not found ,那是因为你的小鸡没装 Curl
ubuntu/debian 系统安装 Curl 方法: apt-get update -y && apt-get install curl -y
centos 系统安装 Curl 方法: yum update -y && yum install curl -y
安装好 curl 之后就能安装脚本了

之后选择安装,传输协议选择 WebSocket + TLS (即是选择 4 ),V2Ray 端口随便,不要是 80 和 443 即可,然后输入你的域名,域名解析 Y ,自动配置 TLS 也是 Y ,其他就默认吧,一路回车。等待安装完成
如果你的域名没有正确解析,安装会失败,解析相关看上面的 添加域名解析

安装完成后会展示 V2Ray 的配置信息,并且会询问是否生成二维码等,不用管它,直接回车

然后输入 v2ray status 查看一下运行状态,请确保 V2Ray 和 Caddy 都在运行

如果没有问题的话,继续

设置 Crypto 和 开启中转

确保 Cloudflare 的 Crypto 选项卡的 SSL 为 Full
并且请确保 SSL 选项卡有显示 Universal SSL Status Active Certificate 这样的字眼,如果你的 SSL 选项卡没有显示这个,不要急,只是在申请证书,24 小时内可以搞定。

然后在 DNS 选项卡那里,把刚才点灰的那个云朵图标,点亮它,一定要点亮一定要点亮一定要点亮

云朵图标务必为橙色状态,即是 DNS and HTTP proxy(CDN)

V2Ray 配置信息

很好,现在接下来配置客户端使用
输入 v2ray info 即可查看 V2Ray 的配置,如果你有使用某些 V2Ray 客户端,可以根据给出的配置的信息来配置使用了。赶紧测试吧
什么?没有用过什么鬼的 V2Ray 客户端?
那么请查看:V2Ray 各平台客户端使用教程

什么鬼?对啊,防止 IP 被墙就是如此简单啊,要不然你以为啊。

备注

如果你的 VPS 位置是在美国西海岸的话,速度应该还算可以吧,如果不是在美国西海岸,那么也许速度会很慢,不过好在能防止 IP 被墙也挺好的。难道不是么?
如果你使用移动网络的话,那么 Cloudflare 的中转节点可能会在香港,速度也许会不错 (不完全保证)。

无限域名备用

懒得写了,自己悟吧…
反正绝大多数人只要知道怎么避免 IP 被墙就行…
算啦,我还是提示一下吧,WebSocket 协议,80 端口,Cloudflare 的 Crypto 选项卡 SSL 为 Flexible
如果没有太多必要,不需要折腾这

结束

太蛋痛了,我又重写了一下教程,原本我就是打算让你明白无限域名备用的方法才写得稍微复杂了少少,仅仅只是复杂了少少,我擦,可是还是有那么多人看得不明不白,好吧,是我把你们想得太过于美好了。
哇,没有图文教程你就看不懂的话,我能怎么办,我也很绝望,我更加迷茫

 

文件备份“”install

如题,首先需要安装油猴

 

[js]

// ==UserScript==
// @name 自动翻译->字幕中文简体
// @namespace http://tampermonkey.net/
// @version 0.1
// @description translate to Chinese automatically.
// @author qwertyuiop6
// @match https://www.youtube.com/watch*
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
// @grant none
// ==/UserScript==

(function() {
‘use strict’;

function translateToChinese(){
var sub = $(‘[role="menuitem"]:contains("字幕")’);
if(!sub.length) return;
sub.click();
var subc = $(‘[role="menuitemradio"]:contains("中文(简体)")’);
if (subc.length) {
subc.click();
} else {
var autoTrans = $(‘[role="menuitemradio"]:contains("自动翻译")’);
if (!autoTrans.length) return;
autoTrans.click();
var autoTransC = $(‘[role="menuitemradio"]:contains("中文(简体)")’);
if (!autoTransC.length) return;
autoTransC.click();
}
}

function onLoadStart(){
$(‘.ytp-subtitles-button[aria-pressed="false"]’).click();
$(‘.ytp-settings-button’).click();
translateToChinese();
$(‘.ytp-settings-button’).click();
}
$(‘video’).on(‘loadstart’, onLoadStart).trigger(‘loadstart’);
})();

[/js]

youtube自动翻译