接上一篇,因为要搭建一个私人网盘,所以用到了Cpolar,由于Cpolar免费版的限制:外网地址会动态变化(官网说是24小时),所以我们需要一个能实时获取到这个变换的网址,官网不提供获取的API,怎么办?抓包!所以我们这里的流程就是,写一个小程序,定时获取电脑上的隧道列表,并存到一个可以远程读取的地方,但是存到哪里也要考究一下,首先一般你不会考虑服务器了(但是有是最好的),因为你要是能买服务器,花个一两百块钱同步支持一下Cpolar,又稳定又省事。 所以我们这里需要再白嫖一个软件:坚果云,免费使用有流量限制,但用这个存储一些简单的数据其实足够了。 总的来说其实还蛮折腾,不如付费来的实在,其实我已经购买了3年的,不过由于Cpolar进程数量限制,所以在某些情况下还是需要其他账号去适配更多的设备,但是这个使用频率又极低,所以就没有继续购买更多的账号。 前面关于Cpolar的账号、配置等就不赘述了,所以从坚果云开始说起。下面写一下详细步骤 开发环境:.NET 6 开发工具:Visual Studio 2022 - 去坚果云官网注册一个账号:https://www./,登录进去后创建一个文件夹Test
- 点击右上方的用户名->账户信息->安全选项->第三方应用管理,添加一个应用,记住这个密码,这是后面需要上传数据需要的密码
- 开始编码,这里只要抓取Cpolar管理面板(http://localhost:9200)的两个接口就行,一个是登录,一个是获取隧道列表
/// <summary> /// 登录 /// </summary> /// <returns>返回Token</returns> public async Task<string> Login() { JsonObject jsonObject = new JsonObject(); jsonObject["email"] = user; jsonObject["password"] = pwd; HttpClient client = new HttpClient(); var result = await client.PostAsync(url + "user/login", new StringContent(jsonObject.ToString())); string json = await result.Content.ReadAsStringAsync(); var model = JsonNode.Parse(json); string token = model["data"]["token"].ToString(); Console.WriteLine("Token:" + token + "\r\n"); return token; }
/// <summary> /// 获取隧道列表 /// </summary> /// <returns></returns> public async Task<string> GetTunnels() { string token = await Login();
HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); string json = await client.GetStringAsync(url + "tunnels"); var model = JsonNode.Parse(json); JsonArray jsonArray = (JsonArray)JsonNode.Parse(model["data"]["items"].ToString());
StringBuilder stringBuilder = new StringBuilder(); foreach (var item in jsonArray) { stringBuilder.AppendLine("时间:" + DateTime.Now); stringBuilder.AppendLine("名称:" + item["name"]); stringBuilder.AppendLine("状态:" + item["status"]); stringBuilder.AppendLine("地址:" + item["public_url"]); stringBuilder.AppendLine(); stringBuilder.AppendLine(); } Console.WriteLine(stringBuilder); return stringBuilder.ToString(); }
/// <summary> /// 存储 /// </summary> /// <param name="path"></param> /// <returns></returns> public async Task Send(string path,string text) { HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", authorization); StringContent content = new StringContent(text); var result = await client.PutAsync(url + path, content); Console.WriteLine(await result.Content.ReadAsStringAsync()); }
- 定时获取,这里可以使用Windwos的定时任务,也可以使用定时器来实现,下面是定时器的代码
Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("开始运行 " + DateTime.Now); Cpolar cpolar = new Cpolar(); Jianguo jianguo = new Jianguo();
System.Timers.Timer timer = new System.Timers.Timer(60000 * 10); timer.Elapsed += Timer_Elapsed; timer.Start(); Console.ReadLine(); async void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e) { string tunnels = await cpolar.GetTunnels(); await jianguo.Send("Test/Cpolar.txt", tunnels);
Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("上传成功"); Console.ForegroundColor = ConsoleColor.White; }
- 把这个程序编译一下也放到开机启动里面即可,会每隔10分钟向坚果云写一次当前的隧道数据
- 获取,可以直接通过坚果云平台获取,也可以通过以下代码
/// <summary> /// 获取 /// </summary> /// <param name="path"></param> /// <returns></returns> public async Task Get(string path) { HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", authorization); string result = await client.GetStringAsync(url + path); Console.WriteLine(result); }
|