В предыдущей статье я рассматривал процесс получения данных от стороннего сайта с использованием php-функции file_get_contents(). В данной статье рассмотрим более функциональный способ - с использованием curl и прокси-сервера.
Для начала необходимо найти прокси, через который будет работать данный процесс. В сети есть куча вариантов того, как можно установить свой прокси-сервер на VPS (например, используя 3proxy), либо можно арендовать proxy в любой точке земного шара и настроить работу через него. Я пошел проще - установил на VPS-ку с сайтом tor и настроил работу через него. В итоге, функция получения данных от стороннего сервера приобрела вид:
function GetCurlData($url)
{
if(strpos($url,'http://')!==false || strpos($url,'https://')!==false){
$altUrl = '/' . str_replace('/', '_', substr(array_pop(explode('://',$url)), 1));
} else {
$altUrl = '/' . str_replace('/', '_', substr($url, 1));
}
$altUrl = str_replace('//','/',$altUrl);
if (file_exists($this->uploadFolder . $url))
{
return file_get_contents($this->uploadFolder . $url);
} elseif (file_exists($this->uploadFolder . $altUrl))
{
return file_get_contents($this->uploadFolder . $altUrl);
} else
{
if(strpos($url,'http://') !== false || strpos($url,'https://')!==false){
} else {
$url = $this->domain.$url;
}
$code = $this->getCurlCode($url);
if($code==200){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:9050');
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$linkData = curl_exec($ch);
if(!curl_errno($ch)){
if (strlen($linkData) > 0)
{
file_put_contents($this->uploadFolder . $altUrl, $linkData);
curl_close($ch);
return $linkData;
} else
{
curl_close($ch);
return false;
}
} else {
echo 'Ошибка curl: ' . curl_error($ch);
}
curl_close($ch);
} else {
echo $url . 'returns code' . $code;
}
}
}
Функция получения кода ответа от сервера имеет вид:
function getCurlCode($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:9050');
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_HEADER, 1);
$result = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
return $code;
}