1
2
3
4const Apify = require('apify');
5
6const { log } = Apify.utils;
7
8const isNumber = (s) => +s == s;
9const addRequest = (id, userData) => ({ url: `https://i.instagram.com/api/v1/users/${id}/info/`, userData });
10
11Apify.main(async () => {
12 const { ids, resource } = await Apify.getInput();
13
14 const requestQueue = await Apify.openRequestQueue();
15 let count = 0;
16
17 if (resource?.defaultDatasetId) {
18 const dataset = await Apify.openDataset(resource.defaultDatasetId);
19
20 await dataset.forEach(async (item) => {
21 const id = [
22 item.ownerId,
23 item.owner,
24 ].filter(isNumber).map(String);
25
26 if (id[0]) {
27 await requestQueue.addRequest(addRequest(id[0], item));
28 count++;
29 }
30 });
31
32 if (resource?.defaultKeyValueStoreId) {
33 const kv = await Apify.openKeyValueStore(resource?.defaultKeyValueStoreId);
34 const { defaultDatasetId, actorRunId } = Apify.getEnv();
35
36 await Promise.all([
37 kv.setValue('DATASET_ID', defaultDatasetId),
38 kv.setValue('RUN_ID', actorRunId),
39 ]);
40 }
41 }
42
43 for (const id of (ids ?? [])) {
44 await requestQueue.addRequest(addRequest(id));
45 count++;
46 }
47
48 const proxyConfiguration = await Apify.createProxyConfiguration({
49 groups: ['RESIDENTIAL'],
50 });
51
52 const idCount = await requestQueue.getInfo().then(({ totalRequestCount }) => totalRequestCount || count);
53
54 log.info(`Going to fetch information for ${idCount} ids`);
55
56 const crawler = new Apify.CheerioCrawler({
57 requestQueue,
58 proxyConfiguration,
59 preNavigationHooks: [async (context, requestAsBrowserOptions) => {
60 requestAsBrowserOptions.headers = {
61 ...requestAsBrowserOptions.headers,
62 "Accept": "*/*",
63 "Alt-Used": "i.instagram.com",
64 "Accept-Language": "en-US,en",
65 "X-IG-App-ID": "936619743392459",
66 "X-ASBD-ID": "198387",
67 "X-IG-WWW-Claim": "0",
68 "Origin": "https://www.instagram.com",
69 "Referrer": "https://www.instagram.com/",
70 };
71 }],
72 handlePageFunction: async (context) => {
73 const { request, json } = context;
74
75 if (json?.status !== "ok") {
76 throw new Error(`Got wrong status "${json?.status ?? json?.message ?? '-'}"`);
77 }
78
79 if (!json?.user) {
80 throw new Error(`Missing user property from response`);
81 }
82
83 await Apify.pushData({
84 ...json.user,
85 url: `https://www.instagram.com/${json.user.username}`,
86 ...request.userData,
87 });
88 }
89 });
90
91 await crawler.run();
92});