0%

云函数实现代理池[阿里云]

我是看别人的视频觉得有趣,所以就尝试写一下。

本文也只提供灵感。

本地访问—>云函数—>目标网站

相当于云函数只是做了一个请求代理的功能,实现起来非常简单。

因为云函数的损耗低,且有一定的免费额度,重要的是云厂商ip多,这就有了很好的条件。

网上视频:

我看的是他的视频,他用的是GO语言,好处是在服务端节省资源。

直接打开思路,然后我就动手了。(中途连请求和响应都忘记用啥注解了,还是问的GPT才想起来)

阿里云:

直接访问云函数控制台(没有就开通一个):

https://fcnext.console.aliyun.com/overview

image-20240102215458279

新用户还有免费的额度(老用户的差不多快用完了)。

创建服务、创建函数。(理解为文件夹和文件的关系就好了)

如何创建并使用云函数可以查看我的这篇文章(本文不再赘述):

云函数

代码演示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
@Controller
@ResponseBody
public class ProxyController {
@GetMapping("/get")
public String get(String url){
try {
// Send a GET request
URL urls = new URL(url);
HttpURLConnection conn = (HttpURLConnection) urls.openConnection();
conn.setRequestMethod("GET");
// Read the response
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer content = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
in.close();
conn.disconnect();
return content.toString();
}
} catch (Exception e) {
e.printStackTrace();
}
return "{code:404;string:'未知错误'}";
}


@PostMapping("/post")
public String post(@RequestBody() String body){
System.out.println("body==> "+body);
JSONObject jsonObject = new JSONObject(body);
String url = jsonObject.getString("url");
String requestBody = jsonObject.getString("requestBody");

try {
// Send a GET request
URL urls = new URL(url);
HttpURLConnection conn = (HttpURLConnection) urls.openConnection();
conn.setRequestMethod("POST");

conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/json");
if(requestBody!=null && !"".equals(requestBody))
conn.getOutputStream().write(requestBody.getBytes("UTF-8"));

// Read the response
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer content = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
in.close();
conn.disconnect();
return content.toString();
}
} catch (Exception e) {
e.printStackTrace();
}
return "{code:404;string:'未知错误'}";
}

@GetMapping("/test")
public String test(){
return "test";
}
}

先自己在本地跑一下,用Postman测试一下POST请求,测试无误后就可以部署了。

部署可以使用任何提供云函数的产品,我习惯使用阿里云(主要是里面的余额还没有花完)。

阿里云也提供了新计费模式,好像给老用户每个月送100G的流量额度。

image-20240103153821272

测试功能:

我成功的在杭州地域下面创建服务和函数,现在我们来测试一下我写的默认接口。

本次我将测试三次,一个test(返回当前时间)一个GET(获取ip请求的网站)一个POST(百度首页)。

Test:

请求参数:tset

请求结果:

image-20240103155053758

GET:

目标网站:http://www.ip111.cn/

请求参数:get?url=http://www.ip111.cn/

请求结果:

image-20240103155159296

POST:

目标网站:https://www.baidu.com/

请求参数:

{
“url”: “https://www.baidu.com/“,
“requestBody”: “{‘name’:’alis’}”
}

请求地址:post

请求结果:

image-20240103155246488

测试IP:

等两分钟,再次调用GET测试,看看ip地址有无变化。

image-20240103155753009

之前的地址是101.37.82.227

现在的地址是47.96.252.229

ip地址的确发生了变化,看来不需要部署多个服务也可以切换ip了。

如果需要多个地区的ip就把应用部署到多个地域即可。

部署到香港地域,访问结果。

image-20240103161104003

过一会,等函数关闭后再次唤醒函数(注意SpringBoot启动的开销资源)就又可以得到一个新的ip。

image-20240103161236762

在香港地域可以通过先把压缩版上传到OSS,再通过OSS部署这样方便些。

避免了重复部署的问题,而且对于香港地域的OSS有5G的免费额度。

但是其他的地域貌似还是要上传代码,算了,等需要用的时候再去部署。

后记:

所以,编程的小伙伴可以自己去实现一下。

比起买代理要划算和安全一些,但是实名日站总感觉有点怪怪的。

这个的费用其实非常低的,什么的几次测试的资源消耗,如下图所示。

image-20240104155452836