israeli-bank-scrapers-core
Version:
Provide scrapers for all major Israeli banks and credit card companies
119 lines (118 loc) • 16.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.fetchGet = fetchGet;
exports.fetchGetWithinPage = fetchGetWithinPage;
exports.fetchGraphql = fetchGraphql;
exports.fetchPost = fetchPost;
exports.fetchPostWithinPage = fetchPostWithinPage;
const JSON_CONTENT_TYPE = 'application/json';
function getJsonHeaders() {
return {
Accept: JSON_CONTENT_TYPE,
'Content-Type': JSON_CONTENT_TYPE
};
}
function assertAutomationNotBlocked(status, responseText, url) {
if (status === 429 || responseText && /block automation|bot detection/i.test(responseText)) {
throw new Error(`Automation detected and blocked by server. Status: ${status}, URL: ${url}. The site is actively blocking automated access. Consider: 1) Using showBrowser:true, 2) Adding longer delays, 3) Using residential proxies, 4) Running at different times of day`);
}
}
async function fetchGet(url, extraHeaders) {
let headers = getJsonHeaders();
if (extraHeaders) {
headers = Object.assign(headers, extraHeaders);
}
const request = {
method: 'GET',
headers
};
const fetchResult = await fetch(url, request);
if (fetchResult.status !== 200) {
throw new Error(`sending a request to the institute server returned with status code ${fetchResult.status}`);
}
return fetchResult.json();
}
async function fetchPost(url, data, extraHeaders = {}) {
const request = {
method: 'POST',
headers: {
...getJsonHeaders(),
...extraHeaders
},
body: JSON.stringify(data)
};
const result = await fetch(url, request);
return result.json();
}
async function fetchGraphql(url, query, variables = {}, extraHeaders = {}) {
const result = await fetchPost(url, {
operationName: null,
query,
variables
}, extraHeaders);
if (result.errors?.length) {
throw new Error(result.errors[0].message);
}
return result.data;
}
async function fetchGetWithinPage(page, url, ignoreErrors = false) {
const [result, status] = await page.evaluate(async innerUrl => {
let response;
try {
response = await fetch(innerUrl, {
credentials: 'include'
});
if (response.status === 204) {
return [null, response.status];
}
return [await response.text(), response.status];
} catch (e) {
throw new Error(`fetchGetWithinPage error: ${e instanceof Error ? `${e.message}\n${e.stack}` : String(e)}, url: ${innerUrl}, status: ${response?.status}`);
}
}, url);
if (!ignoreErrors) {
assertAutomationNotBlocked(status, result, url);
}
if (result !== null) {
try {
return JSON.parse(result);
} catch (e) {
if (!ignoreErrors) {
throw new Error(`fetchGetWithinPage parse error: ${e instanceof Error ? `${e.message}\n${e.stack}` : String(e)}, url: ${url}, result: ${result}, status: ${status}`);
}
}
}
return null;
}
async function fetchPostWithinPage(page, url, data, extraHeaders = {}, ignoreErrors = false) {
const [resultText, status] = await page.evaluate(async (innerUrl, innerData, innerExtraHeaders) => {
const response = await fetch(innerUrl, {
method: 'POST',
body: JSON.stringify(innerData),
credentials: 'include',
headers: Object.assign({
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}, innerExtraHeaders)
});
if (response.status === 204) {
return [null, response.status];
}
return [await response.text(), response.status];
}, url, data, extraHeaders);
if (!ignoreErrors) {
assertAutomationNotBlocked(status, resultText, url);
}
try {
if (resultText !== null) {
return JSON.parse(resultText);
}
} catch (e) {
if (!ignoreErrors) {
throw new Error(`fetchPostWithinPage parse error: ${e instanceof Error ? `${e.message}\n${e.stack}` : String(e)}, url: ${url}, data: ${JSON.stringify(data)}, extraHeaders: ${JSON.stringify(extraHeaders)}, result: ${resultText}`);
}
}
return null;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJKU09OX0NPTlRFTlRfVFlQRSIsImdldEpzb25IZWFkZXJzIiwiQWNjZXB0IiwiYXNzZXJ0QXV0b21hdGlvbk5vdEJsb2NrZWQiLCJzdGF0dXMiLCJyZXNwb25zZVRleHQiLCJ1cmwiLCJ0ZXN0IiwiRXJyb3IiLCJmZXRjaEdldCIsImV4dHJhSGVhZGVycyIsImhlYWRlcnMiLCJPYmplY3QiLCJhc3NpZ24iLCJyZXF1ZXN0IiwibWV0aG9kIiwiZmV0Y2hSZXN1bHQiLCJmZXRjaCIsImpzb24iLCJmZXRjaFBvc3QiLCJkYXRhIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZXN1bHQiLCJmZXRjaEdyYXBocWwiLCJxdWVyeSIsInZhcmlhYmxlcyIsIm9wZXJhdGlvbk5hbWUiLCJlcnJvcnMiLCJsZW5ndGgiLCJtZXNzYWdlIiwiZmV0Y2hHZXRXaXRoaW5QYWdlIiwicGFnZSIsImlnbm9yZUVycm9ycyIsImV2YWx1YXRlIiwiaW5uZXJVcmwiLCJyZXNwb25zZSIsImNyZWRlbnRpYWxzIiwidGV4dCIsImUiLCJzdGFjayIsIlN0cmluZyIsInBhcnNlIiwiZmV0Y2hQb3N0V2l0aGluUGFnZSIsInJlc3VsdFRleHQiLCJpbm5lckRhdGEiLCJpbm5lckV4dHJhSGVhZGVycyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oZWxwZXJzL2ZldGNoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgUGFnZSB9IGZyb20gJ3B1cHBldGVlci1jb3JlJztcblxuY29uc3QgSlNPTl9DT05URU5UX1RZUEUgPSAnYXBwbGljYXRpb24vanNvbic7XG5cbmZ1bmN0aW9uIGdldEpzb25IZWFkZXJzKCkge1xuICByZXR1cm4ge1xuICAgIEFjY2VwdDogSlNPTl9DT05URU5UX1RZUEUsXG4gICAgJ0NvbnRlbnQtVHlwZSc6IEpTT05fQ09OVEVOVF9UWVBFLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhc3NlcnRBdXRvbWF0aW9uTm90QmxvY2tlZChzdGF0dXM6IG51bWJlciwgcmVzcG9uc2VUZXh0OiBzdHJpbmcgfCBudWxsLCB1cmw6IHN0cmluZykge1xuICBpZiAoc3RhdHVzID09PSA0MjkgfHwgKHJlc3BvbnNlVGV4dCAmJiAvYmxvY2sgYXV0b21hdGlvbnxib3QgZGV0ZWN0aW9uL2kudGVzdChyZXNwb25zZVRleHQpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBBdXRvbWF0aW9uIGRldGVjdGVkIGFuZCBibG9ja2VkIGJ5IHNlcnZlci4gU3RhdHVzOiAke3N0YXR1c30sIFVSTDogJHt1cmx9LiBUaGUgc2l0ZSBpcyBhY3RpdmVseSBibG9ja2luZyBhdXRvbWF0ZWQgYWNjZXNzLiBDb25zaWRlcjogMSkgVXNpbmcgc2hvd0Jyb3dzZXI6dHJ1ZSwgMikgQWRkaW5nIGxvbmdlciBkZWxheXMsIDMpIFVzaW5nIHJlc2lkZW50aWFsIHByb3hpZXMsIDQpIFJ1bm5pbmcgYXQgZGlmZmVyZW50IHRpbWVzIG9mIGRheWAsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hHZXQ8VFJlc3VsdD4odXJsOiBzdHJpbmcsIGV4dHJhSGVhZGVyczogUmVjb3JkPHN0cmluZywgYW55Pik6IFByb21pc2U8VFJlc3VsdD4ge1xuICBsZXQgaGVhZGVycyA9IGdldEpzb25IZWFkZXJzKCk7XG4gIGlmIChleHRyYUhlYWRlcnMpIHtcbiAgICBoZWFkZXJzID0gT2JqZWN0LmFzc2lnbihoZWFkZXJzLCBleHRyYUhlYWRlcnMpO1xuICB9XG4gIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBoZWFkZXJzLFxuICB9O1xuICBjb25zdCBmZXRjaFJlc3VsdCA9IGF3YWl0IGZldGNoKHVybCwgcmVxdWVzdCk7XG5cbiAgaWYgKGZldGNoUmVzdWx0LnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBzZW5kaW5nIGEgcmVxdWVzdCB0byB0aGUgaW5zdGl0dXRlIHNlcnZlciByZXR1cm5lZCB3aXRoIHN0YXR1cyBjb2RlICR7ZmV0Y2hSZXN1bHQuc3RhdHVzfWApO1xuICB9XG5cbiAgcmV0dXJuIGZldGNoUmVzdWx0Lmpzb24oKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoUG9zdDxUUmVzdWx0ID0gYW55PihcbiAgdXJsOiBzdHJpbmcsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGV4dHJhSGVhZGVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuKTogUHJvbWlzZTxUUmVzdWx0PiB7XG4gIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAuLi5nZXRKc29uSGVhZGVycygpLCAuLi5leHRyYUhlYWRlcnMgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgfTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2godXJsLCByZXF1ZXN0KTtcbiAgcmV0dXJuIHJlc3VsdC5qc29uKCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEdyYXBocWw8VFJlc3VsdD4oXG4gIHVybDogc3RyaW5nLFxuICBxdWVyeTogc3RyaW5nLFxuICB2YXJpYWJsZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30sXG4gIGV4dHJhSGVhZGVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuKTogUHJvbWlzZTxUUmVzdWx0PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoUG9zdCh1cmwsIHsgb3BlcmF0aW9uTmFtZTogbnVsbCwgcXVlcnksIHZhcmlhYmxlcyB9LCBleHRyYUhlYWRlcnMpO1xuICBpZiAocmVzdWx0LmVycm9ycz8ubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5lcnJvcnNbMF0ubWVzc2FnZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5kYXRhIGFzIFByb21pc2U8VFJlc3VsdD47XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEdldFdpdGhpblBhZ2U8VFJlc3VsdD4oXG4gIHBhZ2U6IFBhZ2UsXG4gIHVybDogc3RyaW5nLFxuICBpZ25vcmVFcnJvcnMgPSBmYWxzZSxcbik6IFByb21pc2U8VFJlc3VsdCB8IG51bGw+IHtcbiAgY29uc3QgW3Jlc3VsdCwgc3RhdHVzXSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoYXN5bmMgaW5uZXJVcmwgPT4ge1xuICAgIGxldCByZXNwb25zZTogUmVzcG9uc2UgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goaW5uZXJVcmwsIHsgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyB9KTtcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCkge1xuICAgICAgICByZXR1cm4gW251bGwsIHJlc3BvbnNlLnN0YXR1c10gYXMgY29uc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gW2F3YWl0IHJlc3BvbnNlLnRleHQoKSwgcmVzcG9uc2Uuc3RhdHVzXSBhcyBjb25zdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBmZXRjaEdldFdpdGhpblBhZ2UgZXJyb3I6ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZS5tZXNzYWdlfVxcbiR7ZS5zdGFja31gIDogU3RyaW5nKGUpfSwgdXJsOiAke2lubmVyVXJsfSwgc3RhdHVzOiAke3Jlc3BvbnNlPy5zdGF0dXN9YCxcbiAgICAgICk7XG4gICAgfVxuICB9LCB1cmwpO1xuXG4gIGlmICghaWdub3JlRXJyb3JzKSB7XG4gICAgYXNzZXJ0QXV0b21hdGlvbk5vdEJsb2NrZWQoc3RhdHVzLCByZXN1bHQsIHVybCk7XG4gIH1cblxuICBpZiAocmVzdWx0ICE9PSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCFpZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBmZXRjaEdldFdpdGhpblBhZ2UgcGFyc2UgZXJyb3I6ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZS5tZXNzYWdlfVxcbiR7ZS5zdGFja31gIDogU3RyaW5nKGUpfSwgdXJsOiAke3VybH0sIHJlc3VsdDogJHtyZXN1bHR9LCBzdGF0dXM6ICR7c3RhdHVzfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hQb3N0V2l0aGluUGFnZTxUUmVzdWx0PihcbiAgcGFnZTogUGFnZSxcbiAgdXJsOiBzdHJpbmcsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGV4dHJhSGVhZGVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICBpZ25vcmVFcnJvcnMgPSBmYWxzZSxcbik6IFByb21pc2U8VFJlc3VsdCB8IG51bGw+IHtcbiAgY29uc3QgW3Jlc3VsdFRleHQsIHN0YXR1c10gPSBhd2FpdCBwYWdlLmV2YWx1YXRlKFxuICAgIGFzeW5jIChpbm5lclVybDogc3RyaW5nLCBpbm5lckRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4sIGlubmVyRXh0cmFIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGlubmVyVXJsLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShpbm5lckRhdGEpLFxuICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxuXG4gICAgICAgIGhlYWRlcnM6IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCcgfSxcbiAgICAgICAgICBpbm5lckV4dHJhSGVhZGVycyxcbiAgICAgICAgKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0KSB7XG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzcG9uc2Uuc3RhdHVzXSBhcyBjb25zdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbYXdhaXQgcmVzcG9uc2UudGV4dCgpLCByZXNwb25zZS5zdGF0dXNdIGFzIGNvbnN0O1xuICAgIH0sXG4gICAgdXJsLFxuICAgIGRhdGEsXG4gICAgZXh0cmFIZWFkZXJzLFxuICApO1xuXG4gIGlmICghaWdub3JlRXJyb3JzKSB7XG4gICAgYXNzZXJ0QXV0b21hdGlvbk5vdEJsb2NrZWQoc3RhdHVzLCByZXN1bHRUZXh0LCB1cmwpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAocmVzdWx0VGV4dCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0VGV4dCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFpZ25vcmVFcnJvcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGZldGNoUG9zdFdpdGhpblBhZ2UgcGFyc2UgZXJyb3I6ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZS5tZXNzYWdlfVxcbiR7ZS5zdGFja31gIDogU3RyaW5nKGUpfSwgdXJsOiAke3VybH0sIGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9LCBleHRyYUhlYWRlcnM6ICR7SlNPTi5zdHJpbmdpZnkoZXh0cmFIZWFkZXJzKX0sIHJlc3VsdDogJHtyZXN1bHRUZXh0fWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUVBLE1BQU1BLGlCQUFpQixHQUFHLGtCQUFrQjtBQUU1QyxTQUFTQyxjQUFjQSxDQUFBLEVBQUc7RUFDeEIsT0FBTztJQUNMQyxNQUFNLEVBQUVGLGlCQUFpQjtJQUN6QixjQUFjLEVBQUVBO0VBQ2xCLENBQUM7QUFDSDtBQUVB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