UNPKG

pixiv-illust

Version:

A third-party Node.js library for Pixiv.

406 lines (341 loc) 18.3 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); exports.loginRequired = loginRequired; var _Bluebird = require('Bluebird'); var _Bluebird2 = _interopRequireDefault(_Bluebird); var _cheerio = require('cheerio'); var _cheerio2 = _interopRequireDefault(_cheerio); require('babel-polyfill'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new _Bluebird2.default(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return _Bluebird2.default.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var request = _Bluebird2.default.promisifyAll(require('request')); var fs = _Bluebird2.default.promisifyAll(require('fs')); var HOST = 'www.pixiv.net'; var ACCOUNT_HOST = 'accounts.pixiv.net'; var LOGIN_PAGE = 'https://' + ACCOUNT_HOST + '/login?lang=zh&source=pc&view_type=page&ref=wwwtop_accounts_index'; var LOGIN_API = 'https://' + ACCOUNT_HOST + '/api/login?lang=zh'; var LOGOUT_URL = 'http://' + HOST + '/logout.php?return_to=%2F'; var Login = function () { function Login() { _classCallCheck(this, Login); this.cookieJar = request.jar(); this.pending = null; } _createClass(Login, [{ key: '_getPostKey', value: function () { var _ref = _asyncToGenerator(regeneratorRuntime.mark(function _callee() { var resp, $, jsonData, data; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return request.getAsync({ url: LOGIN_PAGE, jar: this.cookieJar }); case 2: resp = _context.sent; if (!(resp.statusCode !== 200)) { _context.next = 5; break; } return _context.abrupt('return', _Bluebird2.default.reject(resp)); case 5: $ = _cheerio2.default.load(resp.body); jsonData = $('#init-config').attr('value'); data = JSON.parse(jsonData); return _context.abrupt('return', data['pixivAccount.postKey']); case 9: case 'end': return _context.stop(); } } }, _callee, this); })); function _getPostKey() { return _ref.apply(this, arguments); } return _getPostKey; }() }, { key: '_setPendingPromise', value: function _setPendingPromise() { var _resolve = void 0, _reject = void 0; var self = this; self.pending = new _Bluebird2.default(function (resolve, reject) { _resolve = function _resolve() { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } self.pending = null; resolve.call(self, args); }; _reject = function _reject() { for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } self.pending = null; reject.call(self, args); }; }); // always resolve this promise to `Unhandled rejection` // resolve with an array: // if resolved , the first element is the original resolve result. // if rejected ,the first element will be null, the error rejected will be the second params. self.pending.then(function (result) { return [result, null]; }).catch(function (err) { return _Bluebird2.default.resolve([null, err]); }); return [_resolve, _reject]; } }, { key: 'login', value: function () { var _ref2 = _asyncToGenerator(regeneratorRuntime.mark(function _callee2(account, password) { var _setPendingPromise2, _setPendingPromise3, _resolve, _reject, postKey, resp, ret; return regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _setPendingPromise2 = this._setPendingPromise(), _setPendingPromise3 = _slicedToArray(_setPendingPromise2, 2), _resolve = _setPendingPromise3[0], _reject = _setPendingPromise3[1]; _context2.next = 3; return this._getPostKey(); case 3: postKey = _context2.sent; _context2.next = 6; return request.postAsync({ url: LOGIN_API, jar: this.cookieJar, headers: { 'Host': ACCOUNT_HOST, 'Origin': 'https://' + ACCOUNT_HOST, 'Referer': LOGIN_PAGE, 'X-Requested-With': 'XMLHttpRequest' }, form: { pixiv_id: account, password: password, captcha: '', g_recaptcha_response: '', post_key: postKey, source: 'pc' } }); case 6: resp = _context2.sent; if (!(resp.statusCode !== 200)) { _context2.next = 10; break; } _reject(resp); return _context2.abrupt('return', _Bluebird2.default.reject(resp)); case 10: // there are two types of data returned when sucessed: // 1. nothing // 2. '{"error":false,"message":"","body":{"successed":{"return_to":"http:\/\/www.pixiv.net\/"}}}' // the `error` key cannot be used to judge whether the request is successed, // it's always false. ret = JSON.parse(resp.body || null); if (!(!ret || ret.body && ret.body.successed)) { _context2.next = 14; break; } _resolve(ret); return _context2.abrupt('return', ret); case 14: _reject(ret); return _context2.abrupt('return', _Bluebird2.default.reject(resp)); case 16: case 'end': return _context2.stop(); } } }, _callee2, this); })); function login(_x, _x2) { return _ref2.apply(this, arguments); } return login; }() }, { key: 'logout', value: function () { var _ref3 = _asyncToGenerator(regeneratorRuntime.mark(function _callee3() { return regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return request.getAsync({ url: LOGOUT_URL, jar: this.cookieJar }); case 2: return _context3.abrupt('return', _context3.sent); case 3: case 'end': return _context3.stop(); } } }, _callee3, this); })); function logout() { return _ref3.apply(this, arguments); } return logout; }() }, { key: 'dumps', value: function () { var _ref4 = _asyncToGenerator(regeneratorRuntime.mark(function _callee4(file) { var cookies; return regeneratorRuntime.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: cookies = this.cookies.map(function (cookie) { return { key: cookie.key, value: cookie.value }; }); _context4.next = 3; return fs.writeFileAsync(file, JSON.stringify(cookies, null, 4)); case 3: return _context4.abrupt('return', _context4.sent); case 4: case 'end': return _context4.stop(); } } }, _callee4, this); })); function dumps(_x3) { return _ref4.apply(this, arguments); } return dumps; }() }, { key: 'loads', value: function () { var _ref5 = _asyncToGenerator(regeneratorRuntime.mark(function _callee6(file) { var _this = this; var _setPendingPromise4, _setPendingPromise5, _resolve, _reject, _ret; return regeneratorRuntime.wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: _setPendingPromise4 = this._setPendingPromise(), _setPendingPromise5 = _slicedToArray(_setPendingPromise4, 2), _resolve = _setPendingPromise5[0], _reject = _setPendingPromise5[1]; _context6.prev = 1; return _context6.delegateYield(regeneratorRuntime.mark(function _callee5() { var content, jsonContent, jar; return regeneratorRuntime.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: _context5.next = 2; return fs.readFileAsync(file); case 2: content = _context5.sent; jsonContent = JSON.parse(content.toString()); jar = request.jar(); jsonContent.forEach(function (item) { var cookie = request.cookie(item.key + '=' + item.value); jar.setCookie(cookie, 'http://' + HOST); }); _this.cookieJar = jar; _resolve(_this); return _context5.abrupt('return', { v: _this }); case 9: case 'end': return _context5.stop(); } } }, _callee5, _this); })(), 't0', 3); case 3: _ret = _context6.t0; if (!((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object")) { _context6.next = 6; break; } return _context6.abrupt('return', _ret.v); case 6: _context6.next = 12; break; case 8: _context6.prev = 8; _context6.t1 = _context6['catch'](1); _reject(_context6.t1); throw _context6.t1; case 12: case 'end': return _context6.stop(); } } }, _callee6, this, [[1, 8]]); })); function loads(_x4) { return _ref5.apply(this, arguments); } return loads; }() }, { key: 'reset', value: function reset() { this.cookieJar = request.jar(); return this; } }, { key: 'cookies', get: function get() { return this.cookieJar.getCookies('http://' + HOST); } }, { key: 'loggedIn', get: function get() { var keys = ['PHPSESSID', 'device_token']; var cookieKeys = this.cookies.map(function (cookie) { return cookie.key; }); return keys.every(function (key) { return cookieKeys.includes(key); }); } }]); return Login; }(); var login = new Login(); exports.default = login; function loginRequired(target, prop, descriptor) { var method = descriptor.value; descriptor.value = function () { try { if (!login.loggedIn && !login.pending) { return _Bluebird2.default.reject(new Error('Login Required.')); } if (login.loggedIn) { for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } var ret = method.apply(this, args); return ret instanceof _Bluebird2.default ? ret : _Bluebird2.default.resolve(ret); } } catch (e) { return _Bluebird2.default.reject(e); } }; return descriptor; }