比如你部署了一个网站,你想亲朋好友能访问到你的网站。但是又不想花钱租服务器。

大家都知道服务器租起来很贵,单独办公网ip端口更贵。自己用家里平常的电脑就可以公网访问。

花生壳也贵,用花生壳的内网穿透很卡,而且限制很多,除非付费。

其实最后都是没钱惹的货。反正我是一个穷光蛋,不知道你呢?所以咱们就用下面的省钱方案。

准备条件:

1.一台电脑(网线必须直联光猫)

2.电信宽带(必须是ipv4的,办后打1000号开通动态公网ip)

3.腾讯云(去腾讯云购买一个域名,然后填写用途,在上面操作,腾讯云还有管局审核)

操作

当你完成了上面的3项操作之后,咱们就可以开始了。首先你要知道怎么去域名解析。

在腾讯搜索域名解析,就可以到这个界面,然后自己添加,输入记录(前缀),和记录值(ip地址)

就可以解析。但是这是手动的。因为我们是动态ip,没钱搞固定ip

所以需要写个脚本。定时刷新修改它。写脚本容易,就http请求,用各种语言都行,问题是怎么才能操作腾讯云呢?腾讯云很贴心,提供了对应的接口。可以用接口操作。


创建腾讯云秘钥地址

注意不要在网上找非腾讯云官方,帮你写好接口的,容易泄露key,最好像我一样跟着官方文档写接口。

账号登录 - DNSPod-免费智能DNS解析服务商-电信_网通_教育网,智能DNS

我的方法,选择腾讯云(Api秘钥),可以拿到后面需要执行的SecretIdSecretKey

调用后成功


1.在腾讯云【域名解析】添加一条记录,ip随便给

主机记录是www.shige(随便写的,这个就是访问的域名开头的内容)

记录值是ip地址(我随便写的)

2.接口调用获取域名对应的RecordId

为什么需要这个?因为腾讯云他修改需要这个参数,这个接口也是,得先去调另一个接口才能获取,我也头疼,为啥不一个接口写过来。

跳转到【获取域名的解析记录列表

step: 进入 API Explorer -> 获取域名的解析记录列表里 -> 输入域名(Domain) 还有主机记录(Subdomain) -> 点击发送请求

得到响应结果,响应结果里面找到RecordId

3.接口调用修改ip地址

跳转到修改记录

选择修改记录->JSON格式->填入信息还有rewardId,发送请求

ps:我截图少些了个subDomain(主机记录)他默认会给你改成@,我补上了,以我的json为准

这里对应的是腾讯云的域名解析操作

{
  "Domain": "域名",
  "DomainId": null,
  "SubDomain": "shige",
  "RecordType": "A",
  "RecordLine": "默认",

  "RecordLineId": null,
  "Value": "ip地址",
  "MX": null,
  "TTL": 600,
  "Weight": null,
  "Status": null,
  "RecordId": 刚刚获取的recordId填写数字,
  "Remark": null
}

看一下控制台,成功!

4.代码(整体)

我用的java,然后选的是sdk,如果担心腾讯云也不安全的话,那你就选择httpRequest,然后选择对应的语言,SDK信息里面按钮 有集成方法。

java代码,引入pom文件
# 版本在maven生效需要时间,如获取不到对应的版本,可以调低版本号
<dependency>
    <groupId>com.tencentcloudapi</groupId>
    <artifactId>tencentcloud-sdk-java-dnspod</artifactId>
    <version>3.1.947</version>
</dependency>

复制他的代码(你填写好就可以自己复制了)

package com.tencent;

import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.dnspod.v20210323.DnspodClient;
import com.tencentcloudapi.dnspod.v20210323.models.*;

public class Sample
{
    public static void main(String [] args) {
        try{
            // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
            // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
            // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
            Credential cred = new Credential("SecretId", "SecretKey");
            // 实例化一个http选项,可选的,没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("dnspod.tencentcloudapi.com");
            // 实例化一个client选项,可选的,没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            DnspodClient client = new DnspodClient(cred, "", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            ModifyRecordRequest req = new ModifyRecordRequest();
            req.setDomain("域名");
            req.setSubDomain("www.shige");
            req.setRecordType("A");
            req.setRecordLine("默认");
            req.setValue("ip地址");
            req.setRecordId(recordId);//末尾要加L
            // 返回的resp是一个ModifyRecordResponse的实例,与请求对象对应
            ModifyRecordResponse resp = client.ModifyRecord(req);
            // 输出json格式的字符串回包
            System.out.println(ModifyRecordResponse.toJsonString(resp));
        } catch (TencentCloudSDKException e) {
            System.out.println(e.toString());
        }
    }
}

