Php 从外部脚本登录到Joomla

Php 从外部脚本登录到Joomla,php,curl,joomla,Php,Curl,Joomla,我正在尝试将一个在别处通过身份验证的用户登录到Joomla站点,并遵循nice程序,但必须应用两个修改: 添加了表单中包含的字段返回 引用com_用户,而不是com_用户 我不知道该网站是否有特定的自定义设置,是否使用特定的登录模块,或者是否是不同的版本-我没有该网站的管理员访问权限,因此无法检查。 现在,我的脚本正在运行,但它没有成功登录用户-它没有得到预期的cookie回报 相反,该站点返回 HTTP/1.1 100继续 HTTP/1.1 303参见其他日期:2014年7月23日星期三18:

我正在尝试将一个在别处通过身份验证的用户登录到Joomla站点,并遵循nice程序,但必须应用两个修改:

添加了表单中包含的字段返回 引用com_用户,而不是com_用户 我不知道该网站是否有特定的自定义设置,是否使用特定的登录模块,或者是否是不同的版本-我没有该网站的管理员访问权限,因此无法检查。 现在,我的脚本正在运行,但它没有成功登录用户-它没有得到预期的cookie回报

相反,该站点返回

HTTP/1.1 100继续

HTTP/1.1 303参见其他日期:2014年7月23日星期三18:18:25 GMT服务器: Apache/2.2.22 X-Powered-By:PHP/5.2.17位置: 内容长度:0连接:关闭内容类型:text/html; 字符集=utf-8

我知道一点Joomla,但对它的http通信深度一无所知,所以我不知道这里有什么问题

这是我的密码:

<?php

$uname = "*** secret";
$upswd = "*** credentials";
$url = "http://www.strassenbau.forum-kundenportal.de/login-anmeldung";
set_time_limit(0);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE );
curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE );
curl_setopt($ch, CURLOPT_COOKIEJAR, realpath('./cookie.txt'));
curl_setopt($ch, CURLOPT_COOKIEFILE, realpath('./cookie.txt'));
curl_setopt($ch, CURLOPT_HEADER, TRUE );
$ret = curl_exec($ch);

if (!preg_match('/name="([a-zA-z0-9]{32})"/', $ret, $spoof)) {
    preg_match("/name='([a-zA-z0-9]{32})'/", $ret, $spoof);
}

preg_match('/name="return" value="(.*)"/', $ret, $return); // search for hidden field "return" and get its value

// POST fields
$postfields = array();
$postfields['username'] = urlencode($uname);
$postfields['password'] = urlencode($upswd);
$postfields['option'] = 'com_users';
$postfields['task'] = 'user.login';
$postfields['return'] = $return[1];
$postfields[$spoof[1]] = '1';
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
$ret = curl_exec($ch);

echo "ret2: <pre>"; var_dump($ret); echo "</pre>";  // no cooking being set here!

// Get logged in cookie and pass it to the browser
preg_match('/^Set-Cookie: (.*?);/m', $ret, $m);
$cookie=explode('=',$m[1]);
setcookie($cookie[0], $cookie[1]);


?>

我最终使用了完成任务的工具。没有我想要的那么优雅,因为它需要安装那个插件,但嘿,它可以工作!:-

你想登录Joomla的哪个版本?Brent的脚本适用于1.5,这与2.5/3.x非常不同,2.5/3.x使用com_用户作为旧的com_用户…其次,如果它是最新的2.5.x版本或3.x站点,则在您收到的响应中指出的PHP版本5.2上运行时可能会出现问题。你也可以试着问一下。正如我所说的,我不知道他们在使用哪个版本。但是Brent写的应该适用于任何Joomla网站,我认为它看起来足够通用,可以在任何地方使用。你对com_用户的反思是正确的,因为我不得不调整这个,我们现在他们使用的至少是2.5版本——也许在一个更高版本中也引入了返回的东西。我将转到Joomla Q&A…可能是个好主意,Brent的答案是3年前写的,当时1.5仍然相当占主导地位。