israeli-bank-scrapers
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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJKU09OX0NPTlRFTlRfVFlQRSIsImdldEpzb25IZWFkZXJzIiwiQWNjZXB0IiwiYXNzZXJ0QXV0b21hdGlvbk5vdEJsb2NrZWQiLCJzdGF0dXMiLCJyZXNwb25zZVRleHQiLCJ1cmwiLCJ0ZXN0IiwiRXJyb3IiLCJmZXRjaEdldCIsImV4dHJhSGVhZGVycyIsImhlYWRlcnMiLCJPYmplY3QiLCJhc3NpZ24iLCJyZXF1ZXN0IiwibWV0aG9kIiwiZmV0Y2hSZXN1bHQiLCJmZXRjaCIsImpzb24iLCJmZXRjaFBvc3QiLCJkYXRhIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZXN1bHQiLCJmZXRjaEdyYXBocWwiLCJxdWVyeSIsInZhcmlhYmxlcyIsIm9wZXJhdGlvbk5hbWUiLCJlcnJvcnMiLCJsZW5ndGgiLCJtZXNzYWdlIiwiZmV0Y2hHZXRXaXRoaW5QYWdlIiwicGFnZSIsImlnbm9yZUVycm9ycyIsImV2YWx1YXRlIiwiaW5uZXJVcmwiLCJyZXNwb25zZSIsImNyZWRlbnRpYWxzIiwidGV4dCIsImUiLCJzdGFjayIsIlN0cmluZyIsInBhcnNlIiwiZmV0Y2hQb3N0V2l0aGluUGFnZSIsInJlc3VsdFRleHQiLCJpbm5lckRhdGEiLCJpbm5lckV4dHJhSGVhZGVycyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oZWxwZXJzL2ZldGNoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgUGFnZSB9IGZyb20gJ3B1cHBldGVlcic7XG5cbmNvbnN0IEpTT05fQ09OVEVOVF9UWVBFID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG5mdW5jdGlvbiBnZXRKc29uSGVhZGVycygpIHtcbiAgcmV0dXJuIHtcbiAgICBBY2NlcHQ6IEpTT05fQ09OVEVOVF9UWVBFLFxuICAgICdDb250ZW50LVR5cGUnOiBKU09OX0NPTlRFTlRfVFlQRSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0QXV0b21hdGlvbk5vdEJsb2NrZWQoc3RhdHVzOiBudW1iZXIsIHJlc3BvbnNlVGV4dDogc3RyaW5nIHwgbnVsbCwgdXJsOiBzdHJpbmcpIHtcbiAgaWYgKHN0YXR1cyA9PT0gNDI5IHx8IChyZXNwb25zZVRleHQgJiYgL2Jsb2NrIGF1dG9tYXRpb258Ym90IGRldGVjdGlvbi9pLnRlc3QocmVzcG9uc2VUZXh0KSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQXV0b21hdGlvbiBkZXRlY3RlZCBhbmQgYmxvY2tlZCBieSBzZXJ2ZXIuIFN0YXR1czogJHtzdGF0dXN9LCBVUkw6ICR7dXJsfS4gVGhlIHNpdGUgaXMgYWN0aXZlbHkgYmxvY2tpbmcgYXV0b21hdGVkIGFjY2Vzcy4gQ29uc2lkZXI6IDEpIFVzaW5nIHNob3dCcm93c2VyOnRydWUsIDIpIEFkZGluZyBsb25nZXIgZGVsYXlzLCAzKSBVc2luZyByZXNpZGVudGlhbCBwcm94aWVzLCA0KSBSdW5uaW5nIGF0IGRpZmZlcmVudCB0aW1lcyBvZiBkYXlgLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoR2V0PFRSZXN1bHQ+KHVybDogc3RyaW5nLCBleHRyYUhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPFRSZXN1bHQ+IHtcbiAgbGV0IGhlYWRlcnMgPSBnZXRKc29uSGVhZGVycygpO1xuICBpZiAoZXh0cmFIZWFkZXJzKSB7XG4gICAgaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oaGVhZGVycywgZXh0cmFIZWFkZXJzKTtcbiAgfVxuICBjb25zdCByZXF1ZXN0ID0ge1xuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgaGVhZGVycyxcbiAgfTtcbiAgY29uc3QgZmV0Y2hSZXN1bHQgPSBhd2FpdCBmZXRjaCh1cmwsIHJlcXVlc3QpO1xuXG4gIGlmIChmZXRjaFJlc3VsdC5zdGF0dXMgIT09IDIwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgc2VuZGluZyBhIHJlcXVlc3QgdG8gdGhlIGluc3RpdHV0ZSBzZXJ2ZXIgcmV0dXJuZWQgd2l0aCBzdGF0dXMgY29kZSAke2ZldGNoUmVzdWx0LnN0YXR1c31gKTtcbiAgfVxuXG4gIHJldHVybiBmZXRjaFJlc3VsdC5qc29uKCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaFBvc3Q8VFJlc3VsdCA9IGFueT4oXG4gIHVybDogc3RyaW5nLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBleHRyYUhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbik6IFByb21pc2U8VFJlc3VsdD4ge1xuICBjb25zdCByZXF1ZXN0ID0ge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHsgLi4uZ2V0SnNvbkhlYWRlcnMoKSwgLi4uZXh0cmFIZWFkZXJzIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gIH07XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoKHVybCwgcmVxdWVzdCk7XG4gIHJldHVybiByZXN1bHQuanNvbigpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hHcmFwaHFsPFRSZXN1bHQ+KFxuICB1cmw6IHN0cmluZyxcbiAgcXVlcnk6IHN0cmluZyxcbiAgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuICBleHRyYUhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbik6IFByb21pc2U8VFJlc3VsdD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaFBvc3QodXJsLCB7IG9wZXJhdGlvbk5hbWU6IG51bGwsIHF1ZXJ5LCB2YXJpYWJsZXMgfSwgZXh0cmFIZWFkZXJzKTtcbiAgaWYgKHJlc3VsdC5lcnJvcnM/Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3JzWzBdLm1lc3NhZ2UpO1xuICB9XG4gIHJldHVybiByZXN1bHQuZGF0YSBhcyBQcm9taXNlPFRSZXN1bHQ+O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hHZXRXaXRoaW5QYWdlPFRSZXN1bHQ+KFxuICBwYWdlOiBQYWdlLFxuICB1cmw6IHN0cmluZyxcbiAgaWdub3JlRXJyb3JzID0gZmFsc2UsXG4pOiBQcm9taXNlPFRSZXN1bHQgfCBudWxsPiB7XG4gIGNvbnN0IFtyZXN1bHQsIHN0YXR1c10gPSBhd2FpdCBwYWdlLmV2YWx1YXRlKGFzeW5jIGlubmVyVXJsID0+IHtcbiAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKGlubmVyVXJsLCB7IGNyZWRlbnRpYWxzOiAnaW5jbHVkZScgfSk7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDQpIHtcbiAgICAgICAgcmV0dXJuIFtudWxsLCByZXNwb25zZS5zdGF0dXNdIGFzIGNvbnN0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIFthd2FpdCByZXNwb25zZS50ZXh0KCksIHJlc3BvbnNlLnN0YXR1c10gYXMgY29uc3Q7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgZmV0Y2hHZXRXaXRoaW5QYWdlIGVycm9yOiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGAke2UubWVzc2FnZX1cXG4ke2Uuc3RhY2t9YCA6IFN0cmluZyhlKX0sIHVybDogJHtpbm5lclVybH0sIHN0YXR1czogJHtyZXNwb25zZT8uc3RhdHVzfWAsXG4gICAgICApO1xuICAgIH1cbiAgfSwgdXJsKTtcblxuICBpZiAoIWlnbm9yZUVycm9ycykge1xuICAgIGFzc2VydEF1dG9tYXRpb25Ob3RCbG9ja2VkKHN0YXR1cywgcmVzdWx0LCB1cmwpO1xuICB9XG5cbiAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghaWdub3JlRXJyb3JzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgZmV0Y2hHZXRXaXRoaW5QYWdlIHBhcnNlIGVycm9yOiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGAke2UubWVzc2FnZX1cXG4ke2Uuc3RhY2t9YCA6IFN0cmluZyhlKX0sIHVybDogJHt1cmx9LCByZXN1bHQ6ICR7cmVzdWx0fSwgc3RhdHVzOiAke3N0YXR1c31gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoUG9zdFdpdGhpblBhZ2U8VFJlc3VsdD4oXG4gIHBhZ2U6IFBhZ2UsXG4gIHVybDogc3RyaW5nLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBleHRyYUhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgaWdub3JlRXJyb3JzID0gZmFsc2UsXG4pOiBQcm9taXNlPFRSZXN1bHQgfCBudWxsPiB7XG4gIGNvbnN0IFtyZXN1bHRUZXh0LCBzdGF0dXNdID0gYXdhaXQgcGFnZS5ldmFsdWF0ZShcbiAgICBhc3luYyAoaW5uZXJVcmw6IHN0cmluZywgaW5uZXJEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpbm5lckV4dHJhSGVhZGVyczogUmVjb3JkPHN0cmluZywgYW55PikgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChpbm5lclVybCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoaW5uZXJEYXRhKSxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcblxuICAgICAgICBoZWFkZXJzOiBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgnIH0sXG4gICAgICAgICAgaW5uZXJFeHRyYUhlYWRlcnMsXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCkge1xuICAgICAgICByZXR1cm4gW251bGwsIHJlc3BvbnNlLnN0YXR1c10gYXMgY29uc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gW2F3YWl0IHJlc3BvbnNlLnRleHQoKSwgcmVzcG9uc2Uuc3RhdHVzXSBhcyBjb25zdDtcbiAgICB9LFxuICAgIHVybCxcbiAgICBkYXRhLFxuICAgIGV4dHJhSGVhZGVycyxcbiAgKTtcblxuICBpZiAoIWlnbm9yZUVycm9ycykge1xuICAgIGFzc2VydEF1dG9tYXRpb25Ob3RCbG9ja2VkKHN0YXR1cywgcmVzdWx0VGV4dCwgdXJsKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKHJlc3VsdFRleHQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdFRleHQpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghaWdub3JlRXJyb3JzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBmZXRjaFBvc3RXaXRoaW5QYWdlIHBhcnNlIGVycm9yOiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGAke2UubWVzc2FnZX1cXG4ke2Uuc3RhY2t9YCA6IFN0cmluZyhlKX0sIHVybDogJHt1cmx9LCBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGRhdGEpfSwgZXh0cmFIZWFkZXJzOiAke0pTT04uc3RyaW5naWZ5KGV4dHJhSGVhZGVycyl9LCByZXN1bHQ6ICR7cmVzdWx0VGV4dH1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFFQSxNQUFNQSxpQkFBaUIsR0FBRyxrQkFBa0I7QUFFNUMsU0FBU0MsY0FBY0EsQ0FBQSxFQUFHO0VBQ3hCLE9BQU87SUFDTEMsTUFBTSxFQUFFRixpQkFBaUI7SUFDekIsY0FBYyxFQUFFQTtFQUNsQixDQUFDO0FBQ0g7QUFFQSxTQUFT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