insta-dista-cli 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/README.md +58 -0
- package/dist/auth.d.ts +6 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +155 -0
- package/dist/auth.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +87 -0
- package/dist/config.js.map +1 -0
- package/dist/dm.d.ts +10 -0
- package/dist/dm.d.ts.map +1 -0
- package/dist/dm.js +344 -0
- package/dist/dm.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/package.json +42 -0
package/README.md
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# 📬 insta-cli-dm
|
|
2
|
+
|
|
3
|
+
> Distraction-free Instagram from your terminal. **DMs only** — no reels, no stories, no feed.
|
|
4
|
+
|
|
5
|
+
Built for people who want to stay in touch without falling into the Instagram doom-scroll.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install -g insta-cli-dm
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Log in to your Instagram account
|
|
17
|
+
ig login
|
|
18
|
+
|
|
19
|
+
# View your DM inbox
|
|
20
|
+
ig inbox
|
|
21
|
+
|
|
22
|
+
# Open a chat with someone
|
|
23
|
+
ig chat <username>
|
|
24
|
+
|
|
25
|
+
# Log out
|
|
26
|
+
ig logout
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Commands
|
|
30
|
+
|
|
31
|
+
| Command | Description |
|
|
32
|
+
| ------------------ | ---------------------------------- |
|
|
33
|
+
| `ig login` | Log in (supports 2FA) |
|
|
34
|
+
| `ig logout` | Log out and clear saved session |
|
|
35
|
+
| `ig inbox` | View your recent DM threads |
|
|
36
|
+
| `ig chat <user>` | Open a conversation with `<user>` |
|
|
37
|
+
|
|
38
|
+
### Inside a Chat
|
|
39
|
+
|
|
40
|
+
| Input | Action |
|
|
41
|
+
| ----------- | ------------------------- |
|
|
42
|
+
| any text | Sends the message |
|
|
43
|
+
| `/refresh` | Reload recent messages |
|
|
44
|
+
| `/exit` | Leave the chat |
|
|
45
|
+
|
|
46
|
+
## How It Works
|
|
47
|
+
|
|
48
|
+
- Uses [`instagram-private-api`](https://github.com/dilame/instagram-private-api) to interface with Instagram's mobile API.
|
|
49
|
+
- Your session is saved locally at `~/.instagram-cli/session.json` so you don't have to log in every time.
|
|
50
|
+
- **No feed, no explore, no reels, no stories** — only DM endpoints are used.
|
|
51
|
+
|
|
52
|
+
## ⚠️ Disclaimer
|
|
53
|
+
|
|
54
|
+
This tool uses an unofficial Instagram API. Use at your own risk. Instagram may flag accounts using third-party tools. Consider using a secondary account.
|
|
55
|
+
|
|
56
|
+
## License
|
|
57
|
+
|
|
58
|
+
MIT
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { IgApiClient } from 'instagram-private-api';
|
|
2
|
+
export declare function getClient(): IgApiClient;
|
|
3
|
+
export declare function login(): Promise<IgApiClient>;
|
|
4
|
+
export declare function logout(): Promise<void>;
|
|
5
|
+
export declare function ensureLoggedIn(): Promise<IgApiClient>;
|
|
6
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAOpD,wBAAgB,SAAS,IAAI,WAAW,CAKvC;AAED,wBAAsB,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC,CA4FlD;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAG5C;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAO3D"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.getClient = getClient;
|
|
40
|
+
exports.login = login;
|
|
41
|
+
exports.logout = logout;
|
|
42
|
+
exports.ensureLoggedIn = ensureLoggedIn;
|
|
43
|
+
const instagram_private_api_1 = require("instagram-private-api");
|
|
44
|
+
const inquirer = __importStar(require("inquirer"));
|
|
45
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
46
|
+
const config_1 = require("./config");
|
|
47
|
+
let ig = null;
|
|
48
|
+
function getClient() {
|
|
49
|
+
if (!ig) {
|
|
50
|
+
ig = new instagram_private_api_1.IgApiClient();
|
|
51
|
+
}
|
|
52
|
+
return ig;
|
|
53
|
+
}
|
|
54
|
+
async function login() {
|
|
55
|
+
const client = getClient();
|
|
56
|
+
// Check for saved session first
|
|
57
|
+
const saved = (0, config_1.loadSession)();
|
|
58
|
+
if (saved && saved.cookies && saved.username) {
|
|
59
|
+
console.log(chalk_1.default.cyan(` Restoring session for @${saved.username}...`));
|
|
60
|
+
client.state.generateDevice(saved.username);
|
|
61
|
+
try {
|
|
62
|
+
await client.state.deserialize(saved.cookies);
|
|
63
|
+
// Verify the session is still valid
|
|
64
|
+
await client.account.currentUser();
|
|
65
|
+
console.log(chalk_1.default.green(` ✓ Logged in as @${saved.username}\n`));
|
|
66
|
+
return client;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
console.log(chalk_1.default.yellow(' ⚠ Saved session expired. Please log in again.\n'));
|
|
70
|
+
(0, config_1.clearSession)();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Interactive login
|
|
74
|
+
const answers = await inquirer.prompt([
|
|
75
|
+
{
|
|
76
|
+
type: 'input',
|
|
77
|
+
name: 'username',
|
|
78
|
+
message: chalk_1.default.bold('Instagram username:'),
|
|
79
|
+
validate: (val) => val.length > 0 || 'Username is required',
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
type: 'password',
|
|
83
|
+
name: 'password',
|
|
84
|
+
message: chalk_1.default.bold('Password:'),
|
|
85
|
+
mask: '•',
|
|
86
|
+
validate: (val) => val.length > 0 || 'Password is required',
|
|
87
|
+
},
|
|
88
|
+
]);
|
|
89
|
+
client.state.generateDevice(answers.username);
|
|
90
|
+
try {
|
|
91
|
+
console.log(chalk_1.default.cyan('\n Logging in...'));
|
|
92
|
+
try {
|
|
93
|
+
await client.simulate.preLoginFlow();
|
|
94
|
+
}
|
|
95
|
+
catch { /* non-critical */ }
|
|
96
|
+
const loggedInUser = await client.account.login(answers.username, answers.password);
|
|
97
|
+
// Save session
|
|
98
|
+
const serialized = await client.state.serialize();
|
|
99
|
+
delete serialized.constants; // remove large constants to reduce file size
|
|
100
|
+
(0, config_1.saveSession)({ username: answers.username, cookies: serialized, userId: loggedInUser.pk });
|
|
101
|
+
(0, config_1.saveConfig)({ username: answers.username, userId: loggedInUser.pk });
|
|
102
|
+
console.log(chalk_1.default.green(` ✓ Successfully logged in as @${answers.username}\n`));
|
|
103
|
+
// Simulate post-login (non-critical, may fail on newer IG API versions)
|
|
104
|
+
try {
|
|
105
|
+
await client.simulate.postLoginFlow();
|
|
106
|
+
}
|
|
107
|
+
catch { /* non-critical */ }
|
|
108
|
+
return client;
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
if (err.name === 'IgCheckpointError') {
|
|
112
|
+
// 2FA / Checkpoint challenge
|
|
113
|
+
console.log(chalk_1.default.yellow('\n ⚠ Instagram requires verification (2FA/Checkpoint).'));
|
|
114
|
+
await client.challenge.auto(true); // Trigger the challenge (sends code via SMS/email)
|
|
115
|
+
console.log(chalk_1.default.cyan(' A verification code has been sent to your device.\n'));
|
|
116
|
+
const { code } = await inquirer.prompt([
|
|
117
|
+
{
|
|
118
|
+
type: 'input',
|
|
119
|
+
name: 'code',
|
|
120
|
+
message: chalk_1.default.bold('Enter the verification code:'),
|
|
121
|
+
validate: (val) => val.length > 0 || 'Code is required',
|
|
122
|
+
},
|
|
123
|
+
]);
|
|
124
|
+
try {
|
|
125
|
+
await client.challenge.sendSecurityCode(code);
|
|
126
|
+
const loggedInUser = await client.account.currentUser();
|
|
127
|
+
const serialized = await client.state.serialize();
|
|
128
|
+
delete serialized.constants;
|
|
129
|
+
(0, config_1.saveSession)({ username: answers.username, cookies: serialized, userId: loggedInUser.pk });
|
|
130
|
+
(0, config_1.saveConfig)({ username: answers.username, userId: loggedInUser.pk });
|
|
131
|
+
console.log(chalk_1.default.green(` ✓ Verified and logged in as @${answers.username}\n`));
|
|
132
|
+
return client;
|
|
133
|
+
}
|
|
134
|
+
catch (challengeErr) {
|
|
135
|
+
console.error(chalk_1.default.red(` ✗ Verification failed: ${challengeErr.message}`));
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
console.error(chalk_1.default.red(` ✗ Login failed: ${err.message}`));
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async function logout() {
|
|
144
|
+
(0, config_1.clearSession)();
|
|
145
|
+
console.log(chalk_1.default.green(' ✓ Logged out successfully. Session cleared.\n'));
|
|
146
|
+
}
|
|
147
|
+
async function ensureLoggedIn() {
|
|
148
|
+
const saved = (0, config_1.loadSession)();
|
|
149
|
+
if (!saved) {
|
|
150
|
+
console.log(chalk_1.default.yellow(' You are not logged in. Please log in first.\n'));
|
|
151
|
+
return login();
|
|
152
|
+
}
|
|
153
|
+
return login();
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function saveSession(data: Record<string, any>): void;
|
|
2
|
+
export declare function loadSession(): Record<string, any> | null;
|
|
3
|
+
export declare function clearSession(): void;
|
|
4
|
+
export declare function saveConfig(data: Record<string, any>): void;
|
|
5
|
+
export declare function loadConfig(): Record<string, any>;
|
|
6
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAcA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAG3D;AAED,wBAAgB,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAOxD;AAED,wBAAgB,YAAY,IAAI,IAAI,CAInC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAK1D;AAED,wBAAgB,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAOhD"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.saveSession = saveSession;
|
|
37
|
+
exports.loadSession = loadSession;
|
|
38
|
+
exports.clearSession = clearSession;
|
|
39
|
+
exports.saveConfig = saveConfig;
|
|
40
|
+
exports.loadConfig = loadConfig;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const os = __importStar(require("os"));
|
|
44
|
+
const CONFIG_DIR = path.join(os.homedir(), '.instagram-cli');
|
|
45
|
+
const SESSION_FILE = path.join(CONFIG_DIR, 'session.json');
|
|
46
|
+
const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
|
|
47
|
+
function ensureConfigDir() {
|
|
48
|
+
if (!fs.existsSync(CONFIG_DIR)) {
|
|
49
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function saveSession(data) {
|
|
53
|
+
ensureConfigDir();
|
|
54
|
+
fs.writeFileSync(SESSION_FILE, JSON.stringify(data, null, 2));
|
|
55
|
+
}
|
|
56
|
+
function loadSession() {
|
|
57
|
+
if (!fs.existsSync(SESSION_FILE))
|
|
58
|
+
return null;
|
|
59
|
+
try {
|
|
60
|
+
return JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function clearSession() {
|
|
67
|
+
if (fs.existsSync(SESSION_FILE)) {
|
|
68
|
+
fs.unlinkSync(SESSION_FILE);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function saveConfig(data) {
|
|
72
|
+
ensureConfigDir();
|
|
73
|
+
const existing = loadConfig();
|
|
74
|
+
const merged = { ...existing, ...data };
|
|
75
|
+
fs.writeFileSync(CONFIG_FILE, JSON.stringify(merged, null, 2));
|
|
76
|
+
}
|
|
77
|
+
function loadConfig() {
|
|
78
|
+
if (!fs.existsSync(CONFIG_FILE))
|
|
79
|
+
return {};
|
|
80
|
+
try {
|
|
81
|
+
return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'));
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return {};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,kCAGC;AAED,kCAOC;AAED,oCAIC;AAED,gCAKC;AAED,gCAOC;AAhDD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAEzB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;AAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,SAAS,eAAe;IACpB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;AACL,CAAC;AAED,SAAgB,WAAW,CAAC,IAAyB;IACjD,eAAe,EAAE,CAAC;IAClB,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAgB,WAAW;IACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,SAAgB,YAAY;IACxB,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;AACL,CAAC;AAED,SAAgB,UAAU,CAAC,IAAyB;IAChD,eAAe,EAAE,CAAC;IAClB,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;IACxC,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,SAAgB,UAAU;IACtB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3C,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC"}
|
package/dist/dm.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { IgApiClient } from 'instagram-private-api';
|
|
2
|
+
/**
|
|
3
|
+
* Fetches and displays the DM inbox.
|
|
4
|
+
*/
|
|
5
|
+
export declare function showInbox(client: IgApiClient): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Opens a chat with a specific user.
|
|
8
|
+
*/
|
|
9
|
+
export declare function openChat(client: IgApiClient, targetUsername: string): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=dm.d.ts.map
|
package/dist/dm.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dm.d.ts","sourceRoot":"","sources":["../src/dm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAMpD;;GAEG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyFlE;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDzF"}
|
package/dist/dm.js
ADDED
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.showInbox = showInbox;
|
|
40
|
+
exports.openChat = openChat;
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const cli_table3_1 = __importDefault(require("cli-table3"));
|
|
43
|
+
const inquirer = __importStar(require("inquirer"));
|
|
44
|
+
const ora_1 = __importDefault(require("ora"));
|
|
45
|
+
/**
|
|
46
|
+
* Fetches and displays the DM inbox.
|
|
47
|
+
*/
|
|
48
|
+
async function showInbox(client) {
|
|
49
|
+
const spinner = (0, ora_1.default)(chalk_1.default.cyan(' Fetching inbox...')).start();
|
|
50
|
+
try {
|
|
51
|
+
const inboxFeed = client.feed.directInbox();
|
|
52
|
+
const threads = await inboxFeed.items();
|
|
53
|
+
spinner.stop();
|
|
54
|
+
if (!threads || threads.length === 0) {
|
|
55
|
+
console.log(chalk_1.default.yellow('\n 📭 Your inbox is empty.\n'));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
console.log(chalk_1.default.bold.white('\n ╔══════════════════════════════════════╗'));
|
|
59
|
+
console.log(chalk_1.default.bold.white(' ║') + chalk_1.default.bold.cyan(' 📬 YOUR INBOX ') + chalk_1.default.bold.white('║'));
|
|
60
|
+
console.log(chalk_1.default.bold.white(' ╚══════════════════════════════════════╝\n'));
|
|
61
|
+
const table = new cli_table3_1.default({
|
|
62
|
+
head: [
|
|
63
|
+
chalk_1.default.bold.cyan('#'),
|
|
64
|
+
chalk_1.default.bold.cyan('User'),
|
|
65
|
+
chalk_1.default.bold.cyan('Last Message'),
|
|
66
|
+
chalk_1.default.bold.cyan('Time'),
|
|
67
|
+
],
|
|
68
|
+
colWidths: [5, 22, 40, 14],
|
|
69
|
+
style: { 'padding-left': 1, 'padding-right': 1 },
|
|
70
|
+
chars: {
|
|
71
|
+
'top': '─', 'top-mid': '┬', 'top-left': '┌', 'top-right': '┐',
|
|
72
|
+
'bottom': '─', 'bottom-mid': '┴', 'bottom-left': '└', 'bottom-right': '┘',
|
|
73
|
+
'left': '│', 'left-mid': '├', 'mid': '─', 'mid-mid': '┼',
|
|
74
|
+
'right': '│', 'right-mid': '┤', 'middle': '│',
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
threads.forEach((thread, index) => {
|
|
78
|
+
const users = thread.users?.map((u) => u.username).join(', ') || 'Unknown';
|
|
79
|
+
const lastItem = thread.last_permanent_item || thread.items?.[0];
|
|
80
|
+
let lastMessage = '';
|
|
81
|
+
if (lastItem) {
|
|
82
|
+
if (lastItem.item_type === 'text') {
|
|
83
|
+
lastMessage = lastItem.text || '';
|
|
84
|
+
}
|
|
85
|
+
else if (lastItem.item_type === 'reel_share') {
|
|
86
|
+
lastMessage = '📷 Story reply';
|
|
87
|
+
}
|
|
88
|
+
else if (lastItem.item_type === 'media_share') {
|
|
89
|
+
lastMessage = '🖼️ Shared post';
|
|
90
|
+
}
|
|
91
|
+
else if (lastItem.item_type === 'media') {
|
|
92
|
+
lastMessage = '📸 Photo';
|
|
93
|
+
}
|
|
94
|
+
else if (lastItem.item_type === 'voice_media') {
|
|
95
|
+
lastMessage = '🎤 Voice message';
|
|
96
|
+
}
|
|
97
|
+
else if (lastItem.item_type === 'animated_media') {
|
|
98
|
+
lastMessage = '🎬 GIF';
|
|
99
|
+
}
|
|
100
|
+
else if (lastItem.item_type === 'like') {
|
|
101
|
+
lastMessage = '❤️ Like';
|
|
102
|
+
}
|
|
103
|
+
else if (lastItem.item_type === 'link') {
|
|
104
|
+
lastMessage = '🔗 Link';
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
lastMessage = `[${lastItem.item_type}]`;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Truncate message
|
|
111
|
+
if (lastMessage.length > 36) {
|
|
112
|
+
lastMessage = lastMessage.substring(0, 33) + '...';
|
|
113
|
+
}
|
|
114
|
+
// Format timestamp
|
|
115
|
+
const timestamp = lastItem?.timestamp
|
|
116
|
+
? formatTimestamp(Number(lastItem.timestamp) / 1000)
|
|
117
|
+
: '';
|
|
118
|
+
const isUnread = !thread.read_state;
|
|
119
|
+
const prefix = isUnread ? chalk_1.default.green('● ') : ' ';
|
|
120
|
+
table.push([
|
|
121
|
+
chalk_1.default.gray(`${index + 1}`),
|
|
122
|
+
prefix + chalk_1.default.white(users),
|
|
123
|
+
chalk_1.default.gray(lastMessage),
|
|
124
|
+
chalk_1.default.dim(timestamp),
|
|
125
|
+
]);
|
|
126
|
+
});
|
|
127
|
+
console.log(table.toString());
|
|
128
|
+
console.log(chalk_1.default.dim(`\n ${chalk_1.default.green('●')} = unread | Use ${chalk_1.default.cyan('ig chat <username>')} to open a conversation\n`));
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
spinner.stop();
|
|
132
|
+
console.error(chalk_1.default.red(` ✗ Failed to fetch inbox: ${err.message}\n`));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Opens a chat with a specific user.
|
|
137
|
+
*/
|
|
138
|
+
async function openChat(client, targetUsername) {
|
|
139
|
+
const spinner = (0, ora_1.default)(chalk_1.default.cyan(` Finding @${targetUsername}...`)).start();
|
|
140
|
+
try {
|
|
141
|
+
// Find the user ID
|
|
142
|
+
const userId = await client.user.getIdByUsername(targetUsername);
|
|
143
|
+
// Find or create the thread with this user
|
|
144
|
+
spinner.text = chalk_1.default.cyan(' Opening thread...');
|
|
145
|
+
const threadResponse = await client.directThread.getByParticipants([userId.toString()]);
|
|
146
|
+
const threadId = threadResponse.thread?.thread_id;
|
|
147
|
+
if (!threadId) {
|
|
148
|
+
spinner.stop();
|
|
149
|
+
console.log(chalk_1.default.yellow(`\n No existing conversation with @${targetUsername}.`));
|
|
150
|
+
console.log(chalk_1.default.dim(' Send your first message to start a conversation!\n'));
|
|
151
|
+
// Create a new thread by sending a message
|
|
152
|
+
await newChatLoop(client, userId, targetUsername);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
spinner.text = chalk_1.default.cyan(' Loading messages...');
|
|
156
|
+
const threadFeed = client.feed.directThread({
|
|
157
|
+
thread_id: threadId,
|
|
158
|
+
oldest_cursor: '',
|
|
159
|
+
});
|
|
160
|
+
const messages = await threadFeed.items();
|
|
161
|
+
spinner.stop();
|
|
162
|
+
console.log(chalk_1.default.bold.white('\n ╔══════════════════════════════════════════════╗'));
|
|
163
|
+
console.log(chalk_1.default.bold.white(' ║') + chalk_1.default.bold.cyan(` 💬 Chat with @${targetUsername}`.padEnd(45)) + chalk_1.default.bold.white('║'));
|
|
164
|
+
console.log(chalk_1.default.bold.white(' ╚══════════════════════════════════════════════╝\n'));
|
|
165
|
+
if (messages && messages.length > 0) {
|
|
166
|
+
// Display messages in chronological order (oldest first)
|
|
167
|
+
const reversed = [...messages].reverse();
|
|
168
|
+
for (const msg of reversed) {
|
|
169
|
+
displayMessage(msg, userId, targetUsername);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
console.log(chalk_1.default.dim(' No messages yet. Start the conversation!\n'));
|
|
174
|
+
}
|
|
175
|
+
// Enter interactive chat mode
|
|
176
|
+
await chatLoop(client, threadId, targetUsername, userId);
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
spinner.stop();
|
|
180
|
+
if (err.message?.includes('User not found')) {
|
|
181
|
+
console.error(chalk_1.default.red(` ✗ User @${targetUsername} not found.\n`));
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
console.error(chalk_1.default.red(` ✗ Failed to open chat: ${err.message}\n`));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function displayMessage(msg, otherUserId, otherUsername) {
|
|
189
|
+
const isMe = msg.user_id !== otherUserId;
|
|
190
|
+
const sender = isMe ? chalk_1.default.cyan('You') : chalk_1.default.magenta(`@${otherUsername}`);
|
|
191
|
+
const time = formatTimestamp(Number(msg.timestamp) / 1000);
|
|
192
|
+
let content = '';
|
|
193
|
+
switch (msg.item_type) {
|
|
194
|
+
case 'text':
|
|
195
|
+
content = msg.text || '';
|
|
196
|
+
break;
|
|
197
|
+
case 'media':
|
|
198
|
+
content = '📸 [Photo]';
|
|
199
|
+
break;
|
|
200
|
+
case 'voice_media':
|
|
201
|
+
content = '🎤 [Voice message]';
|
|
202
|
+
break;
|
|
203
|
+
case 'animated_media':
|
|
204
|
+
content = '🎬 [GIF]';
|
|
205
|
+
break;
|
|
206
|
+
case 'reel_share':
|
|
207
|
+
content = '📷 [Story reply]';
|
|
208
|
+
if (msg.reel_share?.text) {
|
|
209
|
+
content += `: ${msg.reel_share.text}`;
|
|
210
|
+
}
|
|
211
|
+
break;
|
|
212
|
+
case 'media_share':
|
|
213
|
+
content = '🖼️ [Shared post]';
|
|
214
|
+
break;
|
|
215
|
+
case 'like':
|
|
216
|
+
content = '❤️';
|
|
217
|
+
break;
|
|
218
|
+
case 'link':
|
|
219
|
+
content = `🔗 ${msg.link?.text || '[Link]'}`;
|
|
220
|
+
break;
|
|
221
|
+
default:
|
|
222
|
+
content = `[${msg.item_type}]`;
|
|
223
|
+
}
|
|
224
|
+
if (isMe) {
|
|
225
|
+
console.log(` ${chalk_1.default.dim(time)} ${sender}: ${chalk_1.default.white(content)}`);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
console.log(` ${chalk_1.default.dim(time)} ${sender}: ${chalk_1.default.gray(content)}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* New chat loop — for when there's no existing thread. Creates thread on first message.
|
|
233
|
+
*/
|
|
234
|
+
async function newChatLoop(client, targetUserId, targetUsername) {
|
|
235
|
+
console.log(chalk_1.default.dim(` Type a message and press Enter to send.`));
|
|
236
|
+
console.log(chalk_1.default.dim(` Type ${chalk_1.default.yellow('/exit')} to leave.\n`));
|
|
237
|
+
const { message } = await inquirer.prompt([
|
|
238
|
+
{
|
|
239
|
+
type: 'input',
|
|
240
|
+
name: 'message',
|
|
241
|
+
message: chalk_1.default.green(' ➤'),
|
|
242
|
+
prefix: '',
|
|
243
|
+
},
|
|
244
|
+
]);
|
|
245
|
+
const trimmed = message.trim();
|
|
246
|
+
if (!trimmed || trimmed === '/exit' || trimmed === '/quit') {
|
|
247
|
+
console.log(chalk_1.default.dim('\n 👋 Left the chat.\n'));
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
try {
|
|
251
|
+
const threadEntity = client.entity.directThread([targetUserId.toString()]);
|
|
252
|
+
await threadEntity.broadcastText(trimmed);
|
|
253
|
+
const now = new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
|
|
254
|
+
console.log(` ${chalk_1.default.dim(now)} ${chalk_1.default.cyan('You')}: ${chalk_1.default.white(trimmed)}`);
|
|
255
|
+
// Now get the thread ID and continue in chatLoop
|
|
256
|
+
const threadResponse = await client.directThread.getByParticipants([targetUserId.toString()]);
|
|
257
|
+
const threadId = threadResponse.thread?.thread_id;
|
|
258
|
+
if (threadId) {
|
|
259
|
+
await chatLoop(client, threadId, targetUsername, targetUserId);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
console.error(chalk_1.default.red(` ✗ Failed to send: ${err.message}`));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Interactive chat loop — send messages back-and-forth.
|
|
268
|
+
*/
|
|
269
|
+
async function chatLoop(client, threadId, targetUsername, targetUserId) {
|
|
270
|
+
console.log(chalk_1.default.dim('\n ─────────────────────────────────────────'));
|
|
271
|
+
console.log(chalk_1.default.dim(` Type a message and press Enter to send.`));
|
|
272
|
+
console.log(chalk_1.default.dim(` Type ${chalk_1.default.yellow('/refresh')} to reload messages.`));
|
|
273
|
+
console.log(chalk_1.default.dim(` Type ${chalk_1.default.yellow('/exit')} or press Ctrl+C to leave.\n`));
|
|
274
|
+
while (true) {
|
|
275
|
+
const { message } = await inquirer.prompt([
|
|
276
|
+
{
|
|
277
|
+
type: 'input',
|
|
278
|
+
name: 'message',
|
|
279
|
+
message: chalk_1.default.green(' ➤'),
|
|
280
|
+
prefix: '',
|
|
281
|
+
},
|
|
282
|
+
]);
|
|
283
|
+
const trimmed = message.trim();
|
|
284
|
+
if (!trimmed)
|
|
285
|
+
continue;
|
|
286
|
+
if (trimmed === '/exit' || trimmed === '/quit') {
|
|
287
|
+
console.log(chalk_1.default.dim('\n 👋 Left the chat.\n'));
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
if (trimmed === '/refresh') {
|
|
291
|
+
console.log('');
|
|
292
|
+
const spinner = (0, ora_1.default)(chalk_1.default.cyan(' Refreshing messages...')).start();
|
|
293
|
+
try {
|
|
294
|
+
const threadFeed = client.feed.directThread({
|
|
295
|
+
thread_id: threadId,
|
|
296
|
+
oldest_cursor: '',
|
|
297
|
+
});
|
|
298
|
+
const messages = await threadFeed.items();
|
|
299
|
+
spinner.stop();
|
|
300
|
+
if (messages && messages.length > 0) {
|
|
301
|
+
console.log(chalk_1.default.dim('\n ─── Recent Messages ───\n'));
|
|
302
|
+
const reversed = [...messages].reverse().slice(-10); // last 10
|
|
303
|
+
for (const msg of reversed) {
|
|
304
|
+
displayMessage(msg, targetUserId, targetUsername);
|
|
305
|
+
}
|
|
306
|
+
console.log(chalk_1.default.dim('\n ─────────────────────────────────────────\n'));
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
catch (err) {
|
|
310
|
+
spinner.stop();
|
|
311
|
+
console.error(chalk_1.default.red(` ✗ Refresh failed: ${err.message}`));
|
|
312
|
+
}
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
// Send the message via the thread entity
|
|
316
|
+
try {
|
|
317
|
+
const threadEntity = client.entity.directThread(threadId);
|
|
318
|
+
await threadEntity.broadcastText(trimmed);
|
|
319
|
+
const now = new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
|
|
320
|
+
console.log(` ${chalk_1.default.dim(now)} ${chalk_1.default.cyan('You')}: ${chalk_1.default.white(trimmed)}`);
|
|
321
|
+
}
|
|
322
|
+
catch (err) {
|
|
323
|
+
console.error(chalk_1.default.red(` ✗ Failed to send: ${err.message}`));
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
function formatTimestamp(epochMs) {
|
|
328
|
+
const date = new Date(epochMs);
|
|
329
|
+
const now = new Date();
|
|
330
|
+
const diffMs = now.getTime() - date.getTime();
|
|
331
|
+
const diffMins = Math.floor(diffMs / 60000);
|
|
332
|
+
const diffHours = Math.floor(diffMs / 3600000);
|
|
333
|
+
const diffDays = Math.floor(diffMs / 86400000);
|
|
334
|
+
if (diffMins < 1)
|
|
335
|
+
return 'just now';
|
|
336
|
+
if (diffMins < 60)
|
|
337
|
+
return `${diffMins}m ago`;
|
|
338
|
+
if (diffHours < 24)
|
|
339
|
+
return `${diffHours}h ago`;
|
|
340
|
+
if (diffDays < 7)
|
|
341
|
+
return `${diffDays}d ago`;
|
|
342
|
+
return date.toLocaleDateString();
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=dm.js.map
|
package/dist/dm.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dm.js","sourceRoot":"","sources":["../src/dm.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const auth_1 = require("./auth");
|
|
10
|
+
const dm_1 = require("./dm");
|
|
11
|
+
const program = new commander_1.Command();
|
|
12
|
+
const BANNER = `
|
|
13
|
+
${chalk_1.default.bold.magenta(' ╦╗╗╔═╗╔╦╗╔═╗ ╔═╗╦ ╦')}
|
|
14
|
+
${chalk_1.default.bold.magenta(' ║║║╚═╗ ║ ╠═╣───║ ║ ║')}
|
|
15
|
+
${chalk_1.default.bold.magenta(' ╩╝╚╚═╝ ╩ ╩ ╩ ╚═╝╩═╝╩')}
|
|
16
|
+
${chalk_1.default.dim(' Distraction-free Instagram from your terminal')}
|
|
17
|
+
${chalk_1.default.dim(' ─────────────────────────────────────────────')}
|
|
18
|
+
`;
|
|
19
|
+
program
|
|
20
|
+
.name('ig')
|
|
21
|
+
.description('Distraction-free Instagram CLI — DMs only, no reels, no feed.')
|
|
22
|
+
.version('1.0.0')
|
|
23
|
+
.addHelpText('before', BANNER);
|
|
24
|
+
// ─── Login ───
|
|
25
|
+
program
|
|
26
|
+
.command('login')
|
|
27
|
+
.description('Log in to your Instagram account')
|
|
28
|
+
.action(async () => {
|
|
29
|
+
console.log(BANNER);
|
|
30
|
+
await (0, auth_1.login)();
|
|
31
|
+
});
|
|
32
|
+
// ─── Logout ───
|
|
33
|
+
program
|
|
34
|
+
.command('logout')
|
|
35
|
+
.description('Log out and clear saved session')
|
|
36
|
+
.action(async () => {
|
|
37
|
+
console.log(BANNER);
|
|
38
|
+
await (0, auth_1.logout)();
|
|
39
|
+
});
|
|
40
|
+
// ─── Inbox ───
|
|
41
|
+
program
|
|
42
|
+
.command('inbox')
|
|
43
|
+
.description('View your DM inbox')
|
|
44
|
+
.action(async () => {
|
|
45
|
+
console.log(BANNER);
|
|
46
|
+
const client = await (0, auth_1.ensureLoggedIn)();
|
|
47
|
+
await (0, dm_1.showInbox)(client);
|
|
48
|
+
});
|
|
49
|
+
// ─── Chat ───
|
|
50
|
+
program
|
|
51
|
+
.command('chat <username>')
|
|
52
|
+
.description('Open a chat with a specific user')
|
|
53
|
+
.action(async (username) => {
|
|
54
|
+
console.log(BANNER);
|
|
55
|
+
const client = await (0, auth_1.ensureLoggedIn)();
|
|
56
|
+
await (0, dm_1.openChat)(client, username);
|
|
57
|
+
});
|
|
58
|
+
// ─── Default: show help ───
|
|
59
|
+
if (!process.argv.slice(2).length) {
|
|
60
|
+
console.log(BANNER);
|
|
61
|
+
program.outputHelp();
|
|
62
|
+
}
|
|
63
|
+
program.parse(process.argv);
|
|
64
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,iCAAuD;AACvD,6BAA2C;AAE3C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,MAAM,MAAM,GAAG;EACb,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAAC;EAC9C,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAAC;EAC9C,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAAC;EAC9C,eAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC;EAC5D,eAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC;CAC7D,CAAC;AAEF,OAAO;KACF,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,+DAA+D,CAAC;KAC5E,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAEnC,gBAAgB;AAChB,OAAO;KACF,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,IAAA,YAAK,GAAE,CAAC;AAClB,CAAC,CAAC,CAAC;AAEP,iBAAiB;AACjB,OAAO;KACF,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,IAAA,aAAM,GAAE,CAAC;AACnB,CAAC,CAAC,CAAC;AAEP,gBAAgB;AAChB,OAAO;KACF,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,oBAAoB,CAAC;KACjC,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAc,GAAE,CAAC;IACtC,MAAM,IAAA,cAAS,EAAC,MAAM,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEP,eAAe;AACf,OAAO;KACF,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,EAAE;IAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAc,GAAE,CAAC;IACtC,MAAM,IAAA,aAAQ,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEP,6BAA6B;AAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,UAAU,EAAE,CAAC;AACzB,CAAC;AAED,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "insta-dista-cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Distraction-free Instagram CLI — DMs only, no reels, no feed, no stories.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"ig": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"start": "node dist/index.js",
|
|
12
|
+
"dev": "tsc && node dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"instagram",
|
|
16
|
+
"cli",
|
|
17
|
+
"dm",
|
|
18
|
+
"distraction-free",
|
|
19
|
+
"terminal",
|
|
20
|
+
"messaging"
|
|
21
|
+
],
|
|
22
|
+
"author": "",
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"type": "commonjs",
|
|
25
|
+
"files": [
|
|
26
|
+
"dist/**/*",
|
|
27
|
+
"README.md"
|
|
28
|
+
],
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"chalk": "^4.1.2",
|
|
31
|
+
"cli-table3": "^0.6.5",
|
|
32
|
+
"commander": "^14.0.3",
|
|
33
|
+
"inquirer": "^8.2.6",
|
|
34
|
+
"instagram-private-api": "^1.46.1",
|
|
35
|
+
"ora": "^5.4.1"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/inquirer": "^8.2.10",
|
|
39
|
+
"@types/node": "^25.3.0",
|
|
40
|
+
"typescript": "^5.9.3"
|
|
41
|
+
}
|
|
42
|
+
}
|