imperium-crawl 2.1.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -89
- package/dist/cli-tui.d.ts +1 -1
- package/dist/cli-tui.js +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +0 -11
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -18
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/formatters.d.ts +2 -2
- package/dist/formatters.js +2 -2
- package/dist/index.js +6 -28
- package/dist/index.js.map +1 -1
- package/dist/recipes/index.d.ts.map +1 -1
- package/dist/recipes/index.js +2 -0
- package/dist/recipes/index.js.map +1 -1
- package/dist/recipes/influencer-content-scout.json +14 -0
- package/dist/skills/manager.d.ts +1 -1
- package/dist/skills/manager.d.ts.map +1 -1
- package/dist/social/ai-fallback.d.ts +1 -1
- package/dist/social/ai-fallback.d.ts.map +1 -1
- package/dist/social/ai-fallback.js +19 -0
- package/dist/social/ai-fallback.js.map +1 -1
- package/dist/social/types.d.ts +33 -2
- package/dist/social/types.d.ts.map +1 -1
- package/dist/social/types.js +1 -1
- package/dist/stealth/browser-pool.d.ts.map +1 -1
- package/dist/stealth/browser-pool.js +12 -6
- package/dist/stealth/browser-pool.js.map +1 -1
- package/dist/tools/download.d.ts +39 -0
- package/dist/tools/download.d.ts.map +1 -0
- package/dist/tools/download.js +375 -0
- package/dist/tools/download.js.map +1 -0
- package/dist/tools/image-search.d.ts.map +1 -1
- package/dist/tools/image-search.js +3 -11
- package/dist/tools/image-search.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +7 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/instagram.d.ts +51 -0
- package/dist/tools/instagram.d.ts.map +1 -0
- package/dist/tools/instagram.js +462 -0
- package/dist/tools/instagram.js.map +1 -0
- package/dist/tools/interact.d.ts +4 -4
- package/dist/tools/interact.js +1 -1
- package/dist/tools/interact.js.map +1 -1
- package/dist/tools/manifest.d.ts +0 -1
- package/dist/tools/manifest.d.ts.map +1 -1
- package/dist/tools/manifest.js +18 -2
- package/dist/tools/manifest.js.map +1 -1
- package/dist/tools/news-search.d.ts.map +1 -1
- package/dist/tools/news-search.js +3 -11
- package/dist/tools/news-search.js.map +1 -1
- package/dist/tools/reddit.d.ts.map +1 -1
- package/dist/tools/reddit.js +18 -15
- package/dist/tools/reddit.js.map +1 -1
- package/dist/tools/rss.d.ts +27 -0
- package/dist/tools/rss.d.ts.map +1 -0
- package/dist/tools/rss.js +123 -0
- package/dist/tools/rss.js.map +1 -0
- package/dist/tools/run-skill.d.ts +10 -4
- package/dist/tools/run-skill.d.ts.map +1 -1
- package/dist/tools/run-skill.js +340 -20
- package/dist/tools/run-skill.js.map +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +3 -11
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/video-search.d.ts.map +1 -1
- package/dist/tools/video-search.js +3 -11
- package/dist/tools/video-search.js.map +1 -1
- package/dist/tools/youtube.d.ts +4 -4
- package/dist/tools/youtube.d.ts.map +1 -1
- package/dist/tools/youtube.js +102 -21
- package/dist/tools/youtube.js.map +1 -1
- package/dist/utils/debug.d.ts +2 -0
- package/dist/utils/debug.d.ts.map +1 -0
- package/dist/utils/debug.js +6 -0
- package/dist/utils/debug.js.map +1 -0
- package/dist/utils/fetcher.d.ts.map +1 -1
- package/dist/utils/fetcher.js +1 -3
- package/dist/utils/fetcher.js.map +1 -1
- package/dist/utils/tool-response.d.ts +13 -0
- package/dist/utils/tool-response.d.ts.map +1 -0
- package/dist/utils/tool-response.js +7 -0
- package/dist/utils/tool-response.js.map +1 -0
- package/package.json +5 -9
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { smartFetch } from "../stealth/index.js";
|
|
3
|
+
import { issueRequest } from "../brave-api/index.js";
|
|
4
|
+
import { hasBraveApiKey } from "../config.js";
|
|
5
|
+
import { MAX_QUERY_LENGTH, MAX_ITEMS } from "../constants.js";
|
|
6
|
+
import { parseCompactNumber, sanitizeText, extractScriptJson } from "../social/parsers.js";
|
|
7
|
+
import { toolResult, errorResult } from "../utils/tool-response.js";
|
|
8
|
+
import { debugLog } from "../utils/debug.js";
|
|
9
|
+
export const name = "instagram";
|
|
10
|
+
export const description = "Search Instagram profiles, get profile details with engagement metrics, and discover influencers by niche/location. Search/discover require BRAVE_API_KEY.";
|
|
11
|
+
const ActionEnum = z.enum(["search", "profile", "discover"]);
|
|
12
|
+
export const schema = z.object({
|
|
13
|
+
action: ActionEnum.describe("Action: search (find profiles), profile (get details), discover (full pipeline)"),
|
|
14
|
+
// search + discover
|
|
15
|
+
query: z.string().max(MAX_QUERY_LENGTH).optional().describe("Search query (for action: search)"),
|
|
16
|
+
location: z.string().max(200).optional().describe("Location filter, e.g. 'beograd', 'new york'"),
|
|
17
|
+
niche: z.string().max(500).optional().describe("Niche/industry for discovery, e.g. 'travel hotel', 'food'"),
|
|
18
|
+
// profile
|
|
19
|
+
username: z.string().max(200).optional().describe("Single username (for action: profile)"),
|
|
20
|
+
usernames: z.array(z.string().max(200)).max(100).optional().describe("Multiple usernames (for action: profile)"),
|
|
21
|
+
// filters (discover)
|
|
22
|
+
min_followers: z.number().min(0).default(1000).optional().describe("Minimum followers (discover filter)"),
|
|
23
|
+
max_followers: z.number().min(0).default(80000).optional().describe("Maximum followers (discover filter)"),
|
|
24
|
+
min_engagement: z.number().min(0).default(3).optional().describe("Minimum engagement rate % (discover filter)"),
|
|
25
|
+
max_days_since_post: z.number().min(1).default(30).optional().describe("Max days since last post (discover filter)"),
|
|
26
|
+
// general
|
|
27
|
+
limit: z.number().min(1).max(MAX_ITEMS).default(20).describe("Max results to return"),
|
|
28
|
+
sort: z.enum(["engagement", "followers"]).default("engagement").describe("Sort order for results"),
|
|
29
|
+
});
|
|
30
|
+
// ── Constants ──
|
|
31
|
+
const IG_API_BASE = "https://i.instagram.com/api/v1";
|
|
32
|
+
const IG_APP_ID = "936619743392459";
|
|
33
|
+
const IG_USER_AGENT = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1";
|
|
34
|
+
// Paths that are NOT user profiles
|
|
35
|
+
const NON_PROFILE_PATHS = new Set([
|
|
36
|
+
"explore", "accounts", "about", "legal", "privacy", "terms",
|
|
37
|
+
"developer", "reels", "stories", "p", "reel", "tv", "direct",
|
|
38
|
+
"directory", "web", "challenge", "emails", "session", "nametag",
|
|
39
|
+
"lite", "ar", "creators", "branded_content", "shopping",
|
|
40
|
+
]);
|
|
41
|
+
// ── Helpers ──
|
|
42
|
+
function sleep(ms) {
|
|
43
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
44
|
+
}
|
|
45
|
+
function extractUsernamesFromUrls(urls) {
|
|
46
|
+
const usernames = new Set();
|
|
47
|
+
const usernameRegex = /instagram\.com\/([a-zA-Z0-9_.]{1,30})\/?(?:\?|$|#|\/)/;
|
|
48
|
+
for (const url of urls) {
|
|
49
|
+
const match = usernameRegex.exec(url);
|
|
50
|
+
if (match) {
|
|
51
|
+
const username = match[1].toLowerCase();
|
|
52
|
+
if (!NON_PROFILE_PATHS.has(username)) {
|
|
53
|
+
usernames.add(username);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return Array.from(usernames);
|
|
58
|
+
}
|
|
59
|
+
// ── Search via Brave ──
|
|
60
|
+
async function searchProfiles(query, location, limit = 20) {
|
|
61
|
+
if (!hasBraveApiKey()) {
|
|
62
|
+
throw new Error("BRAVE_API_KEY is required for instagram search/discover. Set it in your environment or run: imperium-crawl setup");
|
|
63
|
+
}
|
|
64
|
+
// Build search queries — no quotes around terms for broader results
|
|
65
|
+
const baseQuery = `site:instagram.com ${query}`;
|
|
66
|
+
const locationSuffix = location ? ` ${location}` : "";
|
|
67
|
+
const excludes = ' -"/p/" -"/reel/" -"/explore/"';
|
|
68
|
+
// Build multiple query variations to gather more profiles
|
|
69
|
+
const queries = [
|
|
70
|
+
`${baseQuery}${locationSuffix}${excludes}`,
|
|
71
|
+
];
|
|
72
|
+
// Add variation queries for discover (when we need more results)
|
|
73
|
+
if (limit > 20) {
|
|
74
|
+
queries.push(`site:instagram.com ${query} influencer${locationSuffix}${excludes}`);
|
|
75
|
+
queries.push(`site:instagram.com ${query} blogger${locationSuffix}${excludes}`);
|
|
76
|
+
queries.push(`site:instagram.com ${query} content creator${locationSuffix}${excludes}`);
|
|
77
|
+
queries.push(`site:instagram.com ${query} guide${locationSuffix}${excludes}`);
|
|
78
|
+
}
|
|
79
|
+
const allUrls = [];
|
|
80
|
+
for (const q of queries) {
|
|
81
|
+
try {
|
|
82
|
+
const data = await issueRequest(process.env.BRAVE_API_KEY, "/web/search", {
|
|
83
|
+
q,
|
|
84
|
+
count: 20,
|
|
85
|
+
});
|
|
86
|
+
const results = data?.web?.results || [];
|
|
87
|
+
allUrls.push(...results.map((r) => r.url).filter(Boolean));
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
debugLog("instagram", `Brave search query failed: ${q}`, err);
|
|
91
|
+
}
|
|
92
|
+
// Respect Brave rate limit (Free: 1 req/sec)
|
|
93
|
+
if (queries.indexOf(q) < queries.length - 1) {
|
|
94
|
+
await sleep(1500);
|
|
95
|
+
}
|
|
96
|
+
// Stop if we have enough unique usernames
|
|
97
|
+
if (extractUsernamesFromUrls(allUrls).length >= limit * 2)
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
return extractUsernamesFromUrls(allUrls);
|
|
101
|
+
}
|
|
102
|
+
// ── Profile Fetch — Dual Strategy ──
|
|
103
|
+
/** Strategy 1: Instagram internal API (fast, but rate-limited) */
|
|
104
|
+
async function fetchProfileViaApi(username) {
|
|
105
|
+
const res = await fetch(`${IG_API_BASE}/users/web_profile_info/?username=${encodeURIComponent(username)}`, {
|
|
106
|
+
headers: {
|
|
107
|
+
"x-ig-app-id": IG_APP_ID,
|
|
108
|
+
"User-Agent": IG_USER_AGENT,
|
|
109
|
+
Accept: "*/*",
|
|
110
|
+
},
|
|
111
|
+
signal: AbortSignal.timeout(15_000),
|
|
112
|
+
});
|
|
113
|
+
if (res.status === 429)
|
|
114
|
+
return null; // Signal to try fallback
|
|
115
|
+
if (!res.ok)
|
|
116
|
+
return null;
|
|
117
|
+
let data;
|
|
118
|
+
try {
|
|
119
|
+
data = await res.json();
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
debugLog("instagram", `API JSON parse failed for @${username}`, err);
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
if (data?.status === "fail" || !data?.data?.user)
|
|
126
|
+
return null;
|
|
127
|
+
return parseApiUser(data.data.user, username);
|
|
128
|
+
}
|
|
129
|
+
/** Strategy 2: Web scrape profile page — requires browser (level 3) for IG */
|
|
130
|
+
async function fetchProfileViaWeb(username) {
|
|
131
|
+
try {
|
|
132
|
+
const result = await smartFetch(`https://www.instagram.com/${encodeURIComponent(username)}/`, {
|
|
133
|
+
forceLevel: 3,
|
|
134
|
+
});
|
|
135
|
+
// Try embedded JSON first (older IG layouts)
|
|
136
|
+
const jsonData = extractScriptJson(result.html, "__additionalDataLoaded")
|
|
137
|
+
?? extractScriptJson(result.html, "__initialData");
|
|
138
|
+
if (jsonData) {
|
|
139
|
+
const user = jsonData?.graphql?.user
|
|
140
|
+
?? jsonData?.data?.user
|
|
141
|
+
?? jsonData?.user;
|
|
142
|
+
if (user && (user.edge_followed_by || user.follower_count)) {
|
|
143
|
+
return parseProfileData(user, username);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Fallback: extract from meta tags (works on current IG layout)
|
|
147
|
+
const metaData = extractProfileFromMeta(result.html, username);
|
|
148
|
+
if (metaData) {
|
|
149
|
+
return parseProfileData(metaData, username);
|
|
150
|
+
}
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
debugLog("instagram", `Web scrape failed for @${username}`, err);
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/** Extract profile data from meta tags — works on current IG layout.
|
|
159
|
+
* OG description format: "298M Followers, 243 Following, 1,614 Posts - See Instagram photos..." */
|
|
160
|
+
function extractProfileFromMeta(html, username) {
|
|
161
|
+
// Match og:description — try multiple patterns
|
|
162
|
+
const descMatch = html.match(/og:description[^>]*content="([^"]+)"/i)
|
|
163
|
+
?? html.match(/og:description[^>]*content='([^']+)'/i)
|
|
164
|
+
?? html.match(/<meta\s+name="description"\s+content="([^"]+)"/i);
|
|
165
|
+
if (!descMatch)
|
|
166
|
+
return null;
|
|
167
|
+
const desc = descMatch[1];
|
|
168
|
+
const followersMatch = desc.match(/([\d,.]+[KMB]?)\s*Followers/i);
|
|
169
|
+
const followingMatch = desc.match(/([\d,.]+[KMB]?)\s*Following/i);
|
|
170
|
+
const postsMatch = desc.match(/([\d,.]+[KMB]?)\s*Posts/i);
|
|
171
|
+
if (!followersMatch)
|
|
172
|
+
return null;
|
|
173
|
+
const followers = parseCompactNumber(followersMatch[1]);
|
|
174
|
+
const following = parseCompactNumber(followingMatch?.[1] || "0");
|
|
175
|
+
const posts = parseCompactNumber(postsMatch?.[1] || "0");
|
|
176
|
+
// Extract name from title: "Name (@username) • Instagram photos and videos"
|
|
177
|
+
const titleMatch = html.match(/<title>\s*([^<]+)/);
|
|
178
|
+
let name = username;
|
|
179
|
+
if (titleMatch) {
|
|
180
|
+
// Clean: remove " • Instagram..." suffix, extract before (@username)
|
|
181
|
+
let raw = titleMatch[1].replace(/\s*[•·|]\s*Instagram.*/i, "").trim();
|
|
182
|
+
const parenIdx = raw.indexOf("(@");
|
|
183
|
+
if (parenIdx > 0)
|
|
184
|
+
raw = raw.substring(0, parenIdx).trim();
|
|
185
|
+
if (raw)
|
|
186
|
+
name = raw;
|
|
187
|
+
}
|
|
188
|
+
// Extract bio from description after stats
|
|
189
|
+
// Format: "1,614 Posts - See Instagram photos and videos from Nike (@nike)"
|
|
190
|
+
// Or with bio: "1,614 Posts - Bio text here. See Instagram photos..."
|
|
191
|
+
let bio = "";
|
|
192
|
+
const afterPosts = desc.match(/Posts\s*[-–]\s*(.+)/i);
|
|
193
|
+
if (afterPosts) {
|
|
194
|
+
let rawBio = afterPosts[1];
|
|
195
|
+
// Remove "See Instagram photos and videos from Name (@username)" boilerplate
|
|
196
|
+
rawBio = rawBio.replace(/See Instagram photos and videos from .+$/i, "").trim();
|
|
197
|
+
// Remove trailing (@username) fragments
|
|
198
|
+
rawBio = rawBio.replace(/\(@?[\w.]+\)\s*$/, "").trim();
|
|
199
|
+
bio = sanitizeText(rawBio).substring(0, 1000);
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
full_name: name,
|
|
203
|
+
biography: bio,
|
|
204
|
+
edge_followed_by: { count: isNaN(followers) ? 0 : followers },
|
|
205
|
+
edge_follow: { count: isNaN(following) ? 0 : following },
|
|
206
|
+
edge_owner_to_timeline_media: { count: isNaN(posts) ? 0 : posts, edges: [] },
|
|
207
|
+
is_private: false,
|
|
208
|
+
is_verified: html.includes('"is_verified":true'),
|
|
209
|
+
is_business_account: html.includes('"is_business_account":true') || html.includes('"is_professional_account":true'),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
/** Parse user data from API response format */
|
|
213
|
+
function parseApiUser(user, username) {
|
|
214
|
+
if (user.is_private)
|
|
215
|
+
return null;
|
|
216
|
+
const followers = user.edge_followed_by?.count ?? 0;
|
|
217
|
+
const following = user.edge_follow?.count ?? 0;
|
|
218
|
+
const postsCount = user.edge_owner_to_timeline_media?.count ?? 0;
|
|
219
|
+
const edges = user.edge_owner_to_timeline_media?.edges ?? [];
|
|
220
|
+
const recentPosts = extractRecentPosts(edges);
|
|
221
|
+
const engagementRate = calcEngagement(followers, recentPosts);
|
|
222
|
+
return {
|
|
223
|
+
name: user.full_name || username,
|
|
224
|
+
username,
|
|
225
|
+
url: `https://www.instagram.com/${username}/`,
|
|
226
|
+
description: (user.biography || "").substring(0, 1000),
|
|
227
|
+
avatar: user.profile_pic_url_hd || user.profile_pic_url,
|
|
228
|
+
verified: user.is_verified ?? false,
|
|
229
|
+
followers,
|
|
230
|
+
following,
|
|
231
|
+
posts_count: postsCount,
|
|
232
|
+
is_business: user.is_business_account ?? user.is_professional_account ?? false,
|
|
233
|
+
business_email: user.business_email || undefined,
|
|
234
|
+
engagement_rate: engagementRate,
|
|
235
|
+
recent_posts: recentPosts,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/** Parse user data from web scrape (similar structure, slightly different fields) */
|
|
239
|
+
function parseProfileData(user, username) {
|
|
240
|
+
if (user.is_private)
|
|
241
|
+
return null;
|
|
242
|
+
const followers = user.edge_followed_by?.count ?? user.follower_count ?? 0;
|
|
243
|
+
const following = user.edge_follow?.count ?? user.following_count ?? 0;
|
|
244
|
+
const postsCount = user.edge_owner_to_timeline_media?.count ?? user.media_count ?? 0;
|
|
245
|
+
const edges = user.edge_owner_to_timeline_media?.edges ?? [];
|
|
246
|
+
const recentPosts = extractRecentPosts(edges);
|
|
247
|
+
const engagementRate = calcEngagement(followers, recentPosts);
|
|
248
|
+
return {
|
|
249
|
+
name: user.full_name || username,
|
|
250
|
+
username,
|
|
251
|
+
url: `https://www.instagram.com/${username}/`,
|
|
252
|
+
description: (user.biography || "").substring(0, 1000),
|
|
253
|
+
avatar: user.profile_pic_url_hd || user.profile_pic_url,
|
|
254
|
+
verified: user.is_verified ?? false,
|
|
255
|
+
followers,
|
|
256
|
+
following,
|
|
257
|
+
posts_count: postsCount,
|
|
258
|
+
is_business: user.is_business_account ?? user.is_professional_account ?? false,
|
|
259
|
+
business_email: user.business_email || undefined,
|
|
260
|
+
engagement_rate: engagementRate,
|
|
261
|
+
recent_posts: recentPosts,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
function extractRecentPosts(edges) {
|
|
265
|
+
const posts = [];
|
|
266
|
+
for (let i = 0; i < Math.min(edges.length, 3); i++) {
|
|
267
|
+
const node = edges[i]?.node;
|
|
268
|
+
if (!node)
|
|
269
|
+
continue;
|
|
270
|
+
posts.push({
|
|
271
|
+
id: node.id || node.shortcode || "",
|
|
272
|
+
url: node.shortcode ? `https://www.instagram.com/p/${node.shortcode}/` : "",
|
|
273
|
+
likes: node.edge_liked_by?.count ?? node.edge_media_preview_like?.count ?? 0,
|
|
274
|
+
comments: node.edge_media_to_comment?.count ?? 0,
|
|
275
|
+
caption: sanitizeText(node.edge_media_to_caption?.edges?.[0]?.node?.text || "").substring(0, 500),
|
|
276
|
+
timestamp: node.taken_at_timestamp
|
|
277
|
+
? new Date(node.taken_at_timestamp * 1000).toISOString()
|
|
278
|
+
: "",
|
|
279
|
+
is_video: node.is_video ?? false,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
return posts;
|
|
283
|
+
}
|
|
284
|
+
function calcEngagement(followers, posts) {
|
|
285
|
+
if (followers <= 0 || posts.length === 0)
|
|
286
|
+
return 0;
|
|
287
|
+
const total = posts.reduce((sum, p) => sum + p.likes + p.comments, 0);
|
|
288
|
+
return Math.round((total / posts.length / followers) * 100 * 100) / 100;
|
|
289
|
+
}
|
|
290
|
+
/** Main fetch with fallback chain: API → Web → Meta tags */
|
|
291
|
+
async function fetchProfile(username) {
|
|
292
|
+
// Try API first (fastest)
|
|
293
|
+
try {
|
|
294
|
+
const profile = await fetchProfileViaApi(username);
|
|
295
|
+
if (profile)
|
|
296
|
+
return profile;
|
|
297
|
+
}
|
|
298
|
+
catch (err) {
|
|
299
|
+
debugLog("instagram", `API fetch failed for @${username}, trying web`, err);
|
|
300
|
+
}
|
|
301
|
+
// Fallback: web scrape profile page
|
|
302
|
+
try {
|
|
303
|
+
const profile = await fetchProfileViaWeb(username);
|
|
304
|
+
if (profile)
|
|
305
|
+
return profile;
|
|
306
|
+
}
|
|
307
|
+
catch (err) {
|
|
308
|
+
debugLog("instagram", `Web fetch also failed for @${username}`, err);
|
|
309
|
+
}
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
// ── Batch Profile Fetch ──
|
|
313
|
+
async function fetchProfiles(usernames, onProgress) {
|
|
314
|
+
const profiles = [];
|
|
315
|
+
let stoppedEarly = false;
|
|
316
|
+
let consecutiveNulls = 0;
|
|
317
|
+
for (let i = 0; i < usernames.length; i++) {
|
|
318
|
+
if (onProgress)
|
|
319
|
+
onProgress(i + 1, usernames.length, usernames[i]);
|
|
320
|
+
const profile = await fetchProfile(usernames[i]);
|
|
321
|
+
profiles.push(profile);
|
|
322
|
+
if (profile) {
|
|
323
|
+
consecutiveNulls = 0;
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
consecutiveNulls++;
|
|
327
|
+
// 5 consecutive nulls likely means rate limiting — stop early
|
|
328
|
+
if (consecutiveNulls >= 5) {
|
|
329
|
+
process.stderr.write(`\n⚠️ ${consecutiveNulls} consecutive failures after ${i + 1}/${usernames.length} profiles. Likely rate-limited. Returning partial results.\n`);
|
|
330
|
+
stoppedEarly = true;
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// Rate limit: 1.5 req/sec between calls
|
|
335
|
+
if (i < usernames.length - 1) {
|
|
336
|
+
await sleep(1500);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return { profiles, stopped_early: stoppedEarly };
|
|
340
|
+
}
|
|
341
|
+
// ── Discover Pipeline ──
|
|
342
|
+
async function discoverInfluencers(input) {
|
|
343
|
+
const niche = input.niche || input.query || "";
|
|
344
|
+
if (!niche) {
|
|
345
|
+
throw new Error("niche or query is required for discover action");
|
|
346
|
+
}
|
|
347
|
+
const minFollowers = input.min_followers ?? 1000;
|
|
348
|
+
const maxFollowers = input.max_followers ?? 80000;
|
|
349
|
+
const minEngagement = input.min_engagement ?? 3;
|
|
350
|
+
const maxDaysSincePost = input.max_days_since_post ?? 30;
|
|
351
|
+
const limit = input.limit;
|
|
352
|
+
// Phase 1: Search for usernames
|
|
353
|
+
process.stderr.write(`🔍 Searching Instagram profiles for "${niche}"${input.location ? ` in ${input.location}` : ""}...\n`);
|
|
354
|
+
const usernames = await searchProfiles(niche, input.location, limit * 3);
|
|
355
|
+
if (usernames.length === 0) {
|
|
356
|
+
return {
|
|
357
|
+
query: niche,
|
|
358
|
+
location: input.location,
|
|
359
|
+
filters: { min_followers: minFollowers, max_followers: maxFollowers, min_engagement: minEngagement },
|
|
360
|
+
profiles: [],
|
|
361
|
+
total_scanned: 0,
|
|
362
|
+
total_matched: 0,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
process.stderr.write(`📋 Found ${usernames.length} potential profiles. Fetching details...\n`);
|
|
366
|
+
// Phase 2: Fetch profiles with rate limiting
|
|
367
|
+
const { profiles: rawProfiles, stopped_early } = await fetchProfiles(usernames, (current, total, username) => {
|
|
368
|
+
process.stderr.write(` Fetching profile ${current}/${total}: @${username}...\r`);
|
|
369
|
+
});
|
|
370
|
+
process.stderr.write("\n");
|
|
371
|
+
// Phase 3: Filter
|
|
372
|
+
const cutoffDate = new Date();
|
|
373
|
+
cutoffDate.setDate(cutoffDate.getDate() - maxDaysSincePost);
|
|
374
|
+
const filtered = rawProfiles.filter((p) => {
|
|
375
|
+
if (!p)
|
|
376
|
+
return false;
|
|
377
|
+
if (p.followers < minFollowers || p.followers > maxFollowers)
|
|
378
|
+
return false;
|
|
379
|
+
if (p.engagement_rate < minEngagement)
|
|
380
|
+
return false;
|
|
381
|
+
// Check recency of last post
|
|
382
|
+
if (p.recent_posts.length > 0) {
|
|
383
|
+
const lastPost = p.recent_posts[0];
|
|
384
|
+
if (lastPost.timestamp && new Date(lastPost.timestamp) < cutoffDate)
|
|
385
|
+
return false;
|
|
386
|
+
}
|
|
387
|
+
return true;
|
|
388
|
+
});
|
|
389
|
+
// Phase 4: Sort
|
|
390
|
+
const sorted = filtered.sort((a, b) => input.sort === "followers"
|
|
391
|
+
? b.followers - a.followers
|
|
392
|
+
: b.engagement_rate - a.engagement_rate);
|
|
393
|
+
const result = sorted.slice(0, limit);
|
|
394
|
+
if (stopped_early) {
|
|
395
|
+
process.stderr.write(`⚠️ Results may be incomplete due to rate limiting.\n`);
|
|
396
|
+
}
|
|
397
|
+
process.stderr.write(`✅ Found ${result.length} influencers matching criteria.\n`);
|
|
398
|
+
return {
|
|
399
|
+
query: niche,
|
|
400
|
+
location: input.location,
|
|
401
|
+
filters: { min_followers: minFollowers, max_followers: maxFollowers, min_engagement: minEngagement },
|
|
402
|
+
profiles: result,
|
|
403
|
+
total_scanned: rawProfiles.length,
|
|
404
|
+
total_matched: result.length,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
// ── Execute ──
|
|
408
|
+
export async function execute(input) {
|
|
409
|
+
try {
|
|
410
|
+
let result;
|
|
411
|
+
switch (input.action) {
|
|
412
|
+
case "search": {
|
|
413
|
+
if (!input.query) {
|
|
414
|
+
return errorResult("query is required for search action");
|
|
415
|
+
}
|
|
416
|
+
const usernames = await searchProfiles(input.query, input.location, input.limit);
|
|
417
|
+
result = {
|
|
418
|
+
query: input.query,
|
|
419
|
+
location: input.location,
|
|
420
|
+
platform: "instagram",
|
|
421
|
+
usernames,
|
|
422
|
+
count: usernames.length,
|
|
423
|
+
};
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
case "profile": {
|
|
427
|
+
const targets = input.usernames?.length ? input.usernames : (input.username ? [input.username] : []);
|
|
428
|
+
if (targets.length === 0) {
|
|
429
|
+
return errorResult("username or usernames is required for profile action");
|
|
430
|
+
}
|
|
431
|
+
if (targets.length === 1) {
|
|
432
|
+
const profile = await fetchProfile(targets[0]);
|
|
433
|
+
result = profile || { error: `Could not fetch profile for @${targets[0]}. Account may be private or not found.` };
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
const { profiles, stopped_early } = await fetchProfiles(targets, (current, total, username) => {
|
|
437
|
+
process.stderr.write(` Fetching profile ${current}/${total}: @${username}...\r`);
|
|
438
|
+
});
|
|
439
|
+
process.stderr.write("\n");
|
|
440
|
+
const successful = profiles.filter((p) => p !== null);
|
|
441
|
+
result = {
|
|
442
|
+
profiles: successful,
|
|
443
|
+
total_requested: targets.length,
|
|
444
|
+
total_fetched: successful.length,
|
|
445
|
+
failed: targets.filter((_, i) => profiles[i] === null),
|
|
446
|
+
stopped_early,
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
break;
|
|
450
|
+
}
|
|
451
|
+
case "discover": {
|
|
452
|
+
result = await discoverInfluencers(input);
|
|
453
|
+
break;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return toolResult(result);
|
|
457
|
+
}
|
|
458
|
+
catch (err) {
|
|
459
|
+
return errorResult(err instanceof Error ? err.message : String(err));
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
//# sourceMappingURL=instagram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instagram.js","sourceRoot":"","sources":["../../src/tools/instagram.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/interact.d.ts
CHANGED
|
@@ -63,7 +63,7 @@ export declare const schema: z.ZodObject<{
|
|
|
63
63
|
target_selector?: string | undefined;
|
|
64
64
|
target_ref?: string | undefined;
|
|
65
65
|
file_paths?: string[] | undefined;
|
|
66
|
-
storage?: "
|
|
66
|
+
storage?: "session" | "local" | undefined;
|
|
67
67
|
auth_profile?: string | undefined;
|
|
68
68
|
cookies?: {
|
|
69
69
|
value: string;
|
|
@@ -90,7 +90,7 @@ export declare const schema: z.ZodObject<{
|
|
|
90
90
|
target_selector?: string | undefined;
|
|
91
91
|
target_ref?: string | undefined;
|
|
92
92
|
file_paths?: string[] | undefined;
|
|
93
|
-
storage?: "
|
|
93
|
+
storage?: "session" | "local" | undefined;
|
|
94
94
|
auth_profile?: string | undefined;
|
|
95
95
|
cookies?: {
|
|
96
96
|
value: string;
|
|
@@ -180,7 +180,7 @@ export declare const schema: z.ZodObject<{
|
|
|
180
180
|
target_selector?: string | undefined;
|
|
181
181
|
target_ref?: string | undefined;
|
|
182
182
|
file_paths?: string[] | undefined;
|
|
183
|
-
storage?: "
|
|
183
|
+
storage?: "session" | "local" | undefined;
|
|
184
184
|
auth_profile?: string | undefined;
|
|
185
185
|
cookies?: {
|
|
186
186
|
value: string;
|
|
@@ -234,7 +234,7 @@ export declare const schema: z.ZodObject<{
|
|
|
234
234
|
target_selector?: string | undefined;
|
|
235
235
|
target_ref?: string | undefined;
|
|
236
236
|
file_paths?: string[] | undefined;
|
|
237
|
-
storage?: "
|
|
237
|
+
storage?: "session" | "local" | undefined;
|
|
238
238
|
auth_profile?: string | undefined;
|
|
239
239
|
cookies?: {
|
|
240
240
|
value: string;
|
package/dist/tools/interact.js
CHANGED
|
@@ -506,7 +506,7 @@ export async function execute(input) {
|
|
|
506
506
|
actionResults.push({ type: action.type, success: false, error: `Action '${action.type}' denied by policy` });
|
|
507
507
|
continue;
|
|
508
508
|
}
|
|
509
|
-
// "confirm" is treated as "allow"
|
|
509
|
+
// "confirm" is treated as "allow" (no interactive prompt available)
|
|
510
510
|
}
|
|
511
511
|
// Human-like delay between actions
|
|
512
512
|
await page.waitForTimeout(humanDelay());
|