35 |
36 | 3. Open [Instagram](instagram.com) and log into your account
37 |
38 | 4. Open the developer console (F12) and paste the code
39 |
40 | ### Method 2: Chrome extension
41 |
42 | 1. Download the latest `InstaSweep.zip` file from the repository's [`Releases`](https://github.com/SocialForge/InstaSweep/releases) section.
43 |
44 | 2. Unzip the contents of the file.
45 |
46 | 3. Open a Chromium-based web browser (Chrome, Chromium, Brave, Edge, etc...)
47 |
48 | 4. Go to `Manage extension` menu within the web browser
49 |
50 | 5. Enable `Developer mode` in order to manually add an extension
51 |
52 | 6. Click `Load unpacked`. This will open the browser's file selection dialog
53 |
54 | 7. Navigate to the previously extracted `public` directory and open it
55 |
56 | 8. Once inside, press `Select folder` and the extension should be added to your browser extensions
57 |
58 | 9. Open [Instagram](instagram.com), log into your account and click on the extension, or hit **CTRL+I** on the keyboard to execute.
59 |
60 | ## Running the script
61 |
62 | Upon running the script via any of the methods mentioned above, you will be met with the following interface:
63 |
64 |
65 |
66 | Click anywhere to start the scanning process.
67 |
68 | Once it finishes, you will be met with the following screen which will show you the results:
69 |
70 |
71 |
72 | If you wish to unfollow any of these users, you can select 1 or more of them by clicking on them and then clicking the "UNFOLLOW" button on the bottom left.
73 |
74 | ## HotKeys \*️⃣
75 |
76 | Only relevant in "Scanning" screen.
77 |
78 | - **LEFT ARROW** - previous page
79 | - **RIGHT ARROW** - next page
80 | - **TAB** - switch tab
81 | - **CTRL+A** - select all users in list
82 | - **CTRL+S** - open search bar
83 | - **CTRL+C** - copy selected user list to clipboard
84 | - **CTRL+X** - whitelist / unwhitelist selected users
85 |
86 | ## Dev 🔧
87 |
88 | Contributions are welcome!
89 |
90 | To get started, follow these steps:
91 |
92 | 1. Clone the GitHub repository to your local machine
93 |
94 | 2. Run `npm i` to install the required dependencies
95 |
96 | 3. Introduce your desired changes
97 |
98 | 4. Run `npm run build` to compile your changes and update the build files
99 |
100 | 5. Submit a PR for review
101 |
102 | ## Notes 📔
103 |
104 | - **_The more users you have to check, the more time it will take_**
105 |
106 | - **_The script has been tested only on Chromium-based browsers_**
107 |
108 | - **_The script is actively supported only on Chromium-based browsers_**
109 |
110 | ## Legal ⚖️
111 |
112 | **Disclaimer:** This is not affiliated, associated, authorized, endorsed by, or in any way officially connected with Instagram.
113 |
114 | Use it at your own risk!
115 |
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "browser": true,
4 | "es2021": true
5 | },
6 | "extends": ["eslint:recommended", "plugin:react/recommended", "plugin:@typescript-eslint/recommended"],
7 | "overrides": [],
8 | "parser": "@typescript-eslint/parser",
9 | "parserOptions": {
10 | "ecmaVersion": "latest",
11 | "sourceType": "module",
12 | "project": "./tsconfig.json"
13 | },
14 | "plugins": ["react", "@typescript-eslint", "react-hooks"],
15 | "rules": {
16 | "@typescript-eslint/array-type": [
17 | "error",
18 | {
19 | "default": "array-simple"
20 | }
21 | ],
22 | "@typescript-eslint/ban-ts-comment": "off",
23 | "@typescript-eslint/consistent-type-assertions": "error",
24 | "@typescript-eslint/consistent-type-definitions": "error",
25 | "@typescript-eslint/dot-notation": "error",
26 | "@typescript-eslint/explicit-module-boundary-types": "off",
27 | "@typescript-eslint/explicit-member-accessibility": [
28 | "off",
29 | {
30 | "accessibility": "explicit"
31 | }
32 | ],
33 | "@typescript-eslint/member-delimiter-style": [
34 | "error",
35 | {
36 | "multiline": {
37 | "delimiter": "semi",
38 | "requireLast": true
39 | },
40 | "singleline": {
41 | "delimiter": "semi",
42 | "requireLast": false
43 | }
44 | }
45 | ],
46 | "@typescript-eslint/no-empty-function": "off",
47 | "@typescript-eslint/no-explicit-any": "off",
48 | "@typescript-eslint/no-namespace": "off",
49 | "@typescript-eslint/no-shadow": "error",
50 | "@typescript-eslint/no-parameter-properties": "off",
51 | "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error",
52 | "@typescript-eslint/no-unnecessary-condition": "error",
53 | "@typescript-eslint/no-unnecessary-type-arguments": "error",
54 | "@typescript-eslint/no-unnecessary-type-assertion": "error",
55 | "@typescript-eslint/no-unused-expressions": "error",
56 | "@typescript-eslint/no-use-before-define": "error",
57 | "@typescript-eslint/no-unused-vars": [
58 | "error",
59 | {
60 | "varsIgnorePattern": "^_",
61 | "argsIgnorePattern": "^_"
62 | }
63 | ],
64 | "@typescript-eslint/no-var-requires": "error",
65 | "@typescript-eslint/non-nullable-type-assertion-style": "error",
66 | "@typescript-eslint/prefer-enum-initializers": "error",
67 | "@typescript-eslint/prefer-for-of": "error",
68 | "@typescript-eslint/prefer-function-type": "error",
69 | "@typescript-eslint/prefer-namespace-keyword": "error",
70 | "@typescript-eslint/prefer-readonly": "error",
71 | "@typescript-eslint/quotes": [
72 | "error",
73 | "single",
74 | {
75 | "avoidEscape": true
76 | }
77 | ],
78 | "@typescript-eslint/restrict-plus-operands": "error",
79 | "@typescript-eslint/semi": ["error", "always"],
80 | "@typescript-eslint/triple-slash-reference": [
81 | "error",
82 | {
83 | "path": "always",
84 | "types": "prefer-import",
85 | "lib": "always"
86 | }
87 | ],
88 | "@typescript-eslint/type-annotation-spacing": "error",
89 | "@typescript-eslint/no-non-null-assertion": "off",
90 | "@typescript-eslint/consistent-type-imports": "error",
91 | "react-hooks/rules-of-hooks": "error",
92 | "react-hooks/exhaustive-deps": "error",
93 | "react/jsx-curly-brace-presence": [
94 | "error",
95 | {
96 | "props": "never",
97 | "children": "never",
98 | "propElementValues": "always"
99 | }
100 | ],
101 | "react/self-closing-comp": [
102 | "error",
103 | {
104 | "component": true,
105 | "html": true
106 | }
107 | ],
108 | "arrow-body-style": ["error", "as-needed"],
109 | "arrow-parens": ["error", "as-needed"],
110 | "brace-style": ["error", "1tbs"],
111 | "comma-dangle": ["error", "always-multiline"],
112 | "curly": "error",
113 | "comma-spacing": [
114 | "error",
115 | {
116 | "before": false,
117 | "after": true
118 | }
119 | ],
120 | "eol-last": "error",
121 | "eqeqeq": ["error", "smart"],
122 | "jsx-quotes": ["error", "prefer-single"],
123 | "keyword-spacing": ["error", { "before": true, "after": true }],
124 | "guard-for-in": "error",
125 | "new-parens": "error",
126 | "no-caller": "error",
127 | "no-duplicate-imports": "error",
128 | "no-eval": "error",
129 | "no-extra-bind": "error",
130 | "no-multiple-empty-lines": [
131 | "error",
132 | {
133 | "max": 2
134 | }
135 | ],
136 | "no-new-func": "error",
137 | "no-new-wrappers": "error",
138 | "no-return-await": "error",
139 | "no-sequences": "error",
140 | "no-template-curly-in-string": "error",
141 | "no-throw-literal": "error",
142 | "no-trailing-spaces": "error",
143 | "no-multi-spaces": [
144 | "error",
145 | {
146 | "ignoreEOLComments": true
147 | }
148 | ],
149 | "no-undef-init": "error",
150 | "object-shorthand": "error",
151 | "one-var": ["error", "never"],
152 | "prefer-object-spread": "error",
153 | "quote-props": ["error", "consistent-as-needed"],
154 | "radix": "error",
155 | "space-before-function-paren": [
156 | "error",
157 | {
158 | "anonymous": "always",
159 | "asyncArrow": "always",
160 | "named": "never"
161 | }
162 | ],
163 | "space-infix-ops": "error",
164 | "space-in-parens": ["error", "never"],
165 | "spaced-comment": [
166 | "error",
167 | "always",
168 | {
169 | "markers": ["/"]
170 | }
171 | ]
172 | }
173 | }
174 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |