模拟登录 pixiv.net 后续

继上一篇文章《模拟登录 pixiv.net 后续》,老接口已经在 html 上消失了,那么只能按新版接口来惹
直接上代码,添加了登录错误的异常 = w= 同时不再需要 sunra/php-simple-html-dom-parse
可以看到 p 站添加了 Google reCAPTCHA ,但是目前没有碰到验证码。
PS: is_cookie_ok 没有改动,依旧按原来的使用。
PSS: nodejs 版 pixiv-cookie

define('BEFORE_LOGIN_COOKIE', __DIR__ . '/BEFORE_LOGIN_COOKIE.txt'); //登录页面的cookie
define('AFTER_LOGIN_COOKIE', __DIR__ . '/AFTER_LOGIN_COOKIE.txt'); //登录成功后获取到的cookie
define('USER_AGENT', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36');

login_pixiv('YOUR_PIXIVID', 'YOUR_PWD');
var_dump(is_cookie_ok(AFTER_LOGIN_COOKIE));

function login_pixiv($username, $password)
{
    //获取登陆页cookie
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://www.pixiv.net');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_COOKIEJAR, BEFORE_LOGIN_COOKIE);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    curl_setopt($ch, CURLOPT_USERAGENT, USER_AGENT);

    $login_html = curl_exec($ch);
    curl_close($ch);

    preg_match('/pixiv\.context\.token(.*)=(.*?)(\"|\')(.*?)(\"|\')/', $login_html, $matches);
    if (!isset($matches[4])) {
        throw new Exception('没有获取到token');
    }

    $data['pixiv_id'] = $username;
    $data['password'] = $password;
    $data['captcha'] = '';
    $data['g_recaptcha_response'] = '';
    $data['post_key'] = $matches[4];
    $data['source'] = 'pc';
    $data['ref'] = 'wwwtop_accounts_index';
    $data['return_to'] = 'http://www.pixiv.net/';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://accounts.pixiv.net/api/login?lang=zh');
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Origin: https://accounts.pixiv.net',
        'User-Agent: ' . USER_AGENT,
        'Content-Type: application/x-www-form-urlencoded; charset=UTF-8',
        'Referer: https://accounts.pixiv.net/login?lang=zh&source=pc&view_type=page&ref=wwwtop_accounts_index',
        'X-Requested-With: XMLHttpRequest',
    ));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_COOKIEFILE, BEFORE_LOGIN_COOKIE);
    curl_setopt($ch, CURLOPT_COOKIEJAR, AFTER_LOGIN_COOKIE);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $result = curl_exec($ch);
    if ($result === false) {
        throw new Exception(curl_error($ch));
    } else {
        $result = json_decode($result, true);
        if ($result['error']) {
            throw new Exception($result['message']);
        } else {
            if (!$result['body']['success']) {
                throw new Exception(json_encode($result['body']));
            }
        }
    }
    curl_close($ch);
}