instasave-sdk 1.0.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/LICENSE +21 -0
- package/README.md +153 -0
- package/dist/auth-fast.d.ts +32 -0
- package/dist/auth-fast.d.ts.map +1 -0
- package/dist/auth-fast.js +505 -0
- package/dist/auth-fast.js.map +1 -0
- package/dist/auth.d.ts +80 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +370 -0
- package/dist/auth.js.map +1 -0
- package/dist/benchmark.d.ts +48 -0
- package/dist/benchmark.d.ts.map +1 -0
- package/dist/benchmark.js +125 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/health.d.ts +28 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +108 -0
- package/dist/health.js.map +1 -0
- package/dist/index.d.ts +101 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +492 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +22 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +151 -0
- package/dist/logger.js.map +1 -0
- package/dist/memory.d.ts +56 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +144 -0
- package/dist/memory.js.map +1 -0
- package/dist/metrics.d.ts +19 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +79 -0
- package/dist/metrics.js.map +1 -0
- package/dist/parallel.d.ts +59 -0
- package/dist/parallel.d.ts.map +1 -0
- package/dist/parallel.js +202 -0
- package/dist/parallel.js.map +1 -0
- package/dist/platforms/index.d.ts +7 -0
- package/dist/platforms/index.d.ts.map +1 -0
- package/dist/platforms/index.js +13 -0
- package/dist/platforms/index.js.map +1 -0
- package/dist/platforms/instagram.d.ts +6 -0
- package/dist/platforms/instagram.d.ts.map +1 -0
- package/dist/platforms/instagram.js +189 -0
- package/dist/platforms/instagram.js.map +1 -0
- package/dist/plugins.d.ts +128 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +107 -0
- package/dist/plugins.js.map +1 -0
- package/dist/test-integration.d.ts +2 -0
- package/dist/test-integration.d.ts.map +1 -0
- package/dist/test-integration.js +46 -0
- package/dist/test-integration.js.map +1 -0
- package/dist/types.d.ts +75 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/worker.d.ts +2 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +23 -0
- package/dist/worker.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FastAuthManager = void 0;
|
|
4
|
+
const logger_1 = require("./logger");
|
|
5
|
+
class FastAuthManager {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.authenticated = false;
|
|
8
|
+
this.username = null;
|
|
9
|
+
this.displayName = null;
|
|
10
|
+
this.sessionPath = './storage/instagram-session.json';
|
|
11
|
+
this.loadSession();
|
|
12
|
+
}
|
|
13
|
+
sleep(ms) {
|
|
14
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
15
|
+
}
|
|
16
|
+
async loadSession() {
|
|
17
|
+
try {
|
|
18
|
+
const fs = require('fs');
|
|
19
|
+
if (fs.existsSync(this.sessionPath)) {
|
|
20
|
+
const sessionData = JSON.parse(fs.readFileSync(this.sessionPath, 'utf8'));
|
|
21
|
+
this.authenticated = sessionData.authenticated || false;
|
|
22
|
+
this.username = sessionData.username || null;
|
|
23
|
+
this.displayName = sessionData.displayName || null;
|
|
24
|
+
logger_1.log.info('🔐 Loaded session:', { username: this.username, authenticated: this.authenticated });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
logger_1.log.info('🔐 No existing session found');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async saveSession(cookies) {
|
|
32
|
+
try {
|
|
33
|
+
const fs = require('fs');
|
|
34
|
+
const path = require('path');
|
|
35
|
+
// Ensure storage directory exists
|
|
36
|
+
const dir = path.dirname(this.sessionPath);
|
|
37
|
+
if (!fs.existsSync(dir)) {
|
|
38
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
39
|
+
}
|
|
40
|
+
const sessionData = {
|
|
41
|
+
authenticated: this.authenticated,
|
|
42
|
+
username: this.username,
|
|
43
|
+
displayName: this.displayName,
|
|
44
|
+
cookies: cookies || [],
|
|
45
|
+
timestamp: Date.now()
|
|
46
|
+
};
|
|
47
|
+
fs.writeFileSync(this.sessionPath, JSON.stringify(sessionData, null, 2));
|
|
48
|
+
logger_1.log.info('🔐 Session saved with', cookies?.length || 0, 'cookies');
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
logger_1.log.error('🔐 Failed to save session:', error);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async clearSession() {
|
|
55
|
+
try {
|
|
56
|
+
const fs = require('fs');
|
|
57
|
+
if (fs.existsSync(this.sessionPath)) {
|
|
58
|
+
fs.unlinkSync(this.sessionPath);
|
|
59
|
+
logger_1.log.info('🔐 Session cleared');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
logger_1.log.error('🔐 Failed to clear session:', error);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async saveSessionData(cookies) {
|
|
67
|
+
await this.saveSession(cookies);
|
|
68
|
+
}
|
|
69
|
+
async refreshSession(page) {
|
|
70
|
+
try {
|
|
71
|
+
logger_1.log.info('🔐 Refreshing session with fresh cookies...');
|
|
72
|
+
// First, load and apply existing cookies if available
|
|
73
|
+
const fs = require('fs');
|
|
74
|
+
if (fs.existsSync(this.sessionPath)) {
|
|
75
|
+
const existingSession = JSON.parse(fs.readFileSync(this.sessionPath, 'utf8'));
|
|
76
|
+
if (existingSession.cookies && Array.isArray(existingSession.cookies)) {
|
|
77
|
+
logger_1.log.info('🔐 Applying existing', existingSession.cookies.length, 'cookies first...');
|
|
78
|
+
await page.setCookie(...existingSession.cookies);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Navigate to Instagram to refresh cookies
|
|
82
|
+
await page.goto('https://www.instagram.com/', { waitUntil: 'networkidle0' });
|
|
83
|
+
await page.waitForTimeout(3000);
|
|
84
|
+
// Get fresh cookies
|
|
85
|
+
const cookies = await page.cookies();
|
|
86
|
+
// Check if still logged in
|
|
87
|
+
const isLoggedIn = await page.evaluate(() => {
|
|
88
|
+
return !document.querySelector('input[name="username"]');
|
|
89
|
+
});
|
|
90
|
+
if (isLoggedIn && cookies.length > 0) {
|
|
91
|
+
await this.saveSession(cookies);
|
|
92
|
+
logger_1.log.info('✅ Session refreshed with', cookies.length, 'cookies');
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
logger_1.log.info('❌ Session refresh failed - not logged in');
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
logger_1.log.error('❌ Session refresh error:', error.message);
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
isAuthenticated() {
|
|
104
|
+
return this.authenticated;
|
|
105
|
+
}
|
|
106
|
+
getUsername() {
|
|
107
|
+
return this.username;
|
|
108
|
+
}
|
|
109
|
+
getDisplayName() {
|
|
110
|
+
return this.displayName;
|
|
111
|
+
}
|
|
112
|
+
async logout() {
|
|
113
|
+
this.authenticated = false;
|
|
114
|
+
this.username = null;
|
|
115
|
+
this.displayName = null;
|
|
116
|
+
await this.clearSession();
|
|
117
|
+
}
|
|
118
|
+
async refreshUserInfo(page) {
|
|
119
|
+
try {
|
|
120
|
+
logger_1.log.info('🔐 Refreshing user info...');
|
|
121
|
+
// Navigate to profile page
|
|
122
|
+
await page.goto(`https://www.instagram.com/${this.username}/`, {
|
|
123
|
+
waitUntil: 'domcontentloaded',
|
|
124
|
+
timeout: 10000
|
|
125
|
+
});
|
|
126
|
+
await this.sleep(2000);
|
|
127
|
+
const profileInfo = await page.evaluate(() => {
|
|
128
|
+
// Debug: log current URL and page content
|
|
129
|
+
logger_1.log.info('Current URL:', window.location.href);
|
|
130
|
+
// Get first 1000 characters of page text for debugging
|
|
131
|
+
const pageText = document.body.innerText.substring(0, 1000);
|
|
132
|
+
logger_1.log.info('Page content preview:', pageText);
|
|
133
|
+
// Look for the profile bio section structure
|
|
134
|
+
// The display name should be right after the username in the profile header
|
|
135
|
+
// Method 1: Look for h2 element (usually contains display name)
|
|
136
|
+
const h2Elements = document.querySelectorAll('h2');
|
|
137
|
+
for (const h2 of h2Elements) {
|
|
138
|
+
const text = h2.textContent?.trim();
|
|
139
|
+
logger_1.log.info('Found H2:', text);
|
|
140
|
+
if (text && text.length > 0 && text.length < 50 &&
|
|
141
|
+
!text.includes('posts') && !text.includes('followers') &&
|
|
142
|
+
!text.includes('following') && !text.includes('@') &&
|
|
143
|
+
!text.includes('Instagram') && !text.includes('Edit profile')) {
|
|
144
|
+
logger_1.log.info('Selected H2 as display name:', text);
|
|
145
|
+
return text;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Method 2: Look in the profile header section
|
|
149
|
+
const profileHeaders = document.querySelectorAll('header section');
|
|
150
|
+
for (const section of profileHeaders) {
|
|
151
|
+
const spans = section.querySelectorAll('span[dir="auto"]');
|
|
152
|
+
for (const span of spans) {
|
|
153
|
+
const text = span.textContent?.trim();
|
|
154
|
+
logger_1.log.info('Found span in header:', text);
|
|
155
|
+
if (text && text.length > 0 && text.length < 50 &&
|
|
156
|
+
!text.includes('posts') && !text.includes('followers') &&
|
|
157
|
+
!text.includes('following') && !text.includes('@') &&
|
|
158
|
+
!text.includes('Instagram') && !text.includes('Edit profile') &&
|
|
159
|
+
!text.includes('Share profile') && !text.includes('Message')) {
|
|
160
|
+
logger_1.log.info('Selected header span as display name:', text);
|
|
161
|
+
return text;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Method 3: Look for display name in the specific bio structure
|
|
166
|
+
const allText = document.body.innerText;
|
|
167
|
+
const lines = allText.split('\n').map(line => line.trim()).filter(Boolean);
|
|
168
|
+
logger_1.log.info('First 10 lines of page:', lines.slice(0, 10));
|
|
169
|
+
// Find username line and get the next meaningful line
|
|
170
|
+
for (let i = 0; i < lines.length - 1; i++) {
|
|
171
|
+
const currentLine = lines[i];
|
|
172
|
+
const nextLine = lines[i + 1];
|
|
173
|
+
// If current line looks like username and next line is display name
|
|
174
|
+
if (currentLine.match(/^[a-zA-Z0-9._]+$/) &&
|
|
175
|
+
nextLine && nextLine.length > 0 && nextLine.length < 50 &&
|
|
176
|
+
!nextLine.includes('posts') && !nextLine.includes('followers') &&
|
|
177
|
+
!nextLine.includes('following') && !nextLine.includes('Instagram')) {
|
|
178
|
+
logger_1.log.info('Found username line:', currentLine, 'next line:', nextLine);
|
|
179
|
+
return nextLine;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
logger_1.log.info('No display name found');
|
|
183
|
+
return null;
|
|
184
|
+
});
|
|
185
|
+
if (profileInfo) {
|
|
186
|
+
this.displayName = profileInfo;
|
|
187
|
+
logger_1.log.info('🔐 Updated display name:', this.displayName);
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
username: this.username,
|
|
191
|
+
displayName: this.displayName
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
logger_1.log.error('🔐 Failed to refresh user info:', error.message);
|
|
196
|
+
return {
|
|
197
|
+
username: this.username,
|
|
198
|
+
displayName: this.displayName
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
async applyCookies(page) {
|
|
203
|
+
try {
|
|
204
|
+
const fs = require('fs');
|
|
205
|
+
if (!fs.existsSync(this.sessionPath)) {
|
|
206
|
+
logger_1.log.info('🔐 No session file available');
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const sessionData = JSON.parse(fs.readFileSync(this.sessionPath, 'utf8'));
|
|
210
|
+
if (!sessionData.cookies || !Array.isArray(sessionData.cookies)) {
|
|
211
|
+
logger_1.log.info('🔐 No cookies in session data');
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
// Clear only page cache, keep cookies
|
|
215
|
+
logger_1.log.info('🔐 Clearing page cache only...');
|
|
216
|
+
const client = await page.target().createCDPSession();
|
|
217
|
+
await client.send('Network.clearBrowserCache');
|
|
218
|
+
// Apply session cookies
|
|
219
|
+
logger_1.log.info('🔐 Applying session cookies...');
|
|
220
|
+
await page.setCookie(...sessionData.cookies);
|
|
221
|
+
logger_1.log.info('✅ Session applied with cleared cache');
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
logger_1.log.info('❌ Failed to apply session:', error.message);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
async login(page, credentials) {
|
|
228
|
+
try {
|
|
229
|
+
logger_1.log.info('🔐 Fast login starting...');
|
|
230
|
+
// Navigate quickly
|
|
231
|
+
await page.goto('https://www.instagram.com/accounts/login/', {
|
|
232
|
+
waitUntil: 'domcontentloaded',
|
|
233
|
+
timeout: 10000
|
|
234
|
+
});
|
|
235
|
+
// Accept cookies quickly
|
|
236
|
+
await page.evaluate(() => {
|
|
237
|
+
const buttons = Array.from(document.querySelectorAll('button, [role="button"]'));
|
|
238
|
+
const cookieBtn = buttons.find(btn => btn.textContent?.toLowerCase().includes('allow') ||
|
|
239
|
+
btn.textContent?.toLowerCase().includes('accept'));
|
|
240
|
+
if (cookieBtn)
|
|
241
|
+
cookieBtn.click();
|
|
242
|
+
});
|
|
243
|
+
await this.sleep(500);
|
|
244
|
+
// Fill form quickly but more human-like
|
|
245
|
+
await page.waitForSelector('input[type="text"]', { timeout: 3000 });
|
|
246
|
+
await page.click('input[type="text"]');
|
|
247
|
+
// Clear field first, then type
|
|
248
|
+
await page.keyboard.down('Control');
|
|
249
|
+
await page.keyboard.press('a');
|
|
250
|
+
await page.keyboard.up('Control');
|
|
251
|
+
await page.type('input[type="text"]', credentials.username, { delay: 50 });
|
|
252
|
+
await page.waitForSelector('input[type="password"]', { timeout: 3000 });
|
|
253
|
+
await page.click('input[type="password"]');
|
|
254
|
+
// Clear field first, then type
|
|
255
|
+
await page.keyboard.down('Control');
|
|
256
|
+
await page.keyboard.press('a');
|
|
257
|
+
await page.keyboard.up('Control');
|
|
258
|
+
await page.type('input[type="password"]', credentials.password, { delay: 50 });
|
|
259
|
+
await this.sleep(500);
|
|
260
|
+
// Verify fields are filled
|
|
261
|
+
const fieldValues = await page.evaluate(() => {
|
|
262
|
+
const usernameField = document.querySelector('input[type="text"]');
|
|
263
|
+
const passwordField = document.querySelector('input[type="password"]');
|
|
264
|
+
return {
|
|
265
|
+
username: usernameField?.value || '',
|
|
266
|
+
password: passwordField?.value || '',
|
|
267
|
+
usernameLength: usernameField?.value?.length || 0,
|
|
268
|
+
passwordLength: passwordField?.value?.length || 0
|
|
269
|
+
};
|
|
270
|
+
});
|
|
271
|
+
logger_1.log.info('🔐 Field values:', {
|
|
272
|
+
usernameLength: fieldValues.usernameLength,
|
|
273
|
+
passwordLength: fieldValues.passwordLength,
|
|
274
|
+
usernameEmpty: fieldValues.usernameLength === 0,
|
|
275
|
+
passwordEmpty: fieldValues.passwordLength === 0
|
|
276
|
+
});
|
|
277
|
+
if (fieldValues.usernameLength === 0 || fieldValues.passwordLength === 0) {
|
|
278
|
+
throw new Error('Fields not filled properly');
|
|
279
|
+
}
|
|
280
|
+
// Submit by clicking the login button instead of Enter
|
|
281
|
+
logger_1.log.info('🔐 Submitting...');
|
|
282
|
+
// Find and click the actual login button
|
|
283
|
+
const loginClicked = await page.evaluate(() => {
|
|
284
|
+
// Look for the main "Log in" button (not Facebook)
|
|
285
|
+
const buttons = Array.from(document.querySelectorAll('button, [role="button"]'));
|
|
286
|
+
const loginBtn = buttons.find(btn => {
|
|
287
|
+
const text = btn.textContent?.trim() || '';
|
|
288
|
+
return text === 'Log in' && !text.includes('Facebook');
|
|
289
|
+
});
|
|
290
|
+
if (loginBtn && loginBtn instanceof HTMLElement) {
|
|
291
|
+
loginBtn.click();
|
|
292
|
+
return true;
|
|
293
|
+
}
|
|
294
|
+
// Fallback: try submit button
|
|
295
|
+
const submitBtn = document.querySelector('button[type="submit"]');
|
|
296
|
+
if (submitBtn) {
|
|
297
|
+
submitBtn.click();
|
|
298
|
+
return true;
|
|
299
|
+
}
|
|
300
|
+
return false;
|
|
301
|
+
});
|
|
302
|
+
if (!loginClicked) {
|
|
303
|
+
throw new Error('Could not find login button to click');
|
|
304
|
+
}
|
|
305
|
+
logger_1.log.info('🔐 Login button clicked');
|
|
306
|
+
// Wait longer for Instagram to process
|
|
307
|
+
logger_1.log.info('🔐 Waiting for Instagram response...');
|
|
308
|
+
await this.sleep(5000); // Increased from 3s to 5s
|
|
309
|
+
let url = page.url();
|
|
310
|
+
logger_1.log.info('🔐 URL after 5s:', url);
|
|
311
|
+
// If still on login page, wait a bit more
|
|
312
|
+
if (url.includes('/accounts/login/')) {
|
|
313
|
+
logger_1.log.info('🔐 Still on login page, waiting more...');
|
|
314
|
+
await this.sleep(3000);
|
|
315
|
+
url = page.url();
|
|
316
|
+
logger_1.log.info('🔐 URL after 8s total:', url);
|
|
317
|
+
}
|
|
318
|
+
// Take screenshot for debugging
|
|
319
|
+
await page.screenshot({ path: './debug-fast-login.png', fullPage: true });
|
|
320
|
+
logger_1.log.info('🔐 Screenshot saved');
|
|
321
|
+
if (url.includes('facebook.com')) {
|
|
322
|
+
throw new Error('Redirected to Facebook');
|
|
323
|
+
}
|
|
324
|
+
// Check for successful redirect patterns
|
|
325
|
+
if (url.includes('/accounts/onetap/') ||
|
|
326
|
+
url.includes('/challenge/') ||
|
|
327
|
+
url.includes('instagram.com/') && !url.includes('/accounts/login/')) {
|
|
328
|
+
logger_1.log.info('🔐 Login successful - redirected to:', url);
|
|
329
|
+
// Handle "Save your login info?" dialog
|
|
330
|
+
if (url.includes('/accounts/onetap/')) {
|
|
331
|
+
logger_1.log.info('🔐 Handling "Save login info" dialog...');
|
|
332
|
+
try {
|
|
333
|
+
// Look for "Save Info" button and click it
|
|
334
|
+
const saveInfoClicked = await page.evaluate(() => {
|
|
335
|
+
const buttons = Array.from(document.querySelectorAll('button, [role="button"]'));
|
|
336
|
+
const saveBtn = buttons.find(btn => {
|
|
337
|
+
const text = btn.textContent?.toLowerCase() || '';
|
|
338
|
+
return text.includes('save') || text.includes('save info');
|
|
339
|
+
});
|
|
340
|
+
if (saveBtn && saveBtn instanceof HTMLElement) {
|
|
341
|
+
saveBtn.click();
|
|
342
|
+
return true;
|
|
343
|
+
}
|
|
344
|
+
return false;
|
|
345
|
+
});
|
|
346
|
+
if (saveInfoClicked) {
|
|
347
|
+
logger_1.log.info('🔐 Clicked "Save Info" button');
|
|
348
|
+
await this.sleep(2000);
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
logger_1.log.info('🔐 Save Info button not found, continuing...');
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
catch (e) {
|
|
355
|
+
logger_1.log.info('🔐 Error handling Save Info dialog:', e);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// Try to get user info from the page
|
|
359
|
+
try {
|
|
360
|
+
logger_1.log.info('🔐 Getting user info...');
|
|
361
|
+
// Skip homepage, go directly to profile
|
|
362
|
+
logger_1.log.info('🔐 Navigating directly to profile page...');
|
|
363
|
+
await page.goto(`https://www.instagram.com/${credentials.username}/`, {
|
|
364
|
+
waitUntil: 'domcontentloaded',
|
|
365
|
+
timeout: 10000
|
|
366
|
+
});
|
|
367
|
+
await this.sleep(3000);
|
|
368
|
+
const userInfo = await page.evaluate(() => {
|
|
369
|
+
// Look for the logged-in user info in various places
|
|
370
|
+
let username = null;
|
|
371
|
+
let displayName = null;
|
|
372
|
+
// Method 1: Look for profile link in navigation/header
|
|
373
|
+
const profileLinks = document.querySelectorAll('a[href*="/"]');
|
|
374
|
+
for (const link of profileLinks) {
|
|
375
|
+
const href = link.getAttribute('href');
|
|
376
|
+
if (href && href.match(/^\/[a-zA-Z0-9._]+\/$/) &&
|
|
377
|
+
!href.includes('explore') && !href.includes('reels') &&
|
|
378
|
+
!href.includes('direct') && !href.includes('accounts')) {
|
|
379
|
+
username = href.replace(/\//g, '');
|
|
380
|
+
break;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
// Method 2: Look for display name near profile picture or username
|
|
384
|
+
if (username) {
|
|
385
|
+
// Find elements that might contain display name
|
|
386
|
+
const allSpans = document.querySelectorAll('span[dir="auto"]');
|
|
387
|
+
for (const span of allSpans) {
|
|
388
|
+
const text = span.textContent?.trim();
|
|
389
|
+
if (text && text.length > 0 && text.length < 50 &&
|
|
390
|
+
!text.includes('Instagram') && !text.includes('For you') &&
|
|
391
|
+
!text.includes('Following') && !text.includes('Explore') &&
|
|
392
|
+
!text.includes('Reels') && !text.includes('Messages') &&
|
|
393
|
+
text !== username) {
|
|
394
|
+
displayName = text;
|
|
395
|
+
break;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
// Method 3: Try to get from profile page
|
|
400
|
+
if (username && !displayName) {
|
|
401
|
+
// Navigate to profile to get display name
|
|
402
|
+
const profileUrl = `/${username}/`;
|
|
403
|
+
const profileLink = document.querySelector(`a[href="${profileUrl}"]`);
|
|
404
|
+
if (profileLink) {
|
|
405
|
+
// Look for display name near the profile link
|
|
406
|
+
const parent = profileLink.closest('div');
|
|
407
|
+
if (parent) {
|
|
408
|
+
const nameSpan = parent.querySelector('span[dir="auto"]');
|
|
409
|
+
if (nameSpan && nameSpan.textContent !== username) {
|
|
410
|
+
displayName = nameSpan.textContent?.trim();
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return { username, displayName };
|
|
416
|
+
});
|
|
417
|
+
// Store the credentials that were actually used for login
|
|
418
|
+
this.username = credentials.username;
|
|
419
|
+
if (userInfo.displayName && userInfo.displayName !== 'For you') {
|
|
420
|
+
this.displayName = userInfo.displayName;
|
|
421
|
+
logger_1.log.info('🔐 Display name from homepage:', this.displayName);
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
// If we couldn't get display name from homepage, try profile page
|
|
425
|
+
try {
|
|
426
|
+
logger_1.log.info('🔐 Trying to get display name from profile page...');
|
|
427
|
+
await page.goto(`https://www.instagram.com/${credentials.username}/`, {
|
|
428
|
+
waitUntil: 'domcontentloaded',
|
|
429
|
+
timeout: 10000
|
|
430
|
+
});
|
|
431
|
+
await this.sleep(2000);
|
|
432
|
+
const profileInfo = await page.evaluate(() => {
|
|
433
|
+
// Look for display name using the specific class pattern you provided
|
|
434
|
+
const nameSpan = document.querySelector('span.x1lliihq.x1plvlek.xryxfnj.x1n2onr6[dir="auto"]');
|
|
435
|
+
if (nameSpan) {
|
|
436
|
+
return nameSpan.textContent?.trim();
|
|
437
|
+
}
|
|
438
|
+
// Fallback: look for any span with dir="auto" that contains meaningful text
|
|
439
|
+
const allSpans = document.querySelectorAll('span[dir="auto"]');
|
|
440
|
+
for (const span of allSpans) {
|
|
441
|
+
const text = span.textContent?.trim();
|
|
442
|
+
if (text && text.length > 0 && text.length < 50 &&
|
|
443
|
+
!text.includes('posts') && !text.includes('followers') &&
|
|
444
|
+
!text.includes('following') && !text.includes('Instagram') &&
|
|
445
|
+
!text.includes('Edit profile') && !text.includes('Share profile')) {
|
|
446
|
+
return text;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
return null;
|
|
450
|
+
});
|
|
451
|
+
if (profileInfo) {
|
|
452
|
+
this.displayName = profileInfo;
|
|
453
|
+
logger_1.log.info('🔐 Display name from profile:', this.displayName);
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
this.displayName = credentials.username;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
catch (e) {
|
|
460
|
+
logger_1.log.info('🔐 Could not get display name from profile:', e);
|
|
461
|
+
this.displayName = credentials.username;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
logger_1.log.info('🔐 Final user info - Username:', this.username, 'Display:', this.displayName);
|
|
465
|
+
}
|
|
466
|
+
catch (e) {
|
|
467
|
+
logger_1.log.info('🔐 Could not get user info:', e);
|
|
468
|
+
// Fallback to credentials
|
|
469
|
+
this.username = credentials.username;
|
|
470
|
+
this.displayName = credentials.username;
|
|
471
|
+
}
|
|
472
|
+
this.authenticated = true;
|
|
473
|
+
// Save session with cookies
|
|
474
|
+
const cookies = await page.cookies();
|
|
475
|
+
await this.saveSession(cookies);
|
|
476
|
+
return true;
|
|
477
|
+
}
|
|
478
|
+
if (!url.includes('/accounts/login/')) {
|
|
479
|
+
logger_1.log.info('🔐 Login successful!');
|
|
480
|
+
this.authenticated = true;
|
|
481
|
+
return true;
|
|
482
|
+
}
|
|
483
|
+
// Check for specific error messages
|
|
484
|
+
const pageContent = await page.evaluate(() => document.body.innerText);
|
|
485
|
+
logger_1.log.info('🔐 Page content sample:', pageContent.substring(0, 500));
|
|
486
|
+
if (pageContent.includes('incorrect') || pageContent.includes('wrong')) {
|
|
487
|
+
throw new Error('Invalid username or password');
|
|
488
|
+
}
|
|
489
|
+
if (pageContent.includes('suspicious') || pageContent.includes('verify')) {
|
|
490
|
+
throw new Error('Account verification required');
|
|
491
|
+
}
|
|
492
|
+
if (pageContent.includes('try again')) {
|
|
493
|
+
throw new Error('Instagram blocked the login attempt');
|
|
494
|
+
}
|
|
495
|
+
throw new Error('Login failed: Still on login page');
|
|
496
|
+
}
|
|
497
|
+
catch (error) {
|
|
498
|
+
logger_1.log.error('🔐 Fast login failed:', error.message);
|
|
499
|
+
this.authenticated = false;
|
|
500
|
+
return false;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
exports.FastAuthManager = FastAuthManager;
|
|
505
|
+
//# sourceMappingURL=auth-fast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-fast.js","sourceRoot":"","sources":["../src/auth-fast.ts"],"names":[],"mappings":"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"}
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication module for Instagram login and session management
|
|
3
|
+
*/
|
|
4
|
+
import { Page } from 'puppeteer';
|
|
5
|
+
/**
|
|
6
|
+
* Login credentials
|
|
7
|
+
*/
|
|
8
|
+
export interface LoginCredentials {
|
|
9
|
+
username: string;
|
|
10
|
+
password: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Cookie data structure
|
|
14
|
+
*/
|
|
15
|
+
export interface Cookie {
|
|
16
|
+
name: string;
|
|
17
|
+
value: string;
|
|
18
|
+
domain: string;
|
|
19
|
+
path: string;
|
|
20
|
+
expires?: number;
|
|
21
|
+
httpOnly?: boolean;
|
|
22
|
+
secure?: boolean;
|
|
23
|
+
sameSite?: 'Strict' | 'Lax' | 'None';
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Session data with cookies and metadata
|
|
27
|
+
*/
|
|
28
|
+
export interface SessionData {
|
|
29
|
+
cookies: Cookie[];
|
|
30
|
+
expiresAt: number;
|
|
31
|
+
username: string;
|
|
32
|
+
createdAt: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Authentication manager for handling login and session persistence
|
|
36
|
+
*/
|
|
37
|
+
export declare class AuthManager {
|
|
38
|
+
private session;
|
|
39
|
+
private defaultSessionPath;
|
|
40
|
+
/**
|
|
41
|
+
* Login to Instagram with username and password
|
|
42
|
+
* @param page - Puppeteer page instance
|
|
43
|
+
* @param credentials - Login credentials
|
|
44
|
+
* @returns Promise<boolean> - Success status
|
|
45
|
+
*/
|
|
46
|
+
login(page: Page, credentials: LoginCredentials): Promise<boolean>;
|
|
47
|
+
/**
|
|
48
|
+
* Logout and clear session
|
|
49
|
+
*/
|
|
50
|
+
logout(): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Check if user is authenticated
|
|
53
|
+
*/
|
|
54
|
+
isAuthenticated(): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Save session to file
|
|
57
|
+
* @param path - File path (default: ./storage/session.json)
|
|
58
|
+
*/
|
|
59
|
+
saveSession(path?: string): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Load session from file
|
|
62
|
+
* @param path - File path (default: ./storage/session.json)
|
|
63
|
+
* @returns Promise<boolean> - Success status
|
|
64
|
+
*/
|
|
65
|
+
loadSession(path?: string): Promise<boolean>;
|
|
66
|
+
/**
|
|
67
|
+
* Apply cookies to page
|
|
68
|
+
* @param page - Puppeteer page instance
|
|
69
|
+
*/
|
|
70
|
+
applyCookies(page: Page): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Get current session data
|
|
73
|
+
*/
|
|
74
|
+
getSession(): SessionData | null;
|
|
75
|
+
/**
|
|
76
|
+
* Sleep helper
|
|
77
|
+
*/
|
|
78
|
+
private sleep;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,kBAAkB,CAA4B;IAEtD;;;;;OAKG;IACG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IA0SxE;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B;;OAEG;IACH,eAAe,IAAI,OAAO;IAY1B;;;OAGG;IACG,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB/C;;;;OAIG;IACG,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BlD;;;OAGG;IACG,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAc7C;;OAEG;IACH,UAAU,IAAI,WAAW,GAAG,IAAI;IAIhC;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd"}
|