| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- <?php
- /**
- * Created by PhpStorm.
- * User: chendeben
- * Date: 2018/8/31
- * Time: 下午9:35
- */
- namespace Heanup\App\Script\Controller;
- use Exception;
- use Heanup\App\Api\Package\Database\Proxy;
- use Heanup\App\Script\Controller;
- use Heanup\Library\Curl;
- class Server extends Controller
- {
- /**
- * 执行逻辑
- * @throws Exception
- */
- protected function main()
- {
- while (true){
- echo "开始获取IP" . PHP_EOL;
- $ips = $this->get_ip();
- $this->check_ip($ips);
- echo "休眠30s" . PHP_EOL;
- sleep(30);
- }
- // $ips=Proxy::select();
- }
- private function check_ip($ip_arr)
- {
- foreach ($ip_arr as $key => $value) {
- $response = $this->check_proxy_ip_info($value);
- $ips = explode(":", $value);
- //将结果存入数据库
- if ($response) {
- $insert = [
- 'ip' => $ips[0],
- 'port' => $ips[1],
- 'status' => 1
- ];
- Proxy::replace($insert, ['ip' => $ips[0], 'port' => $ips[1]]);
- echo $value . "\tsuccess " . PHP_EOL;
- } else {
- Proxy::update(['status' => 0], ['ip' => $ips[0], 'port' => $ips[1]]);
- echo $value . "\terror " . PHP_EOL;
- }
- }
- }
- //获取各大网站代理IP
- private function get_ip()
- {
- $ip_arr = [];
- echo "正在获取第一个IP列表" . PHP_EOL;
- $ip_arr = $this->get_xici_ip($ip_arr);
- echo "正在获取第二个IP列表" . PHP_EOL;
- $ip_arr = $this->get_kuaidaili_ip($ip_arr);
- return $ip_arr;
- }
- private function get_xici_ip($ip_arr)
- {
- for ($i = 1; $i <= 10; $i++) {
- echo sprintf("正在获取xici第%s页IP列表", $i) . PHP_EOL;
- $url = sprintf("http://www.xicidaili.com/nn/%s", intval($i));
- $infoContent = Curl::get($url);
- $this->convert_encoding($infoContent);
- preg_match_all('/<tr.*>[\s\S]*?<td class="country">[\s\S]*?<\/td>[\s\S]*?<td>(.*?)<\/td>[\s\S]*?<td>(.*?)<\/td>/', $infoContent, $match);
- $host_arr = $match[1];
- $port_arr = $match[2];
- foreach ($host_arr as $key => $value) {
- $ip_arr[] = $host_arr[$key] . ":" . $port_arr[$key];
- }
- sleep(2);
- }
- print_r($ip_arr);
- return $ip_arr;
- }
- private function get_kuaidaili_ip($ip_arr)
- {
- for ($i = 1; $i <= 10; $i++) {
- echo sprintf("正在获取kuaidaili第%s页IP列表", $i) . PHP_EOL;
- $url = 'https://www.kuaidaili.com/free/inha/' . $i;
- $infoContent = Curl::get($url);
- $this->convert_encoding($infoContent);
- preg_match_all('/<td data-title="IP">(.*?)<\/td>/', $infoContent, $host);
- preg_match_all('/<td data-title="PORT">(.*?)<\/td>/', $infoContent, $port);
- $host_arr = $host[1];
- $port_arr = $port[1];
- foreach ($host_arr as $key => $value) {
- $ip_arr[] = $host_arr[$key] . ":" . $port_arr[$key];
- }
- sleep(2);
- }
- print_r($ip_arr);
- return $ip_arr;
- }
- /**
- * +-----------------------------------------------------------------------------
- * 检查代理ip信息有效性
- * +-----------------------------------------------------------------------------
- * @param string $proxy_ip [117.95.100.126:8998]
- * @param int $times 执行检查次数
- * @return bool
- * @author elinx <654753115@qq.com> 2016-07-29
- * +-----------------------------------------------------------------------------
- */
- function check_proxy_ip_info($proxy_ip = '', $times = 1)
- {
- $status = false;
- $header = array(
- // "GET / HTTP/1.1",
- // "HOST: www.baidu.com",
- "accept: application/json",
- "accept-encoding: gzip, deflate",
- "accept-language: en-US,en;q=0.8",
- "content-type: application/json",
- "user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36",
- );
- $url = 'http://www.baidu.com/';
- $result['succeed_times'] = 0; //成功次数
- $result['defeat_times'] = 0; //失败次数
- $result['total_spen'] = 0; //总用时
- $ip = explode(":", $proxy_ip);
- for ($i = 0; $i < $times; $i++) {
- $curl = curl_init();
- curl_setopt($curl, CURLOPT_URL, $url); //设置传输的url
- curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //发送http报头
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate'); // 解码压缩文件
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //不验证证SSL书
- curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); //不验证SSL证书
- curl_setopt($curl, CURLOPT_HTTPHEADER, array(
- 'Client_Ip: ' . $ip,
- ));
- curl_setopt($curl, CURLOPT_HTTPHEADER, array(
- 'X-Forwarded-For: ' . $ip,
- ));
- curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
- curl_setopt($curl, CURLOPT_PROXY, $proxy_ip);
- curl_setopt($curl, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookie.txt');
- curl_setopt($curl, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookie.txt');
- curl_setopt($curl, CURLOPT_TIMEOUT, 10); // 设置超时限制防止死循环
- // $response_header = curl_getinfo($curl); // 获取返回response报头
- $content = curl_exec($curl);
- if (strstr($content, '百度一下,你就知道')) {
- $status = true;
- break;
- } else {
- $status = false;
- }
- // $result['list'][$i]['response_header'] = $response_header;
- }
- return $status;
- }
- private function convert_encoding(&$str)
- {
- $encode = mb_detect_encoding($str, ['GB2312', 'UTF-8', 'GBK', 'ASCII']);
- $str = iconv($encode, 'utf-8//TRANSLIT//IGNORE', $str);
- }
- }
|