【问题标题】:PHP CURL - Session expiredPHP CURL - 会话过期
【发布时间】:2013-03-06 19:58:12
【问题描述】:

我正在尝试使用 PHP CURL 和 MEGAVOIP 进行 voip 通话。 问题是我无法管理会话以访问受密码保护的页面。 我查看了哪些变量发布到登录页面以使用 Curl 发布。 但是我的代码不起作用。

按照 Colin Morelli 和 Waygood 的建议,我只是在两个命令中添加了这些行:

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;
?>

有什么想法可以帮助我吗?

这是一个测试帐户,如果您想查看并帮助我,请随时使用我的登录名和密码!

非常感谢您。

【问题讨论】:

  • 您还需要在 second 请求中设置 COOKIEFILECOOKIEJAR。您的第一个请求(对登录页面)将导致将 cookie 写入到这些文件中。您的第二个请求需要能够读取这些 cookie,然后将它们发送到服务器。
  • 太快了哈哈 +1 curl_setopt($ch, CURLOPT_COOKIEFILE, $cookies_file);顶部的也不见了
  • @Waygood 为了全面报道,是的。我只是检查了一下,从技术上讲 COOKIEJAR 是写入 cookie 的位置,COOKIEFILE 是读取它们的位置。但是,是的,为了安全起见,我会说这样做没有害处,+1。
  • 非常感谢...我已经这样解决了,但还是不行。

标签: php session curl


【解决方案1】:

好的,您需要在登录后转发cookie/会话,

您需要在登录后首先从 Header 中提取 cookie,如下所示

// 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'];

之后需要在类似的 curl 选项中使用 $cookie 变量

// HERE I SEND THE VARIABLES

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

希望您的问题能够得到解决。

谢谢

月夜

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2017-10-22
    • 2012-06-23
    相关资源
    最近更新 更多