pixiv-illust
Version:
A third-party Node.js library for Pixiv.
406 lines (341 loc) • 18.3 kB
JavaScript
'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;
}