首页 > 解决方案 > 使用 curl 登录 facebook

问题描述

我需要用 curl 登录 facebook。我已经在浏览器中使用条件禁用 cookie、javascript 和 Opera mini 4 用户代理进行了测试。它登录成功。我检查并检查请求标头和响应标头中发生的情况。我已经检查过了。第一步 facebook 将在隐藏类型输入“ lsd, jazoest,m_ts,li ”中生成 4 个随机值。发布后的第二步,它将通过会话重定向到特定位置。原因,我禁用cookie。所以我看到 facebook 切换到会话。在这一步之后。我应该看到我的时间线页面。但是,什么也没发生。它只是发布到登录页面而不关注位置。对象 httpConnect 是 curl 的包装器。

$headers = [
        'User-agent: Opera/9.80 (J2ME/MIDP; Opera Mini/4.0.10992/35.5561; U; hr) Presto/2.8.119 Version/11.10',
    ];

$facebook = new httpConnect('https://m.facebook.com/');

$facebook->setHeaders($headers);

$facebook->setOptions();

$facebook->sendRequest();

$sourceCode = $facebook->getResponse();

preg_match('/<input type="hidden" name="lsd" value="(.*?)" autocomplete="off" \/>/', $sourceCode, $lsd);

preg_match('/<input type="hidden" name="jazoest" value="(.*?)" autocomplete="off" \/>/', $sourceCode, $jazoest);

preg_match('/<input type="hidden" name="m_ts" value="(.*?)" \/>/', $sourceCode, $m_ts);

preg_match('/<input type="hidden" name="li" value="(.*?)" \/>/', $sourceCode, $li);

$data = [
    'lsd' => $lsd[1],
    'jazoest' => $jazoest[1],
    'm_ts'  => $m_ts[1],
    'li' => $li[1],
    'try_number' => 0,
    'unrecognized_tries' => 0,
    'email' => 'email',
    'pass' => 'password',
    'login' => 'Log In',
    '_fb_noscript' => 'true'
];

$options = [
    CURLOPT_POST            => TRUE,
    CURLOPT_POSTFIELDS      => $data,
    CURLOPT_FOLLOWLOCATION  => TRUE,
];

$facebook = new httpConnect('https://m.facebook.com/login/device-based/regular/login/?refsrc=https%3A%2F%2Fm.facebook.com%2F&amp;lwv=100&amp;refid=8');

$facebook->setHeaders($headers);

$facebook->setOptions($options);

$facebook->sendRequest();

echo $facebook->getResponse();

标签: phpcurl

解决方案


您的登录代码甚至还没有完成,

首先,对 m.facebook.com 获取原始 cookie 的第一个请求需要accept-language标头(说真的,它不会让您在没有接受语言的情况下登录,奇怪的狗屎,这是我正在使用的 1 :) accept-language:en-US,en;q=0.8

其次,您正在尝试使用正则表达式解析 HTML,停止这样做,您必须使用适当的 HTML 解析器,PHP有多个 HTML 解析器(包括 DOMDocument、XMLReader、XMLParser、SimpleXml...),第三,您重新尝试对登录表单参数进行硬编码,不要那样做,动态提取它们,您必须动态获取<input>元素后代的所有元素login_form,并将它们添加到您的登录请求中,然后填写“电子邮件”和“通过”手动输入。

接下来,有时您会在登录后随机收到安装 facebook 移动应用程序的请求(这种情况并非每次都发生,但似乎是随机的),当您收到此问题时,您必须回答是或否,facebook 会不允许您在回答之前继续登录。可以通过查找包含字符串<a>的 a 元素来检测问题,并且您可以通过对该 a 元素指向的 href 执行简单的 GET 请求来回答。最后,可以通过查找带有 href 的 a 元素来验证登录成功href=/login/save-device/cancel/not interested/logout.php

您可以从 msgme 项目的 FacebookRelay 构造函数中找到示例登录代码,此处:https ://github.com/divinity76/msgme/blob/master/src/php/relays/facebook.relay.php


推荐阅读