Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php cUrl获取cUrl登录的令牌_Php_Curl_Login_Token - Fatal编程技术网

Php cUrl获取cUrl登录的令牌

Php cUrl获取cUrl登录的令牌,php,curl,login,token,Php,Curl,Login,Token,解决了这个问题。。切勿使用文件获取内容。在所有情况下都必须使用cUrl,而且它是有效的 我正在尝试使用cUrl登录此网站: 现在,基于标题和输入字段,我编写了这段php代码 问题是这是最后两个数组输入,我只是做了一个复制粘贴。。但每次加载页面时都会生成令牌,该令牌作为输入隐藏字段位于页面上 所以问题是,我如何获得一个新的代币,将工作? 已编辑-添加了我的整个功能: function login_to_website($targetURL){ global $browser_user_a

解决了这个问题。。切勿使用文件获取内容。在所有情况下都必须使用cUrl,而且它是有效的

我正在尝试使用cUrl登录此网站:

现在,基于标题和输入字段,我编写了这段php代码

问题是这是最后两个数组输入,我只是做了一个复制粘贴。。但每次加载页面时都会生成令牌,该令牌作为输入隐藏字段位于页面上

所以问题是,我如何获得一个新的代币,将工作? 已编辑-添加了我的整个功能:

function login_to_website($targetURL){

    global $browser_user_agent;
    if(empty($targetURL)) { return; }
    if(empty($login_url)) { $login_url = $targetURL; }
    $url = $login_url;

    $login_user     = "loginusername";
    $login_password = "loginpassword";
    $thetoken       = "this-is-my-problem-the-token-from-the-hidden-input";        

    $post_data = array();   
    $post_data['username']  = "$login_user"; 
    $post_data['password']  = "$login_password"; 
    $post_data['Submit']    = "Conectare";
    $post_data['option']    = "com_users";
    $post_data['task']      = "user.login";
    $post_data['return']    = "aW5kZXgucGhwP0l0ZW1pZD0yMTY%3D";
    $post_data[$thetoken]   = "1";          

    $postthis = http_build_query($post_data);

    $login = curl_init();

    curl_setopt($login, CURLOPT_COOKIEJAR, dirname(__FILE__) . "/cookie.tmpz");
    curl_setopt($login, CURLOPT_COOKIEFILE, dirname(__FILE__) . "/cookie.tmpz");
    curl_setopt($login, CURLOPT_VERBOSE, true);
    curl_setopt($login, CURLOPT_URL, $url);
    curl_setopt($login, CURLOPT_USERAGENT, random_user_agent());
    curl_setopt($login, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($login, CURLOPT_RETURNTRANSFER, TRUE);  
    curl_setopt($login, CURLOPT_POST, TRUE);
    $timeout = 5;
    curl_setopt( $login, CURLOPT_CONNECTTIMEOUT, $timeout );
    curl_setopt( $login, CURLOPT_TIMEOUT, $timeout );
    curl_setopt( $login, CURLOPT_MAXREDIRS, 10 );   

    curl_setopt($login, CURLOPT_POSTFIELDS, $postthis); // POST vars

    curl_setopt($login, CURLOPT_HEADER, 0); // debug headers sent - 1

      $data = curl_exec ($login);

      curl_setopt($login, CURLOPT_URL, $targetURL);

      $datax = curl_exec ($login);
      return $datax;

      // close cURL resource, and free up system resources
      curl_close($login);
}
最初的live标题是:

username=username&password=password&Submit=Conectare&option=com_users&task=user.login&return=aW5kZXgucGhwP0l0ZW1pZD0yMTY%3D&0dbf64fe20e2395a7d72ed5b64b3cf7c=1
编辑:

我得到的代币是这样的:

$htmlx = file_get_contents('http://www.v-tac.ro');
$htmlx = mb_convert_encoding($htmlx, 'UTF-8', mb_detect_encoding($htmlx)); //make sure this is utf8
if(!strlen($htmlx)) {echo "No HTML here . stoping execution with a return ."; return;}
$doc = new DomDocument;
@$doc->loadHTML($htmlx);
$xpath = new DOMXPath($doc);

echo $xpath->query('//fieldset[@class="userdata"]/input[5]')->item(0)->getAttribute("name");
$thetoken = $xpath->query('//fieldset[@class="userdata"]/input[5]')->item(0)->getAttribute("name");

最后一个错误是:令牌无效。

您必须执行多个请求。 此代码将首先下载站点,解析出所需的值并将其写入post数组:

$in=file_get_contents('http://www.v-tac.ro');
$re = '/<input type=\\"hidden\\" name=\\"return\\" value=\\"([\\w=]*)\\" \\/>.*?<input type=\\"hidden\\" name=\\"(\\w*)\\" value=\\"1\\" \\/>/s';
preg_match($re, $in, $out);
$post_data['return']    = $out[1];
$post_data[$out[2]]      = "1";
var_dump($post_data);
如果这不起作用,请尝试用curl下载替换文件\u get\u内容,同时保持cookies也可见


附言:请大家随意评论一个更简单的RegExp

我会用xpath,而不是preg_match。。但我想我可能遗漏了一些东西,比如问服务器要一个新的令牌?还是什么?html_标题?这对我来说都是新鲜事,但为什么我觉得废弃数据不是正确的答案……这就是为什么我建议使用cookies。我猜这个站点创建了两个令牌,存储在数据库中,一个存储在cookie中,另一个预填充html表单。只有当他们匹配他们才能确定,这是一个合法的要求。注:我想你可以放心地忽略“return”,它只是base64编码的目标URL。我allready在curl中添加了cookie/cookiejar信息。。看来我真的需要令牌,不,你的解决方案不起作用,不是因为代码,我也试过了。。我不知道问题出在哪里,但响应总是:无效令牌。我添加了我的完整函数和用LiveHeaders捕获的请求头从不使用file\u get\u内容。。这就是问题所在。必须使用卷曲,它的工作!