使用PHP's HttpRequest登录一个站点


Log into a site using PHP's HttpRequest?

我正在寻找一种在LinkedIn上搜索业务"X"的方法,这需要有效的登录会话。我正在使用PHP的HttpRequest对象进行Http请求,但我对处理会话数据/cookie不够熟悉,无法找出如何查明我的错误。

    $loginURL = "https://www.linkedin.com/uas/login-submit";
    $loginPostData = array("session_key" => "mylogin@mydomain.com",
                           "session_password" => "itsasecret",
                           "source_app" => "",
                           "signin" => "",
                           "session_redirect" => "",
                           "csrfToken" => "",
                           "sourceAlias" => "",
    );
    $httpRequest = new HttpRequest($loginURL, HttpRequest::METH_POST);
    $httpRequest->setContentType("application/x-www-form-urlencoded");
    $httpRequest->addPostFields($loginPostData);
    $httpRequest->setOptions(array("redirect" => 10));
    $httpMessage = $httpRequest->send();
    $responseBody = $httpMessage->getBody());

我将$responseBody写入一个文件并在浏览器中打开它,但它只包含一个带有登录字段的通用LinkedIn页面。使用firefix的"篡改数据"扩展,我可以看到以下请求头允许firefox加载会话可见的网页:

Host=www.linkedin.com
Content-Type=application/x-www-form-urlencoded
Content-Length=124
POSTDATA=source_app=&session_key=mylogin@mydomain.com&session_password=itsasecret&signin=&session_redirect=&csrfToken=&sourceAlias=

我得到的数据也有些奇怪:我希望看到"用户名或密码无效"之类的东西,但我得到的是默认的linkedin.com页面。

实际上看看linkedin的代码,有一些隐藏的输入,你需要发送POST数据,因为你的请求没有一个或多个这些值,你得到相同的登录页面…

复制,粘贴自linkedin

 <input type="hidden" name="source_app" value="">
 <input type="hidden" name="trk" value="guest_home_login">
 <input type="hidden" name="session_redirect" value="" id="session_redirect-login"><input type="hidden" name="csrfToken" value="ajax:9034582961576232024" id="csrfToken-login"><input type="hidden" name="sourceAlias" value="0_7r5yezRXCiA_H0CRD8sf6DhOjTKUNps5xGTqeX8EEoi" id="sourceAlias-login">