基于 SCF 的代理 IP 池

基于 SCF 的代理 IP 池

SCF 是什么?
无服务器云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码。您只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。

数据库结构

1
2
3
4
5
CREATE TABLE `proxy` (
`id` int(11) NOT NULL PRIMARY KEY,
`value` varchar(21) NOT NULL,
`create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) CHARSET=utf8;

PHP代码

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?php
ini_set('date.timezone', 'Asia/Shanghai');

function main_handler($event, $context)
{
// 代理IP最多数量
$maxNumber = 100;

// 代理IP失效时间
$failureTime = '-5 minute'; // 5 分钟

$event = (array)$event;

$queryString = (array)$event['queryString'];

$time = date('Y-m-d H:i:s', strtotime($failureTime));

$dbh = new PDO('mysql:host=127.0.0.1;dbname=dbname', 'username', 'password');

if (!isset($queryString['ip'])) {
// 删除超过时间的代理IP
$delete = $dbh->prepare('DELETE FROM `proxy` WHERE `create_at` < ?');
$delete->execute([$time]);

// 获取当前可用IP数量
$result = $dbh->prepare('SELECT count(*) FROM `proxy` WHERE `create_at` >= ?');
$result->execute([$time]);

$currentNumber = (int)$result->fetchColumn();

$url = 'http://www.66ip.cn/mo.php?sxb=&tqsl=10&port=&export=&ktip=&sxa=&submit=%CC%E1++%C8%A1&textarea=';

$ips = [];

while (1) {
if ($currentNumber >= $maxNumber) {
break;
}

$html = file_get_contents($url);

preg_match_all('/(.+?)<br \/>/i', $html, $match);

if (!$match) {
break;
}

foreach ($match[1] as $ip) {
$ip = trim($ip);

if ($ip) {
$ips[] = '(' . $ip . ')';
$currentNumber++;
}
}
}

if (count($ips)) {
$insert = $dbh->prepare('INSERT INTO proxy (`value`) VALUES' . implode(',', $ips));
$insert->execute();
}

$res = '当前数量:' . $currentNumber;
} else {
$result = $dbh->prepare('SELECT * FROM `proxy` ORDER BY `id` DESC LIMIT 1');
$result->execute();
$data = $result->fetch(PDO::FETCH_ASSOC);

// 代理IP是一次性的,提取后删除
if ($data) {
$delete = $dbh->prepare('DELETE FROM `proxy` WHERE `id` = ?');
$delete->execute([$data['id']]);
}

$res = json_encode($data, true);
}

return [
'isBase64Encoded' => false,
'statusCode' => 200,
'headers' => [
'Content-Type' => 'text/html'
],
'body' => $res
];
}

?>

登陆到腾讯云控制台,进入SCF,点击新建一个函数

点击下一步,然后把上面的PHP代码完整的复制进去然后点击完成。

完成后会跳转到当前创建的函数配置页面,我们需要将函数运行的内存和超时时间调大,通过右上角“编辑”按钮即可修改。

点击上面的触发方式。

  1. 创建定时任务。

定时任务是为了保障代理IP的一个有效性,这里的触发周期可以根据自己的需求进行更换,不一定需要一分钟一次。也可以选择自定义触发周期设置更精确的时间

  1. 创建API网关触发器

API网关是为了更加方便的获取到代理IP。不用在去自己写一个方法获取可用IP。

使用方法:访问路径 + ?ip=1

1
https://service-xx-123456.gz.apigw.tencentcs.com/release/proxy-test?ip=1

为什么用66ip?
使用66ip是因为它提供免费的API接口和可用率较高的一个网站,当然如果你有能力的话最好使用付费服务,那样子可用率等方面会更好。

往上