好的,这是我的(可能非常具有挑战性)问题:
我正在尝试使用PHP和cURL登录9gag.com/login,但它无效。没有任何错误或任何错误,即使回复看起来很好。
登录表单受CSRF令牌保护,因此脚本首次连接以获取cookie(会话,ts1等)和相关的CSRF令牌。
之后,脚本会将获得的cookie,CSRF令牌以及用户名/密码组合发布到服务器。
你可能会注意到还会发布一些像“_gat”或“__gads”这样的cookie,但它们的值不会改变,是自我解释的(例如“countryCode”),或者只对Google广告很重要跟踪和统计目的。
这两个请求就像浏览器(在我的情况下是Safari)提交它们(我使用的是Live HTTP Headers),因此API根本不应该看到任何差异。
这是我的php片段:
$login_email = 'some_email@email.com';
$login_pass = 'some_password';
function get_string_between($string, $start, $end) {
$string = ' ' . $string;
$ini = strpos($string, $start);
if ($ini == 0) return '';
$ini += strlen($start);
$len = strpos($string, $end, $ini) - $ini;
return substr($string, $ini, $len);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://9gag.com/login');
curl_setopt($ch, CURLOPT_POST, FALSE);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept-Charset: utf-8',
'Accept-Language: en-us,en;q=0.7,bn-bd;q=0.3',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'));
curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd () . '/cookies_9gag.txt' );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/601.5.17 (KHTML, like Gecko) Version/9.1 Safari/601.5.17");
$gag_login_page = curl_exec($ch) or die(curl_error($ch));
$pos_csrftoken = strpos($gag_login_page, 'name="csrftoken"');
$part_csrf = substr($gag_login_page, $pos_csrftoken + 9, 100);
$gag_csrf = get_string_between($part_csrf, 'value="', '"');
preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $gag_login_page, $matches);
$cookies = array();
foreach($matches[1] as $item) {
parse_str($item, $cookie);
$cookies = array_merge($cookies, $cookie);
}
$phpsessid = $cookies['PHPSESSID'];
$ts1 = $cookies['ts1'];
$ri = $cookies['____ri'];
$session = $cookies['session'];
//echo 'Cookie: _gat=1;____ri='.$ri.'; ts1='.$ts1.'; sign_up_referer=https%3A%2F%2F9gag.com%2Flogin; countryCode=00; cacheableGrace=1; __gads=ID=d94815096752d058:T=1462990222:S=ALNI_Ma8SdWnOioJeYSCcIdj7p1LdHtgpA; PHPSESSID='.$phpsessid.'; session='.urlencode($session).'; gag_tz=2; _ga=GA1.2.1699141998.1462990222; _pk_id.7.f7ab=d2deed23abfae124.1462990220.1.1462990329.1462990220.; _pk_ses.7.f7ab=*';
curl_setopt($ch, CURLOPT_URL, 'https://9gag.com/login');
curl_setopt($ch, CURLOPT_POSTFIELDS,'csrftoken='.urlencode($gag_csrf).'&next='.'&location=1'.'&username='.urlencode($login_email).'&password='.urlencode($login_pass));
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept-Charset: utf-8',
'Connection: keep-alive',
'Accept-Language: en-us,en;q=0.7,bn-bd;q=0.3',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Cookie: _gat=1; ____ri='.$ri.'; ts1='.$ts1.'; sign_up_referer=https%3A%2F%2F9gag.com%2Flogin; countryCode=00; cacheableGrace=1; __gads=ID=d94815096752d058:T=1462990222:S=ALNI_Ma8SdWnOioJeYSCcIdj7p1LdHtgpA; PHPSESSID='.$phpsessid.'; session='.urlencode($session).'; gag_tz=2; _ga=GA1.2.1699141998.1462990222; _pk_id.7.f7ab=d2deed23abfae124.1462990220.1.1462990329.1462990220.; _pk_ses.7.f7ab=*'
));
curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd () . '/cookies_9gag.txt' );
curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd () . '/cookies_9gag.txt' );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/601.5.17 (KHTML, like Gecko) Version/9.1 Safari/601.5.17");
$gag_logged_in_page = curl_exec($ch) or die(curl_error($ch));
$pos = strpos(gag_logged_in_page, 'some_username');
if ($pos === false) {
echo 'Not logged in.';
}
curl_close($ch);
感谢您的阅读和帮助! 祝你有愉快的一天!
PS:我知道从响应中获取cookie和CSRF令牌的代码可能有点不寻常,有更好的方法可以做到,但它正在工作(已经检查过)。
PS2:我也知道已经有一个9gag的JSON API,名为Infinigag,但它没有我需要的功能,所以我不能使用它。我已经联系了作者,但他几周没有回复,所以我没有机会问他如何设法解决这个问题。
答案 0 :(得分:0)
您无法访问9gag
上没有javascript
启用的任何用户相关内容(您不会尽管如此,你可以废弃任何其他页面的内容。我猜他们对基于用户的操作(如投票,上传等)进行了某种javascript
检测。
您可以考虑使用selenium自动化您的请求。
注意:
我测试了几个脚本,包括你的脚本,尽管我可以通过会话和令牌获取cookie,但curl要求超时或返回为空< / strong>尝试访问用户相关内容时。