因为默认的检测URL是google的。
众所周知,google域名在国内时不时的会被墙。

GET /generate_204 HTTP/1.1
Connection: close
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.32 Safari/537.36
Host: connectivitycheck.gstatic.com
Accept-Encoding: gzip, deflate
这是我抓到的包

所以有时候,明明连接上网络,还是提示网络受限。moto的官方社区也有人发现这个问题了。
https://mclub.lenovo.com.cn/thread-7682109-1-1.html

解决办法,更改这个URL为其他的。步骤如下:
1,开启usb调试。版本号连按7次,开发者选项,开启USB调试。
2,本地装ADB。
3,ADB命令:
adb shell "settings put global captive_portal_http_url http://www.google.cn/generate_204";
adb shell "settings put global captive_portal_https_url https://www.google.cn/generate_204";
改成google中国的域名就好了。或者改成其他的也行:

http://connectivitycheck.platform.hicloud.com/generate_204 这个是华为的
http://pms.mb.qq.com/rsp204 腾讯的
https://connect.rom.miui.com/generate_204 小米的
http://wifi.vivo.com.cn/generate_204 VIVO的。
你要问联想的哪个?我还真不知道。

https://api.cloudflare.com/#dns-records-for-a-zone-update-dns-record
先记下来
前期工作:
申请token,到这里:
https://dash.cloudflare.com/profile/api-tokens
创建对应域名的token。
权限需要两行,zone-edit,dns-edit。
cloudflare_dns_api.png

用PHP来实现的。因为windows下面不能用shell。

<?php
include "cloudflareAPI.php";

$ip_v4=file_get_contents("https://api-ipv4.ip.sb/ip");
$ip_v6=file_get_contents("https://api-ipv6.ip.sb/ip");
$cf=new CFAPI;
$cf->apikey="XXXXXXXXXXXXXXXXXXXXXXX"; //token
$cf->email="admin@kele.im";
$cf->zoneid="xxxxxxxxxxxxxxxx"; //域名的zoneid在域名overview页面右下角
echo $cf->updateDNS("ddns.domain.com",$ip_v4);
?>
<?php

class CFAPI {

    public $apikey;
    public $email;
    public $zoneid;

    private function curl($url,$method="GET",$data=null)
    {
    
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);                                                                     
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Authorization: Bearer '.$this->apikey.'',
        'Content-Type:application/json'
        ));
        if (!empty($data)) {
            $data_string = json_encode($data);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); 
        }
        $sonuc = curl_exec($ch);
        curl_close($ch);
        return $sonuc;
    }

    private function getDomainID($domain)
    {
        //$result=$this->curl("https://api.cloudflare.com/client/v4/zones/".$this->zoneid."/dns_records?name=".$domain);
        $result=$this->curl("https://api.cloudflare.com/client/v4/zones/".$this->zoneid."/dns_records?name=".$domain."&type=A");
        var_dump($result);
        $json=json_decode($result);
        if (!empty($json->result) and $json->success) {
            return $json->result[0]->id;
        }
        else
        {
            return "";
        }

    }

    public function getuser()
    {
        return $this->curl("https://api.cloudflare.com/client/v4/user");
    }

    public function updateDNS($domain,$ip,$type="A",$ttl=120)
    {
        $domainid=$this->getDomainID($domain);
        $data = array(
            'type' => ''.$type.'',
            'name' => ''.$domain.'',
            'content' => ''.$ip.'',
            'proxied' => false,
            'ttl' => $ttl
        );
        if (empty($domainid)) {
            return $this->curl("https://api.cloudflare.com/client/v4/zones/".$this->zoneid."/dns_records","POST",$data);
        }
        else
        {
            return $this->curl("https://api.cloudflare.com/client/v4/zones/".$this->zoneid."/dns_records/".$domainid,"PUT",$data);
        }
        
    }

}

?>

脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它,就这么简单。
#!/usr/bin/python3是告诉操作系统执行这个脚本的时候,调用 /usr/bin 下的 python3 解释器;

#!/usr/bin/env python3 这种用法是为了防止操作系统用户没有将 python3 装在默认的 /usr/bin 路径里。当系统看到这一行的时候,首先会到 env 设置里查找 python3 的安装路径,再调用对应路径下的解释器程序完成操作。

#!/usr/bin/python3 相当于写死了 python3 路径;

#!/usr/bin/env python3 会去环境设置寻找 python3 目录,推荐这种写法。