php - 使用 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&lwv=100&refid=8');
$facebook->setHeaders($headers);
$facebook->setOptions($options);
$facebook->sendRequest();
echo $facebook->getResponse();
解决方案
您的登录代码甚至还没有完成,
首先,对 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
推荐阅读
- javascript - 'in' 的操作数无效:预期对象
- react-native - 为什么不调用 readAsStringAsync?
- php - 从运输选项中排除产品类别
- shell - 愚蠢的问题:用户程序总是在shell中打开吗?
- php - 如何使这个 PHP 函数在规模上更高效?
- javascript - 在 Javascript 中对动态 Html 表进行数学运算?
- python - 在 python 中打包和解包浮点值
- javascript - 在我的情况下,如何只使用一次反应钩子 useEffect ?
- android - 未调用材质暴露下拉菜单 OnItemSelectedListener
- angular - Angular Jest 或 Jasmine 测试:如何正确监视/模拟从测试类中调用的静态对象?