@bubblelab/bubble-core 0.1.6 → 0.1.9
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/dist/bubble-bundle.d.ts +628 -299
- package/dist/bubble-factory.d.ts.map +1 -1
- package/dist/bubble-factory.js +13 -9
- package/dist/bubble-factory.js.map +1 -1
- package/dist/bubbles/service-bubble/ai-agent.d.ts +129 -111
- package/dist/bubbles/service-bubble/ai-agent.d.ts.map +1 -1
- package/dist/bubbles/service-bubble/ai-agent.js +273 -95
- package/dist/bubbles/service-bubble/ai-agent.js.map +1 -1
- package/dist/bubbles/service-bubble/apify/actors/instagram-hashtag-scraper.d.ts +805 -0
- package/dist/bubbles/service-bubble/apify/actors/instagram-hashtag-scraper.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/actors/instagram-hashtag-scraper.js +131 -0
- package/dist/bubbles/service-bubble/apify/actors/instagram-hashtag-scraper.js.map +1 -0
- package/dist/bubbles/service-bubble/apify/actors/instagram-scraper.d.ts +485 -0
- package/dist/bubbles/service-bubble/apify/actors/instagram-scraper.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/actors/instagram-scraper.js +176 -0
- package/dist/bubbles/service-bubble/apify/actors/instagram-scraper.js.map +1 -0
- package/dist/bubbles/service-bubble/apify/actors/linkedin-posts-search.d.ts +302 -0
- package/dist/bubbles/service-bubble/apify/actors/linkedin-posts-search.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/actors/linkedin-posts-search.js +138 -0
- package/dist/bubbles/service-bubble/apify/actors/linkedin-posts-search.js.map +1 -0
- package/dist/bubbles/service-bubble/apify/actors/linkedin-profile-posts.d.ts +642 -0
- package/dist/bubbles/service-bubble/apify/actors/linkedin-profile-posts.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/actors/linkedin-profile-posts.js +123 -0
- package/dist/bubbles/service-bubble/apify/actors/linkedin-profile-posts.js.map +1 -0
- package/dist/bubbles/service-bubble/apify/api-scraper.schema.d.ts +370 -0
- package/dist/bubbles/service-bubble/apify/api-scraper.schema.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/api-scraper.schema.js +14 -0
- package/dist/bubbles/service-bubble/apify/api-scraper.schema.js.map +1 -0
- package/dist/bubbles/service-bubble/apify/apify-scraper.schema.d.ts +1770 -0
- package/dist/bubbles/service-bubble/apify/apify-scraper.schema.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/apify-scraper.schema.js +38 -0
- package/dist/bubbles/service-bubble/apify/apify-scraper.schema.js.map +1 -0
- package/dist/bubbles/service-bubble/apify/apify.d.ts +143 -0
- package/dist/bubbles/service-bubble/apify/apify.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/apify.js +276 -0
- package/dist/bubbles/service-bubble/apify/apify.js.map +1 -0
- package/dist/bubbles/service-bubble/apify/index.d.ts +4 -0
- package/dist/bubbles/service-bubble/apify/index.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/index.js +3 -0
- package/dist/bubbles/service-bubble/apify/index.js.map +1 -0
- package/dist/bubbles/service-bubble/apify/types.d.ts +7 -0
- package/dist/bubbles/service-bubble/apify/types.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify/types.js +6 -0
- package/dist/bubbles/service-bubble/apify/types.js.map +1 -0
- package/dist/bubbles/service-bubble/apify.d.ts +136 -0
- package/dist/bubbles/service-bubble/apify.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/apify.js +282 -0
- package/dist/bubbles/service-bubble/apify.js.map +1 -0
- package/dist/bubbles/service-bubble/gmail.d.ts +376 -376
- package/dist/bubbles/service-bubble/google-calendar.d.ts +24 -24
- package/dist/bubbles/service-bubble/google-drive.d.ts +68 -68
- package/dist/bubbles/service-bubble/google-sheets.d.ts +64 -64
- package/dist/bubbles/service-bubble/hello-world.d.ts +4 -4
- package/dist/bubbles/service-bubble/http.d.ts +16 -16
- package/dist/bubbles/service-bubble/postgresql.d.ts +12 -12
- package/dist/bubbles/service-bubble/resend.d.ts +17 -17
- package/dist/bubbles/service-bubble/resend.d.ts.map +1 -1
- package/dist/bubbles/service-bubble/resend.js +16 -5
- package/dist/bubbles/service-bubble/resend.js.map +1 -1
- package/dist/bubbles/service-bubble/slack.d.ts +470 -470
- package/dist/bubbles/service-bubble/storage.d.ts +32 -32
- package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.d.ts +4 -4
- package/dist/bubbles/tool-bubble/chart-js-tool.d.ts +12 -12
- package/dist/bubbles/tool-bubble/get-bubble-details-tool.d.ts +18 -5
- package/dist/bubbles/tool-bubble/get-bubble-details-tool.d.ts.map +1 -1
- package/dist/bubbles/tool-bubble/get-bubble-details-tool.js +85 -39
- package/dist/bubbles/tool-bubble/get-bubble-details-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/instagram-tool.d.ts +435 -0
- package/dist/bubbles/tool-bubble/instagram-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/instagram-tool.js +474 -0
- package/dist/bubbles/tool-bubble/instagram-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/linkedin-tool.d.ts +2136 -0
- package/dist/bubbles/tool-bubble/linkedin-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/linkedin-tool.js +608 -0
- package/dist/bubbles/tool-bubble/linkedin-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/list-bubbles-tool.d.ts +4 -4
- package/dist/bubbles/tool-bubble/reddit-scrape-tool.d.ts +14 -14
- package/dist/bubbles/tool-bubble/research-agent-tool.d.ts +14 -14
- package/dist/bubbles/tool-bubble/research-agent-tool.js +1 -1
- package/dist/bubbles/tool-bubble/research-agent-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/sql-query-tool.d.ts +8 -8
- package/dist/bubbles/tool-bubble/tool-template.d.ts +4 -4
- package/dist/bubbles/tool-bubble/web-crawl-tool.d.ts +4 -4
- package/dist/bubbles/tool-bubble/web-extract-tool.d.ts +8 -8
- package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts +4 -4
- package/dist/bubbles/tool-bubble/web-scrape-tool.js +1 -1
- package/dist/bubbles/tool-bubble/web-scrape-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/web-search-tool.d.ts +10 -10
- package/dist/bubbles/tool-bubble/web-search-tool.js +1 -1
- package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.d.ts +8 -8
- package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.d.ts.map +1 -1
- package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.js +5 -0
- package/dist/bubbles/workflow-bubble/bubbleflow-generator.workflow.js.map +1 -1
- package/dist/bubbles/workflow-bubble/database-analyzer.workflow.d.ts +4 -4
- package/dist/bubbles/workflow-bubble/generate-document.workflow.d.ts +14 -14
- package/dist/bubbles/workflow-bubble/generate-document.workflow.js +1 -1
- package/dist/bubbles/workflow-bubble/generate-document.workflow.js.map +1 -1
- package/dist/bubbles/workflow-bubble/parse-document.workflow.d.ts +14 -14
- package/dist/bubbles/workflow-bubble/parse-document.workflow.js +1 -1
- package/dist/bubbles/workflow-bubble/parse-document.workflow.js.map +1 -1
- package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts +106 -106
- package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts.map +1 -1
- package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.js +1 -4
- package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.js.map +1 -1
- package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.d.ts +28 -28
- package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.js +1 -1
- package/dist/bubbles/workflow-bubble/pdf-ocr.workflow.js.map +1 -1
- package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.d.ts +12 -12
- package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.js +1 -1
- package/dist/bubbles/workflow-bubble/slack-data-assistant.workflow.js.map +1 -1
- package/dist/bubbles/workflow-bubble/slack-formatter-agent.d.ts +32 -32
- package/dist/bubbles/workflow-bubble/slack-formatter-agent.js +1 -1
- package/dist/bubbles/workflow-bubble/slack-formatter-agent.js.map +1 -1
- package/dist/bubbles/workflow-bubble/slack-notifier.workflow.d.ts +14 -14
- package/dist/bubbles/workflow-bubble/slack-notifier.workflow.d.ts.map +1 -1
- package/dist/bubbles/workflow-bubble/slack-notifier.workflow.js +1 -2
- package/dist/bubbles/workflow-bubble/slack-notifier.workflow.js.map +1 -1
- package/dist/bubbles.json +474 -0
- package/dist/index.d.ts +12 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/logging/BubbleLogger.d.ts +11 -0
- package/dist/logging/BubbleLogger.d.ts.map +1 -1
- package/dist/logging/BubbleLogger.js +69 -22
- package/dist/logging/BubbleLogger.js.map +1 -1
- package/dist/logging/StreamingBubbleLogger.d.ts.map +1 -1
- package/dist/logging/StreamingBubbleLogger.js +18 -11
- package/dist/logging/StreamingBubbleLogger.js.map +1 -1
- package/dist/types/ai-models.d.ts +1 -1
- package/dist/types/ai-models.d.ts.map +1 -1
- package/dist/types/ai-models.js +4 -0
- package/dist/types/ai-models.js.map +1 -1
- package/dist/types/api-scraper.schema.d.ts +453 -0
- package/dist/types/api-scraper.schema.d.ts.map +1 -0
- package/dist/types/api-scraper.schema.js +160 -0
- package/dist/types/api-scraper.schema.js.map +1 -0
- package/dist/types/available-tools.d.ts +1 -1
- package/dist/types/available-tools.d.ts.map +1 -1
- package/dist/types/available-tools.js +2 -0
- package/dist/types/available-tools.js.map +1 -1
- package/dist/types/base-bubble-class.d.ts +5 -0
- package/dist/types/base-bubble-class.d.ts.map +1 -1
- package/dist/types/base-bubble-class.js +18 -3
- package/dist/types/base-bubble-class.js.map +1 -1
- package/dist/types/bubble.d.ts +2 -3
- package/dist/types/bubble.d.ts.map +1 -1
- package/dist/types/service-bubble-class.d.ts +4 -4
- package/dist/types/service-bubble-class.d.ts.map +1 -1
- package/dist/types/service-bubble-class.js +6 -7
- package/dist/types/service-bubble-class.js.map +1 -1
- package/dist/types/tool-bubble-class.d.ts.map +1 -1
- package/dist/types/tool-bubble-class.js +9 -1
- package/dist/types/tool-bubble-class.js.map +1 -1
- package/dist/utils/agent-formatter.d.ts +17 -0
- package/dist/utils/agent-formatter.d.ts.map +1 -0
- package/dist/utils/agent-formatter.js +139 -0
- package/dist/utils/agent-formatter.js.map +1 -0
- package/dist/utils/json-parsing.d.ts +1 -0
- package/dist/utils/json-parsing.d.ts.map +1 -1
- package/dist/utils/json-parsing.js +205 -32
- package/dist/utils/json-parsing.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ToolBubble } from '../../types/tool-bubble-class.js';
|
|
3
|
+
import { CredentialType } from '@bubblelab/shared-schemas';
|
|
4
|
+
import { ApifyBubble } from '../service-bubble/apify/apify.js';
|
|
5
|
+
// Unified Instagram data types (service-agnostic)
|
|
6
|
+
const InstagramPostSchema = z.object({
|
|
7
|
+
url: z.string().nullable().describe('Post URL'),
|
|
8
|
+
caption: z.string().nullable().describe('Post caption text'),
|
|
9
|
+
likesCount: z.number().nullable().describe('Number of likes'),
|
|
10
|
+
commentsCount: z.number().nullable().describe('Number of comments'),
|
|
11
|
+
ownerUsername: z.string().nullable().describe('Post owner username'),
|
|
12
|
+
timestamp: z.string().nullable().describe('Post timestamp (ISO format)'),
|
|
13
|
+
type: z
|
|
14
|
+
.enum(['image', 'video', 'carousel'])
|
|
15
|
+
.nullable()
|
|
16
|
+
.describe('Post media type'),
|
|
17
|
+
displayUrl: z.string().nullable().describe('Main display image URL'),
|
|
18
|
+
hashtags: z.array(z.string()).nullable().describe('Hashtags in the post'),
|
|
19
|
+
});
|
|
20
|
+
const InstagramProfileSchema = z.object({
|
|
21
|
+
username: z.string().describe('Instagram username'),
|
|
22
|
+
fullName: z.string().nullable().describe('Full name'),
|
|
23
|
+
bio: z.string().nullable().describe('Profile bio'),
|
|
24
|
+
followersCount: z.number().nullable().describe('Number of followers'),
|
|
25
|
+
followingCount: z.number().nullable().describe('Number of following'),
|
|
26
|
+
postsCount: z.number().nullable().describe('Total posts'),
|
|
27
|
+
isVerified: z.boolean().nullable().describe('Verification status'),
|
|
28
|
+
profilePicUrl: z.string().nullable().describe('Profile picture URL'),
|
|
29
|
+
});
|
|
30
|
+
// Gemini-compatible single object schema with optional fields
|
|
31
|
+
const InstagramToolParamsSchema = z.object({
|
|
32
|
+
operation: z
|
|
33
|
+
.enum(['scrapeProfile', 'scrapeHashtag'])
|
|
34
|
+
.describe('Operation to perform: scrapeProfile for user profiles, scrapeHashtag for hashtag posts'),
|
|
35
|
+
// Profile scraping fields (optional)
|
|
36
|
+
profiles: z
|
|
37
|
+
.array(z.string())
|
|
38
|
+
.optional()
|
|
39
|
+
.describe('Instagram usernames or profile URLs to scrape (for scrapeProfile operation). Examples: ["@username", "https://www.instagram.com/username/"]'),
|
|
40
|
+
// Hashtag scraping fields (optional)
|
|
41
|
+
hashtags: z
|
|
42
|
+
.array(z.string())
|
|
43
|
+
.optional()
|
|
44
|
+
.describe('Hashtags to scrape (for scrapeHashtag operation). Examples: ["ai", "tech"] or ["https://www.instagram.com/explore/tags/ai"]'),
|
|
45
|
+
// Common fields
|
|
46
|
+
limit: z
|
|
47
|
+
.number()
|
|
48
|
+
.min(1)
|
|
49
|
+
.max(1000)
|
|
50
|
+
.default(20)
|
|
51
|
+
.optional()
|
|
52
|
+
.describe('Maximum number of posts to fetch (default: 20 for profiles, 50 for hashtags)'),
|
|
53
|
+
credentials: z
|
|
54
|
+
.record(z.nativeEnum(CredentialType), z.string())
|
|
55
|
+
.optional()
|
|
56
|
+
.describe('Required credentials (auto-injected)'),
|
|
57
|
+
});
|
|
58
|
+
// Gemini-compatible single result schema
|
|
59
|
+
const InstagramToolResultSchema = z.object({
|
|
60
|
+
operation: z
|
|
61
|
+
.enum(['scrapeProfile', 'scrapeHashtag'])
|
|
62
|
+
.describe('Operation that was performed'),
|
|
63
|
+
// Posts data (always present)
|
|
64
|
+
posts: z
|
|
65
|
+
.array(InstagramPostSchema)
|
|
66
|
+
.describe('Array of Instagram posts scraped'),
|
|
67
|
+
// Profile data (only for scrapeProfile operation)
|
|
68
|
+
profiles: z
|
|
69
|
+
.array(InstagramProfileSchema)
|
|
70
|
+
.optional()
|
|
71
|
+
.describe('Profile information for each scraped profile (only for scrapeProfile operation)'),
|
|
72
|
+
// Hashtag data (only for scrapeHashtag operation)
|
|
73
|
+
scrapedHashtags: z
|
|
74
|
+
.array(z.string())
|
|
75
|
+
.optional()
|
|
76
|
+
.describe('List of hashtags that were scraped (only for scrapeHashtag operation)'),
|
|
77
|
+
// Profile data (only for scrapeProfile operation)
|
|
78
|
+
scrapedProfiles: z
|
|
79
|
+
.array(z.string())
|
|
80
|
+
.optional()
|
|
81
|
+
.describe('List of profile usernames that were scraped (only for scrapeProfile operation)'),
|
|
82
|
+
// Common fields
|
|
83
|
+
totalPosts: z.number().describe('Total number of posts scraped'),
|
|
84
|
+
success: z.boolean().describe('Whether the operation was successful'),
|
|
85
|
+
error: z.string().describe('Error message if operation failed'),
|
|
86
|
+
});
|
|
87
|
+
/**
|
|
88
|
+
* Generic Instagram scraping tool with unified interface
|
|
89
|
+
*
|
|
90
|
+
* This tool abstracts away the underlying scraping service (currently Apify)
|
|
91
|
+
* and provides a simple, opinionated interface for Instagram data extraction.
|
|
92
|
+
*
|
|
93
|
+
* Supports two operations:
|
|
94
|
+
* - scrapeProfile: Scrape user profiles and their posts
|
|
95
|
+
* - scrapeHashtag: Scrape posts by hashtag
|
|
96
|
+
*
|
|
97
|
+
* Future versions can add support for other services (BrightData, custom scrapers)
|
|
98
|
+
* while maintaining the same interface.
|
|
99
|
+
*/
|
|
100
|
+
export class InstagramTool extends ToolBubble {
|
|
101
|
+
// Required static metadata
|
|
102
|
+
static bubbleName = 'instagram-tool';
|
|
103
|
+
static schema = InstagramToolParamsSchema;
|
|
104
|
+
static resultSchema = InstagramToolResultSchema;
|
|
105
|
+
static shortDescription = 'Scrape Instagram profiles and posts with a simple, unified interface. Works with individual user profiles and hashtags.';
|
|
106
|
+
static longDescription = `
|
|
107
|
+
Universal Instagram scraping tool that provides a simple, opinionated interface for extracting Instagram data.
|
|
108
|
+
|
|
109
|
+
**OPERATIONS:**
|
|
110
|
+
1. **scrapeProfile**: Scrape user profiles and their posts
|
|
111
|
+
- Get profile information (bio, followers, verified status)
|
|
112
|
+
- Fetch recent posts from specific users
|
|
113
|
+
- Track influencer or brand accounts
|
|
114
|
+
|
|
115
|
+
2. **scrapeHashtag**: Scrape posts by hashtag
|
|
116
|
+
- Find trending content by hashtag
|
|
117
|
+
- Monitor brand mentions and campaigns
|
|
118
|
+
- Research hashtag performance
|
|
119
|
+
|
|
120
|
+
**WHEN TO USE THIS TOOL:**
|
|
121
|
+
- **Any Instagram scraping task** - profiles, posts, hashtags, engagement data
|
|
122
|
+
- **Social media research** - influencer analysis, competitor monitoring
|
|
123
|
+
- **Content gathering** - posts, captions, hashtags, engagement metrics
|
|
124
|
+
- **Market research** - brand mentions, user sentiment on Instagram
|
|
125
|
+
- **Trend analysis** - hashtag tracking, viral content discovery
|
|
126
|
+
|
|
127
|
+
**DO NOT USE research-agent-tool or web-scrape-tool for Instagram** - This tool is specifically optimized for Instagram and provides:
|
|
128
|
+
- Unified data format across all Instagram sources
|
|
129
|
+
- Automatic service selection and optimization
|
|
130
|
+
- Rate limiting and reliability handling
|
|
131
|
+
- Clean, structured data ready for analysis
|
|
132
|
+
|
|
133
|
+
**Simple Interface:**
|
|
134
|
+
Just specify the operation and provide Instagram usernames/URLs or hashtags to get back clean, structured data.
|
|
135
|
+
The tool automatically handles:
|
|
136
|
+
- URL normalization (accepts usernames, profile URLs, hashtag URLs)
|
|
137
|
+
- Service selection (currently Apify, future: multiple sources)
|
|
138
|
+
- Data transformation to unified format
|
|
139
|
+
- Error handling and retries
|
|
140
|
+
|
|
141
|
+
**What you get:**
|
|
142
|
+
- Posts with captions, likes, comments, timestamps
|
|
143
|
+
- Profile information (for scrapeProfile operation)
|
|
144
|
+
- Hashtags and engagement metrics
|
|
145
|
+
- Owner information
|
|
146
|
+
|
|
147
|
+
**Use cases:**
|
|
148
|
+
- Influencer analysis and discovery
|
|
149
|
+
- Brand monitoring and sentiment analysis
|
|
150
|
+
- Competitor research on Instagram
|
|
151
|
+
- Content strategy and trend analysis
|
|
152
|
+
- Market research through Instagram data
|
|
153
|
+
- Campaign performance tracking
|
|
154
|
+
- Hashtag research and optimization
|
|
155
|
+
|
|
156
|
+
The tool uses best-available services behind the scenes while maintaining a consistent, simple interface.
|
|
157
|
+
`;
|
|
158
|
+
static alias = 'ig';
|
|
159
|
+
static type = 'tool';
|
|
160
|
+
constructor(params = {
|
|
161
|
+
operation: 'scrapeProfile',
|
|
162
|
+
profiles: ['@instagram'],
|
|
163
|
+
limit: 20,
|
|
164
|
+
}, context) {
|
|
165
|
+
super(params, context);
|
|
166
|
+
}
|
|
167
|
+
async performAction() {
|
|
168
|
+
const credentials = this.params?.credentials;
|
|
169
|
+
if (!credentials || !credentials[CredentialType.APIFY_CRED]) {
|
|
170
|
+
return this.createErrorResult('Instagram scraping requires authentication. Please configure APIFY_CRED.');
|
|
171
|
+
}
|
|
172
|
+
try {
|
|
173
|
+
const { operation } = this.params;
|
|
174
|
+
// Validate required fields based on operation
|
|
175
|
+
if (operation === 'scrapeProfile' &&
|
|
176
|
+
(!this.params.profiles || this.params.profiles.length === 0)) {
|
|
177
|
+
return this.createErrorResult('Profiles array is required for scrapeProfile operation');
|
|
178
|
+
}
|
|
179
|
+
if (operation === 'scrapeHashtag' &&
|
|
180
|
+
(!this.params.hashtags || this.params.hashtags.length === 0)) {
|
|
181
|
+
return this.createErrorResult('Hashtags array is required for scrapeHashtag operation');
|
|
182
|
+
}
|
|
183
|
+
const result = await (async () => {
|
|
184
|
+
switch (operation) {
|
|
185
|
+
case 'scrapeProfile':
|
|
186
|
+
return await this.handleScrapeProfile(this.params);
|
|
187
|
+
case 'scrapeHashtag':
|
|
188
|
+
return await this.handleScrapeHashtag(this.params);
|
|
189
|
+
default:
|
|
190
|
+
throw new Error(`Unsupported operation: ${operation}`);
|
|
191
|
+
}
|
|
192
|
+
})();
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
return this.createErrorResult(error instanceof Error ? error.message : 'Unknown error occurred');
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Create an error result
|
|
201
|
+
*/
|
|
202
|
+
createErrorResult(errorMessage) {
|
|
203
|
+
const { operation } = this.params;
|
|
204
|
+
return {
|
|
205
|
+
operation: operation || 'scrapeProfile',
|
|
206
|
+
posts: [],
|
|
207
|
+
profiles: operation === 'scrapeProfile' ? [] : undefined,
|
|
208
|
+
scrapedProfiles: operation === 'scrapeProfile' ? [] : undefined,
|
|
209
|
+
scrapedHashtags: operation === 'scrapeHashtag' ? [] : undefined,
|
|
210
|
+
totalPosts: 0,
|
|
211
|
+
success: false,
|
|
212
|
+
error: errorMessage,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Handle scrapeProfile operation
|
|
217
|
+
*/
|
|
218
|
+
async handleScrapeProfile(params) {
|
|
219
|
+
// Normalize profile inputs to URLs
|
|
220
|
+
const instagramUrls = this.normalizeProfiles(params.profiles);
|
|
221
|
+
// Use Apify service to scrape profiles
|
|
222
|
+
const result = await this.scrapeWithApifyProfiles(instagramUrls, params.limit || 20);
|
|
223
|
+
return {
|
|
224
|
+
operation: 'scrapeProfile',
|
|
225
|
+
posts: result.posts,
|
|
226
|
+
profiles: result.profiles,
|
|
227
|
+
scrapedProfiles: result.scrapedProfiles,
|
|
228
|
+
totalPosts: result.totalPosts,
|
|
229
|
+
success: result.success,
|
|
230
|
+
error: result.error,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Handle scrapeHashtag operation
|
|
235
|
+
*/
|
|
236
|
+
async handleScrapeHashtag(params) {
|
|
237
|
+
// Use Apify service to scrape hashtags
|
|
238
|
+
const result = await this.scrapeWithApifyHashtags(params.hashtags, params.limit || 50, params.credentials);
|
|
239
|
+
return {
|
|
240
|
+
operation: 'scrapeHashtag',
|
|
241
|
+
posts: result.posts,
|
|
242
|
+
scrapedHashtags: result.scrapedHashtags,
|
|
243
|
+
totalPosts: result.totalPosts,
|
|
244
|
+
success: result.success,
|
|
245
|
+
error: result.error,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Scrape hashtags using Apify service
|
|
250
|
+
* This is the current implementation - future versions could add other services
|
|
251
|
+
*/
|
|
252
|
+
async scrapeWithApifyHashtags(hashtags, limit, credentials) {
|
|
253
|
+
// Normalize hashtags for Apify (remove # symbol and clean format)
|
|
254
|
+
const normalizedHashtags = this.normalizeHashtags(hashtags);
|
|
255
|
+
const scrape_hashtag_apify = new ApifyBubble({
|
|
256
|
+
actorId: 'apify/instagram-hashtag-scraper',
|
|
257
|
+
input: {
|
|
258
|
+
hashtags: normalizedHashtags,
|
|
259
|
+
resultsLimit: limit,
|
|
260
|
+
},
|
|
261
|
+
waitForFinish: true,
|
|
262
|
+
timeout: 180000, // 3 minutes
|
|
263
|
+
credentials,
|
|
264
|
+
}, this.context);
|
|
265
|
+
const apifyResult = await scrape_hashtag_apify.action();
|
|
266
|
+
if (!apifyResult.data.success) {
|
|
267
|
+
return {
|
|
268
|
+
posts: [],
|
|
269
|
+
totalPosts: 0,
|
|
270
|
+
scrapedHashtags: hashtags,
|
|
271
|
+
success: false,
|
|
272
|
+
error: apifyResult.data.error ||
|
|
273
|
+
'Failed to scrape Instagram hashtags. Please try again.',
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
const items = apifyResult.data.items || [];
|
|
277
|
+
// Transform hashtag scraper results to unified post format
|
|
278
|
+
const posts = this.extractHashtagPosts(items);
|
|
279
|
+
return {
|
|
280
|
+
posts,
|
|
281
|
+
totalPosts: posts.length,
|
|
282
|
+
scrapedHashtags: hashtags,
|
|
283
|
+
success: true,
|
|
284
|
+
error: '',
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Normalize various profile inputs to Instagram URLs
|
|
289
|
+
* Accepts: @username, username, https://instagram.com/username/
|
|
290
|
+
*/
|
|
291
|
+
normalizeProfiles(profiles) {
|
|
292
|
+
return profiles.map((profile) => {
|
|
293
|
+
// Already a full URL
|
|
294
|
+
if (profile.startsWith('https://www.instagram.com/')) {
|
|
295
|
+
return profile;
|
|
296
|
+
}
|
|
297
|
+
// Remove @ if present
|
|
298
|
+
const cleanUsername = profile.startsWith('@')
|
|
299
|
+
? profile.slice(1)
|
|
300
|
+
: profile;
|
|
301
|
+
// Convert to profile URL
|
|
302
|
+
return `https://www.instagram.com/${cleanUsername}/`;
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Normalize hashtags for Apify actor
|
|
307
|
+
* Removes # symbol and cleans format to match Apify requirements
|
|
308
|
+
*/
|
|
309
|
+
normalizeHashtags(hashtags) {
|
|
310
|
+
return hashtags.map((hashtag) => {
|
|
311
|
+
// Remove # symbol if present
|
|
312
|
+
let cleanHashtag = hashtag.startsWith('#') ? hashtag.slice(1) : hashtag;
|
|
313
|
+
// Remove any URL parts if it's a full Instagram hashtag URL
|
|
314
|
+
if (cleanHashtag.includes('instagram.com/explore/tags/')) {
|
|
315
|
+
cleanHashtag = cleanHashtag.split('instagram.com/explore/tags/')[1];
|
|
316
|
+
// Remove any trailing slashes or query parameters
|
|
317
|
+
cleanHashtag = cleanHashtag.split('/')[0].split('?')[0];
|
|
318
|
+
}
|
|
319
|
+
// Clean any remaining special characters that Apify doesn't like
|
|
320
|
+
// Keep only alphanumeric characters and underscores
|
|
321
|
+
cleanHashtag = cleanHashtag.replace(/[^a-zA-Z0-9_]/g, '');
|
|
322
|
+
return cleanHashtag;
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Scrape profiles using Apify service
|
|
327
|
+
* This is the current implementation - future versions could add other services
|
|
328
|
+
* Always fetches both profile details and posts for maximum flexibility
|
|
329
|
+
*/
|
|
330
|
+
async scrapeWithApifyProfiles(urls, limit) {
|
|
331
|
+
// Always use 'details' to get both profile information AND posts
|
|
332
|
+
const scrape_profile_apify = new ApifyBubble({
|
|
333
|
+
actorId: 'apify/instagram-scraper',
|
|
334
|
+
input: {
|
|
335
|
+
directUrls: urls,
|
|
336
|
+
resultsType: 'details', // Always fetch full details (profile + posts)
|
|
337
|
+
resultsLimit: limit,
|
|
338
|
+
},
|
|
339
|
+
waitForFinish: true,
|
|
340
|
+
timeout: 180000, // 3 minutes
|
|
341
|
+
credentials: this.params.credentials,
|
|
342
|
+
}, this.context);
|
|
343
|
+
const apifyResult = await scrape_profile_apify.action();
|
|
344
|
+
if (!apifyResult.data.success) {
|
|
345
|
+
return {
|
|
346
|
+
posts: [],
|
|
347
|
+
profiles: [],
|
|
348
|
+
totalPosts: 0,
|
|
349
|
+
scrapedProfiles: urls.map(this.extractUsername),
|
|
350
|
+
success: false,
|
|
351
|
+
error: apifyResult.data.error ||
|
|
352
|
+
'Failed to scrape Instagram. Please try again.',
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
// Now items is automatically typed as InstagramPost[] - no casting needed!
|
|
356
|
+
const items = apifyResult.data.items || [];
|
|
357
|
+
// Extract posts from the results
|
|
358
|
+
const posts = this.extractPosts(items);
|
|
359
|
+
// Extract profile information from the results
|
|
360
|
+
const profiles = this.extractProfileInfo(items);
|
|
361
|
+
return {
|
|
362
|
+
posts,
|
|
363
|
+
profiles,
|
|
364
|
+
totalPosts: posts.length,
|
|
365
|
+
scrapedProfiles: urls.map(this.extractUsername),
|
|
366
|
+
success: true,
|
|
367
|
+
error: '',
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Extract username from Instagram URL
|
|
372
|
+
*/
|
|
373
|
+
extractUsername(url) {
|
|
374
|
+
const match = url.match(/instagram\.com\/([^/?]+)/);
|
|
375
|
+
return match ? match[1] : url;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Normalize post type to standard enum
|
|
379
|
+
*/
|
|
380
|
+
normalizePostType(type) {
|
|
381
|
+
if (!type)
|
|
382
|
+
return null;
|
|
383
|
+
const normalized = type.toLowerCase();
|
|
384
|
+
if (normalized === 'image' || normalized === 'photo')
|
|
385
|
+
return 'image';
|
|
386
|
+
if (normalized === 'video')
|
|
387
|
+
return 'video';
|
|
388
|
+
if (normalized === 'carousel' || normalized === 'sidecar')
|
|
389
|
+
return 'carousel';
|
|
390
|
+
return null;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Extract posts from Apify results
|
|
394
|
+
* Handles both 'details' and 'posts' resultsType formats
|
|
395
|
+
*/
|
|
396
|
+
extractPosts(items) {
|
|
397
|
+
const posts = [];
|
|
398
|
+
for (const item of items) {
|
|
399
|
+
if (typeof item !== 'object' || item === null)
|
|
400
|
+
continue;
|
|
401
|
+
const anyItem = item;
|
|
402
|
+
// Check if this item has posts nested (details format)
|
|
403
|
+
if (anyItem.latestPosts && Array.isArray(anyItem.latestPosts)) {
|
|
404
|
+
// Format from 'details' resultsType - posts are nested
|
|
405
|
+
for (const post of anyItem.latestPosts) {
|
|
406
|
+
posts.push({
|
|
407
|
+
url: post.url || null,
|
|
408
|
+
caption: post.caption || null,
|
|
409
|
+
likesCount: post.likesCount || null,
|
|
410
|
+
commentsCount: post.commentsCount || null,
|
|
411
|
+
ownerUsername: anyItem.username || post.ownerUsername || null,
|
|
412
|
+
timestamp: post.timestamp || null,
|
|
413
|
+
type: this.normalizePostType(post.type),
|
|
414
|
+
displayUrl: post.displayUrl || null,
|
|
415
|
+
hashtags: post.hashtags || null,
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
return posts;
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Extract profile information from Apify results
|
|
424
|
+
* Handles the 'details' resultsType format
|
|
425
|
+
*/
|
|
426
|
+
extractProfileInfo(items) {
|
|
427
|
+
const profiles = [];
|
|
428
|
+
for (const item of items) {
|
|
429
|
+
if (typeof item !== 'object' || item === null)
|
|
430
|
+
continue;
|
|
431
|
+
const anyItem = item;
|
|
432
|
+
// Check if this item has profile-level information (details format)
|
|
433
|
+
if (anyItem.username) {
|
|
434
|
+
profiles.push({
|
|
435
|
+
username: anyItem.username || '',
|
|
436
|
+
fullName: anyItem.fullName || '',
|
|
437
|
+
bio: anyItem.biography || '',
|
|
438
|
+
followersCount: anyItem.followersCount || 0,
|
|
439
|
+
followingCount: anyItem.followsCount || 0,
|
|
440
|
+
postsCount: anyItem.postsCount || null,
|
|
441
|
+
isVerified: anyItem.verified || false,
|
|
442
|
+
profilePicUrl: anyItem.profilePicUrl || '',
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
return profiles;
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Extract posts from hashtag scraper results
|
|
450
|
+
* Hashtag scraper returns posts directly (not nested)
|
|
451
|
+
*/
|
|
452
|
+
extractHashtagPosts(items) {
|
|
453
|
+
const posts = [];
|
|
454
|
+
for (const item of items) {
|
|
455
|
+
if (typeof item !== 'object' || item === null)
|
|
456
|
+
continue;
|
|
457
|
+
const anyItem = item;
|
|
458
|
+
// Hashtag scraper returns posts directly at the top level
|
|
459
|
+
posts.push({
|
|
460
|
+
url: anyItem.url || null,
|
|
461
|
+
caption: anyItem.caption || null,
|
|
462
|
+
likesCount: anyItem.likesCount || null,
|
|
463
|
+
commentsCount: anyItem.commentsCount || null,
|
|
464
|
+
ownerUsername: anyItem.ownerUsername || null,
|
|
465
|
+
timestamp: anyItem.timestamp || null,
|
|
466
|
+
type: this.normalizePostType(anyItem.type),
|
|
467
|
+
displayUrl: anyItem.displayUrl || null,
|
|
468
|
+
hashtags: anyItem.hashtags || null,
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
return posts;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
//# sourceMappingURL=instagram-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instagram-tool.js","sourceRoot":"","sources":["../../../src/bubbles/tool-bubble/instagram-tool.ts"],"names":[],"mappings":"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"}
|