2013-03-18 4 views
3

PHP CURL 및 MEGAVOIP으로 VoIP 전화를 걸려고합니다. 문제는 암호로 보호 된 페이지에 액세스하기 위해 세션을 관리 할 수 ​​없다는 것입니다. 어떤 변수가 로그인 페이지에 게시되어 Curl과 함께 게시되는지 확인했습니다. 하지만 내 코드가 작동하지 않습니다. 콜린 모렐리 및 Waygood의 조언에 따라PHP CURL - 세션이 만료되었습니다.

은, 난 그냥 두 명령에서 그 라인을 추가 :

curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookies_file); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookies_file); 

을하지만 여전히 동일합니다 :

Megavoip 반환 :

그래서 여기 세션이

만료 내 전체 코드 :

<?php 
ini_set("display_errors", 1); 
$username="***"; 
$password="***"; 
$url="https://www.megavoip.com/login"; 
$url2="https://www.megavoip.com/phone_to_phone/"; 
$timeout = 10; 
$cookies_file = 'cookies.txt'; 

// HERE I GET THE TOKEN 

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookies_file); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookies_file); 
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); 
$content = curl_exec($ch); 


preg_match_all('/<input[^>]+>/i',$content, $result); 
preg_match_all('/(id|value)=("[^"]*")/i',$result[0][5], $img); 
$img1=str_replace('"', '', $img[0][0]); 
$img2=str_replace('"', '', $img[0][1]); 
$img1=substr($img1,3); 
$img2=substr($img1,6); 
$postdata = "login%5Busername%5D=".$username."&login%5Bpassword%5D=".$password."&page_referrer=login&".$img1."=".$img2; 

// HERE I SEND THE VARIABLES 

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookies_file); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookies_file); 
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); 

$content = curl_exec($ch); 

// IF LOGGED HERE I'LL MAKE THE CALL 

curl_close($ch); 

echo $content; 
exit; 
?> 

나를 도와 줄만한 아이디어가 있습니까?

테스트 계정이므로이 계정을보고 도움을 받으려면 내 로그인과 비밀번호를 자유롭게 사용하십시오!

미리 감사드립니다.

+2

당신은 당신의 _second_ 요청에'COOKIEFILE'와'COOKIEJAR'를 설정해야합니다. 로그인 페이지에 대한 첫 번째 요청은 해당 파일에 쿠키가 _ 작성되도록합니다. 두 번째 요청은 해당 쿠키를 _read_ 할 수 있어야하며이를 서버로 보냅니다. –

+1

너무 빠름 lol +1 curl_setopt ($ ch, CURLOPT_COOKIEFILE, $ cookies_file); 윗도니에서 누락되었습니다 – Waygood

+0

@Waygood _full coverage_ 예를 위해서. 방금 체크를했고 기술적으로 말하자면 '쿠키 아이'는 쿠키가 쓰여지는 곳이고, '쿠키'는 그들이 읽히는 곳입니다. 하지만 그렇습니다. 안전하다고 생각하면 해를 입을 수 있습니다. +1. –

답변

-1

좋아, 당신은

가 먼저 컬에서 $ 쿠키 변수를 사용하는 것을 필요 후

// HERE I GET THE TOKEN 

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_COOKIESESSION, true);  
.... .... 
.... .... 
$content = curl_exec($ch); 

preg_match('/^Set-Cookie:\s*([^;]*)/mi', $content, $m); 
parse_str($m[1], $cookies); 
$cookie = $cookies['NAMEOFCOOKIEUNEEDHERE']; 

을 다음과 같이 로그인 후 헤더에서 쿠키를 추출해야합니다, 로그인 후 쿠키/세션을 전달합니다 그런 옵션들

// HERE I SEND THE VARIABLES 

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
curl_setopt($ch, CURLOPT_COOKIE, 'NAMEOFCOOKIEUNEEDHERE='.$cookie); 

당신의 문제가 해결되기를 바랍니다.

감사

모인

+0

? 그리고 뭐?! 음 ... – Vixed

관련 문제