title: Curl login error on RESTful-ish API
body: <p>I am using the following code  to login to asp website but it doesnt work. </p>
  
  <pre><code>&lt;?php
  /************************************************
  * ASP.NET web site scraping script;
  * Developed by MishaInTheCloud.com
  * Copyright 2009 MishaInTheCloud.com. All rights reserved.
  * The use of this script is governed by the CodeProject Open License
  * See the following link for full details on use and restrictions.
  *   http://www.codeproject.com/info/cpol10.aspx
  *
  * The above copyright notice must be included in any reproductions of
  this script.
  ************************************************/
  error_reporting(E_ALL);
  /************************************************
  * values used throughout the script
  ************************************************/
  // urls to call - the login page and the secured page
  $urlLogin = "http://www.website.com/Default.aspx";
  $urlSecuredPage = "http://www.website.com/Default.aspx";
  
  // POST names and values to support login
  $nameUsername=rawurlencode('ctl00$txtLoginName');       // the name of the username textbox on the login form
  $namePassword=rawurlencode('ctl00$txtPassword');       // the name of the password textbox on the login form
  $nameLoginBtn=rawurlencode('ctl00$btnLogin');          // the name of the login button (submit) on the login form
  $valUsername ='myusername';        // the value to submit for the username
  $valPassword ='mypass';        // the value to submit for the password
  $valLoginBtn ='Login';             // the text value of the login button itself
  
  // the path to a file we can read/write; this will
  // store cookies we need for accessing secured pages
  $cookieFile = 'cookie.txt';
  
  // regular expressions to parse out the special ASP.NET
  // values for __VIEWSTATE and __EVENTVALIDATION
  $regexViewstate = '/__VIEWSTATE\" value=\"(.*)\"/i';
  $regexEventVal  = '/__EVENTVALIDATION\" value=\"(.*)\"/i';
  
  
  /************************************************
  * utility function: regexExtract
  *    use the given regular expression to extract
  *    a value from the given text;  $regs will
  *    be set to an array of all group values
  *    (assuming a match) and the nthValue item
  *    from the array is returned as a string
  ************************************************/
  function regexExtract($text, $regex, $regs, $nthValue)
  {
  
  if (preg_match($regex, $text, $regs)) {
   $result = $regs[$nthValue];
  }
  else {
   $result = "";
  }
  return $result;
  }
  
  
  
  /************************************************
  * initialize a curl handle; we'll use this
  *   handle throughout the script
  ************************************************/
  $ch = curl_init();
  
  
  /************************************************
  * first, issue a GET call to the ASP.NET login
  *   page.  This is necessary to retrieve the
  *   __VIEWSTATE and __EVENTVALIDATION values
  *   that the server issues
  ************************************************/
  curl_setopt($ch, CURLOPT_URL, $urlLogin);
  curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0' );
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  $data=curl_exec($ch);
  echo curl_error($ch);
  // from the returned html, parse out the __VIEWSTATE and
  // __EVENTVALIDATION values
  $viewstate = regexExtract($data,$regexViewstate,$regs,1);
  $eventval = regexExtract($data,$regexEventVal,$regs,1);
  /************************************************
  * now issue a second call to the Login page;
  *   this time, it will be a POST; we'll send back
  *   as post data the __VIEWSTATE and __EVENTVALIDATION
  *   values the server previously sent us, as well as the
  *   username/password.  We'll also set up a cookie
  *   jar to retrieve the authentication cookie that
  *   the server will generate and send us upon login.
  ************************************************/
  $postData = '__VIEWSTATE='.rawurlencode($viewstate)
            .'&amp;__EVENTVALIDATION='.rawurlencode($eventval)
            .'&amp;'.$nameUsername.'='.$valUsername
            .'&amp;'.$namePassword.'='.$valPassword
            .'&amp;'.$nameLoginBtn.'='.$valLoginBtn
            ;
  
  curl_setOpt($ch, CURLOPT_POST, TRUE);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
  curl_setopt($ch, CURLOPT_URL, $urlLogin);  
  curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile);    
  
  $data = curl_exec($ch);
  
  
  /************************************************
  * with the authentication cookie in the jar,
  * we'll now issue a GET to the secured page;
  * we set curl's COOKIEFILE option to the same
  * file we used for the jar before to ensure the
  * authentication cookie is sent back to the
  * server
  ************************************************/
  curl_setOpt($ch, CURLOPT_POST, FALSE);
  curl_setopt($ch, CURLOPT_URL, $urlSecuredPage);  
  curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile);    
  
  $data = curl_exec($ch);
  
  // at this point the secured page may be parsed for
  // values, or additional POSTS made to submit parameters
  // and retrieve data.  For this sample, we'll just
  // echo the results.
  echo $data;
  
  
  /************************************************
  * that's it! Close the curl handle
  ************************************************/
  curl_close($ch);
  ?&gt;
  </code></pre>
  
  <p>HTML CODE of the website:</p>
  
  <pre><code>&lt;div&gt;
  &lt;input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /&gt;
  &lt;input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /&gt;
  &lt;input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" /&gt;
  &lt;input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTIblablabla" /&gt;
  &lt;/div&gt;
  &lt;div&gt;
  &lt;input type="hidden" name="__PREVIOUSPAGE" id="__PREVIOUSPAGE" value="W3sZnblblabla" /&gt;
  &lt;input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWjwEC7blblabla" /&gt;
  &lt;/div&gt;
  &lt;div id="ctl00_pnlLoginBox"&gt;
  &lt;span id="ctl00_Label1"&gt;Username:&lt;/span&gt;&lt;br /&gt;
  &lt;input name="ctl00$txtLoginName" type="text" id="ctl00_txtLoginName" style="width:100px;" /&gt;&lt;br /&gt;
  &lt;span id="ctl00_Label2"&gt;Password:&lt;/span&gt;&lt;br /&gt;
  &lt;input name="ctl00$txtPassword" type="password" id="ctl00_txtPassword" style="width:100px;" /&gt;&lt;br /&gt;
  &lt;input type="submit" name="ctl00$btnLogin" value="Login" id="ctl00_btnLogin" style="width:104px;" /&gt;
  &lt;/div&gt;
  &lt;div align="center" style="padding-top:2px"&gt;
  &lt;a href="/getpassword.aspx" id="ctl00_aForgotPassword"&gt;
  &lt;span&gt;Forgot your Password&lt;/span&gt;
  &lt;/a&gt;
  &lt;/div&gt;
  </code></pre>
  
  <p>I get the following errors:</p>
  
  <pre><code>Notice: Undefined variable: viewstate in /home/me/test3.php on line 101
  Notice: Undefined variable: eventval in /home/me/test3.php on line 102
  </code></pre>
  
  <p>I tried set manually viewstate and eventval but it doesnt login. I tried a lot of different scripts that i found in this website but none worked. Can someone help me a bit.</p>