# Appannie Crawler
```
function sleep(ms) {
return new Promise((res) => setTimeout(res, ms));
}
function getDateString() {
const now = new Date();
now.setDate(now.getDate() - 1);
return `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}`;
}
function extractCsrfToken() {
return document.cookie
.split('; ')
.find((cookie) => cookie.startsWith('csrftoken'))
.split('=')[1];
}
async function getTopCharts({
market,
countryCode,
category,
date = getDateString(),
}) {
if (!countryCode || !market || !category) {
return console.error(
'Parameter `countryCode`, `market`, `category` are required!'
);
}
const csrfToken = extractCsrfToken();
const json = await fetch(
`https://www.appannie.com/ajax/top-chart/table/?market=${market}&country_code=${countryCode}&category=${category}&date=${date}&rank_sorting_type=rank&page_size=100&order_type=desc`,
{
headers: {
'x-csrftoken': csrfToken,
'x-requested-with': 'XMLHttpRequest',
},
}
).then((res) => res.json());
const {
available,
table: { rows },
} = json;
if (!available) {
console.warn(
`rows of ${market} ${countryCode} ${category} is not available.`
);
return [];
}
return rows;
}
function getDataAndSend({ country, date, os: oses, category: categories }) {
const queue = oses.flatMap((os) => {
return categories[os].map((category) => ({
os,
category,
}));
});
let running = true;
async function start() {
for (const params of queue) {
if (!running) break;
const { os, category } = params;
try {
console.log(`Start fetching ${country} ${os} ${category}...`)
const rows = await getTopCharts({
countryCode: country,
market: os,
category,
date,
});
if (rows.length > 0) {
sendData({
os,
category_id: category,
country,
rows,
});
}
await sleep(15000);
} catch (e) {
console.error(e);
break;
}
}
}
start();
return () => console.warn('Remaining tasks are stopped.');
}
function sendData(body) {
return fetch('https://aixpert.appier.com/api/appannie/update_top_apps', {
method: 'post',
body: JSON.stringify(body),
});
}
stop = getDataAndSend({
category: {
'google-play': [400000,400001,400002,400003,400004,400005,400006,400007,400008,400009,400010,400011,400012,400013,400014,400015,400016,400017,400018,400019,400020,400021,400022,400023,400024,400025,400026,400027,400028,400029,400030,400031,400032,400033,400034,400035,400036,400037,400038,400039,400040,400041,400042,400043,400044,400045,400046,400047,400048,400049,400050,400051,400052,400053,400054,400055,400056,400057,400058,400059,400060,400061,400062,400063,400064,400065,400066,400067,400068,400069,400070,400008,400014,400017,400058],
ios:[100000,100001,100002,100003,100004,100005,100006,100007,100008,100009,100010,100011,100012,100013,100014,100015,100016,100017,100018,100019,100020,100021,100022,100023,100024,100025,100026,100027,100028,100029,100030,100031,100032,100033,100034,100035,100036,100037,100038,100039,100040,100041,100042,100043,100044,100045,100046,100047,100048,100049,100050,100051,100052,100053,100054,100055,100056,100057,100058,100059,100060,100061,100062,100063,100064,100065,100066,100067,100068,100069,100070,100071,100072,100073,100075,100076,100077,100078,100079]
},
country: 'JP',
date: '2021-01-26',
os: ['ios', 'google-play']
});
```