我自己写了一个定时器,然后扫本地公网ip,调用这个方法。这里的脚本就很简单了,和域名解析没关系了,自己写吧。

注意:腾讯云的api调用的收费是前一年免费,大家可以白嫖,不过后面也很便宜,只要2块钱一个月,一年也才20块钱。

光猫操作

手动操作,端口配置

首先用网线连接你的光猫,用电脑连接,别用路由器。

然后登录光猫管理平台

192.168.1.1每个路由器可能有差别

光猫配置

WAN IP就是公网ip

然后选择端口映射,就可以把你本地的Ip端口映射到WAN IP上了

在端口列表就能看到你映射好的ip

代码动态模拟

为什么要用光猫获取?因为网上通过请求别人的地址返回的Ip都是经过转发的不准。

代码获取光猫的动态ip,由于要用脚本动态解析,所以不能用手动去看wanlp。

首先进入光猫界面f12,查看他的代码请求地址。找到接口

http://192.168.1.1/cgi-bin/luci/admin/settings/gwinfo?get=part

他会有个cookie值,用来校验是否正确。所以这里要模拟登录,获取cookie。

模拟登录

先开启日志输入密码,看接口是哪个是登录,参数怎么写。

然后看他的前端代码找到了。之后调用他的接口,和参数就能登录进去,然后发现他是用cookie登录的,登录后就会返回cookie,我们在拿这个cookie返回。每次用完记得调用下退出接口,清空cookie,防止多次登录的情况。

参数名称是username和psd

拿到cookie(他用的是sysauth为key的cookie)

登录获取cookie的代码

# coding=UTF-8


import requests

# 登录URL,看网站接口f12
login_url = 'http://192.168.1.1/cgi-bin/luci/admin/login'

# 登录所需的表单数据,参数要自己看网站前端代码f12
login_data = {
    'username': 'useradmin',
    'psd': 'xxxxx'
}

# 使用session对象,它会自动处理Cookies
with requests.Session() as session:
    # 发送POST请求进行登录
    response = session.post(login_url, data=login_data)

    # 检查是否登录成功
    # 这里的判断条件可能需要根据实际情况调整
    if response.status_code == 200:
        print("网站内容"+response.text)

        # 获取此时session中的cookies
        cookies = session.cookies.get_dict()

        # 打印所有cookie键值对
        for name, value in cookies.items():
            print(f'{name} -> {value}')
    else:
        print('Login failed')

获取公网Ip代码

有了cookie,其他的就简单了,请求的时候把cookies带过去就行

先写退出登录的代码,先看接口

发现他是存储在header里面调用的退出登录

然后我发现不用做退出,因为他是唯一的,如果你登录过了,那么他就会被挤掉。所以退出的我就没有写,这个要看不同光猫的规则,我是电信的。

获取ip的代码

def getIp(sysauthValue):
    #这个是获取Ip的接口,登录成功了f12自己看
    url = "http://192.168.1.1/cgi-bin/luci/admin/settings/gwinfo?get=part"

    # 创建会话对象,设置cookies和请求头
    session = requests.Session()
    session.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'})
    session.get(url)# 构造POST请求数据

    # 发送POST请求,进行登录
    # 已知的Cookie
    cookies = {
        'sysauth': sysauthValue
        # 根据实际需要添加更多的cookie
    }

    session.cookies.update(cookies)
    response = session.get(url)# 检查响应状态码,确认是否登录成功
    if response.status_code == 200:
        # print('登录成功!')
        print(response.text)

    else:
        print('登录失败,状态码:', response.status_code)

测试

成功

从返回值中拿到了公网ip

剩下的自己在写一个脚本把腾讯云域名的代码和这个光猫ip代码连起来就行了

ip测试

然后本机启动服务,通过公网Ip:端口访问

注意:端口可能被其他人占用,你要输入一个不常用的端口。

       如果是从光猫配置端口,不能用局域网的电脑访问此公网Ip,只能用其他的网络访问本机的公网ip

本机启动服务。

测试公网ip访问,用手机浏览器的流量访问

参考:

腾讯云地址

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