nglstrike 1.0.0__tar.gz
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.
- nglstrike-1.0.0/LICENSE +21 -0
- nglstrike-1.0.0/PKG-INFO +168 -0
- nglstrike-1.0.0/README.md +152 -0
- nglstrike-1.0.0/nglstrike/__init__.py +0 -0
- nglstrike-1.0.0/nglstrike/__main__.py +0 -0
- nglstrike-1.0.0/nglstrike/main.py +289 -0
- nglstrike-1.0.0/nglstrike.egg-info/PKG-INFO +168 -0
- nglstrike-1.0.0/nglstrike.egg-info/SOURCES.txt +13 -0
- nglstrike-1.0.0/nglstrike.egg-info/dependency_links.txt +1 -0
- nglstrike-1.0.0/nglstrike.egg-info/entry_points.txt +2 -0
- nglstrike-1.0.0/nglstrike.egg-info/requires.txt +1 -0
- nglstrike-1.0.0/nglstrike.egg-info/top_level.txt +2 -0
- nglstrike-1.0.0/pyproject.toml +28 -0
- nglstrike-1.0.0/setup.cfg +4 -0
- nglstrike-1.0.0/setup.py +26 -0
nglstrike-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 mallikmusaddiq1
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
nglstrike-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: nglstrike
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Anonymous Auto-Sender for NGL
|
|
5
|
+
Author: Mallik Mohammed Musaddiq
|
|
6
|
+
Author-email: Mallik Mohammed Musaddiq <mallikmusaddiq1@gmail.com>
|
|
7
|
+
License: MIT
|
|
8
|
+
Project-URL: Homepage, https://github.com/mallikmusaddiq1/nglstrike
|
|
9
|
+
Requires-Python: >=3.6
|
|
10
|
+
Description-Content-Type: text/markdown
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Requires-Dist: requests
|
|
13
|
+
Dynamic: author
|
|
14
|
+
Dynamic: license-file
|
|
15
|
+
Dynamic: requires-python
|
|
16
|
+
|
|
17
|
+
# nglstrike
|
|
18
|
+
|
|
19
|
+
Anonymous Auto-Sender for NGL โ because sometimes, kindness needs a little automation.
|
|
20
|
+
|
|
21
|
+
## ๐ Overview
|
|
22
|
+
|
|
23
|
+
`nglstrike` is a professional-grade command-line tool that automates the process of sending anonymous messages via [ngl.link](https://ngl.link). Built for thoughtful experimentation and personal use, it supports single-message repetition or bulk message delivery from `.txt` files โ with built-in delay, dry-run simulation, offensive word filtering, and message shuffling.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## โจ Features
|
|
28
|
+
|
|
29
|
+
* โ
**Send anonymous messages to any NGL username**
|
|
30
|
+
* ๐ **Load messages from a `.txt` file**
|
|
31
|
+
* โฑ๏ธ **Custom interval delay between messages**
|
|
32
|
+
* ๐ **Single message repeat or random pick from message pool**
|
|
33
|
+
* ๐ **Shuffle mode (no message repeats until exhausted)**
|
|
34
|
+
* ๐งช **Dry-run mode** to preview message flow before actually sending
|
|
35
|
+
* ๐ซ **Built-in offensive language filter**
|
|
36
|
+
* ๐ **Common argument mistake detection**
|
|
37
|
+
* ๐ **Clean logging + ETA predictions**
|
|
38
|
+
* ๐ **Auto-generated summary after run**
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## ๐ Installation
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
Option 1 - Clone the repo:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
git clone https://github.com/mallikmusaddiq1/nglstrike.git
|
|
50
|
+
cd nglstrike
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Make it executable:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
chmod +x nglstrike.py
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Run with Python 3:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
nglstrike.py [options]
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
Option 2: Pip installation.
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
pip install nglstrike
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## ๐ง Usage Examples
|
|
74
|
+
|
|
75
|
+
### Send a single message repeatedly:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
nglstrike.py -u your_username -m "Stay strong!"
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Send multiple messages from a file:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
nglstrike.py -u your_username -m-path messages.txt --limit 10 -i 30
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Preview sending order (no actual messages):
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
nglstrike.py -u your_username -m-path messages.txt --dry-run --limit 5
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Shuffle messages (each sent only once):
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
nglstrike.py -u your_username -m-path messages.txt --shuffle
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## ๐ Format for `messages.txt`
|
|
102
|
+
|
|
103
|
+
Plaintext file with one message per line. Example:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
You're amazing.
|
|
107
|
+
Keep going โ you're close.
|
|
108
|
+
Someone out there believes in you.
|
|
109
|
+
The best is yet to come.
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## โ๏ธ Arguments
|
|
115
|
+
|
|
116
|
+
| Argument | Description |
|
|
117
|
+
| --------------------------- | ------------------------------------------------- |
|
|
118
|
+
| `-u`, `--username` | **(Required)** Your NGL username (no link) |
|
|
119
|
+
| `-m`, `--message` | Send a single repeated message |
|
|
120
|
+
| `-m-path`, `--message-path` | Path to `.txt` file with multiple messages |
|
|
121
|
+
| `-i`, `--interval` | Delay between messages in seconds (default: `60`) |
|
|
122
|
+
| `--limit` | Stop after sending `N` messages |
|
|
123
|
+
| `--dry-run` | Preview messages instead of sending |
|
|
124
|
+
| `--shuffle` | Send each message only once in random order |
|
|
125
|
+
| `-v`, `--version` | Show version and legal info |
|
|
126
|
+
| `-h`, `--help` | Show help message |
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## ๐งผ Offensive Word Filter
|
|
131
|
+
|
|
132
|
+
Before sending, `nglstrike` checks each message for offensive content using a predefined blacklist of strictly abusive terms. If **all messages** are flagged as offensive, the tool exits.
|
|
133
|
+
|
|
134
|
+
Use responsibly.
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## ๐ Legal & Ethical Notice
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
This tool is intended strictly for educational and personal experimentation.
|
|
142
|
+
Do NOT use this tool to spam, harass, or disturb anyone.
|
|
143
|
+
Misuse may violate NGL's Terms of Service.
|
|
144
|
+
You alone are responsible for your actions.
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Keep digital spaces kind, safe, and human.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## ๐ค Author
|
|
152
|
+
|
|
153
|
+
**Mallik Mohammed Musaddiq**
|
|
154
|
+
GitHub: [@mallikmusaddiq1](https://github.com/mallikmusaddiq1)
|
|
155
|
+
Email: [mallikmusaddiq1@gmail.com](mailto:mallikmusaddiq1@gmail.com)
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## ๐ License
|
|
160
|
+
|
|
161
|
+
This project is licensed under the MIT License. See `LICENSE` for more details.
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## โค๏ธ Support
|
|
166
|
+
|
|
167
|
+
If this project helped you, feel free to โญ the repo or contribute.
|
|
168
|
+
Spread kindness. Automate it โ ethically.
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# nglstrike
|
|
2
|
+
|
|
3
|
+
Anonymous Auto-Sender for NGL โ because sometimes, kindness needs a little automation.
|
|
4
|
+
|
|
5
|
+
## ๐ Overview
|
|
6
|
+
|
|
7
|
+
`nglstrike` is a professional-grade command-line tool that automates the process of sending anonymous messages via [ngl.link](https://ngl.link). Built for thoughtful experimentation and personal use, it supports single-message repetition or bulk message delivery from `.txt` files โ with built-in delay, dry-run simulation, offensive word filtering, and message shuffling.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## โจ Features
|
|
12
|
+
|
|
13
|
+
* โ
**Send anonymous messages to any NGL username**
|
|
14
|
+
* ๐ **Load messages from a `.txt` file**
|
|
15
|
+
* โฑ๏ธ **Custom interval delay between messages**
|
|
16
|
+
* ๐ **Single message repeat or random pick from message pool**
|
|
17
|
+
* ๐ **Shuffle mode (no message repeats until exhausted)**
|
|
18
|
+
* ๐งช **Dry-run mode** to preview message flow before actually sending
|
|
19
|
+
* ๐ซ **Built-in offensive language filter**
|
|
20
|
+
* ๐ **Common argument mistake detection**
|
|
21
|
+
* ๐ **Clean logging + ETA predictions**
|
|
22
|
+
* ๐ **Auto-generated summary after run**
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## ๐ Installation
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
Option 1 - Clone the repo:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
git clone https://github.com/mallikmusaddiq1/nglstrike.git
|
|
34
|
+
cd nglstrike
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Make it executable:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
chmod +x nglstrike.py
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Run with Python 3:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
nglstrike.py [options]
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
Option 2: Pip installation.
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
pip install nglstrike
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## ๐ง Usage Examples
|
|
58
|
+
|
|
59
|
+
### Send a single message repeatedly:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
nglstrike.py -u your_username -m "Stay strong!"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Send multiple messages from a file:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
nglstrike.py -u your_username -m-path messages.txt --limit 10 -i 30
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Preview sending order (no actual messages):
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
nglstrike.py -u your_username -m-path messages.txt --dry-run --limit 5
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Shuffle messages (each sent only once):
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
nglstrike.py -u your_username -m-path messages.txt --shuffle
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## ๐ Format for `messages.txt`
|
|
86
|
+
|
|
87
|
+
Plaintext file with one message per line. Example:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
You're amazing.
|
|
91
|
+
Keep going โ you're close.
|
|
92
|
+
Someone out there believes in you.
|
|
93
|
+
The best is yet to come.
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## โ๏ธ Arguments
|
|
99
|
+
|
|
100
|
+
| Argument | Description |
|
|
101
|
+
| --------------------------- | ------------------------------------------------- |
|
|
102
|
+
| `-u`, `--username` | **(Required)** Your NGL username (no link) |
|
|
103
|
+
| `-m`, `--message` | Send a single repeated message |
|
|
104
|
+
| `-m-path`, `--message-path` | Path to `.txt` file with multiple messages |
|
|
105
|
+
| `-i`, `--interval` | Delay between messages in seconds (default: `60`) |
|
|
106
|
+
| `--limit` | Stop after sending `N` messages |
|
|
107
|
+
| `--dry-run` | Preview messages instead of sending |
|
|
108
|
+
| `--shuffle` | Send each message only once in random order |
|
|
109
|
+
| `-v`, `--version` | Show version and legal info |
|
|
110
|
+
| `-h`, `--help` | Show help message |
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## ๐งผ Offensive Word Filter
|
|
115
|
+
|
|
116
|
+
Before sending, `nglstrike` checks each message for offensive content using a predefined blacklist of strictly abusive terms. If **all messages** are flagged as offensive, the tool exits.
|
|
117
|
+
|
|
118
|
+
Use responsibly.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## ๐ Legal & Ethical Notice
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
This tool is intended strictly for educational and personal experimentation.
|
|
126
|
+
Do NOT use this tool to spam, harass, or disturb anyone.
|
|
127
|
+
Misuse may violate NGL's Terms of Service.
|
|
128
|
+
You alone are responsible for your actions.
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Keep digital spaces kind, safe, and human.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## ๐ค Author
|
|
136
|
+
|
|
137
|
+
**Mallik Mohammed Musaddiq**
|
|
138
|
+
GitHub: [@mallikmusaddiq1](https://github.com/mallikmusaddiq1)
|
|
139
|
+
Email: [mallikmusaddiq1@gmail.com](mailto:mallikmusaddiq1@gmail.com)
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## ๐ License
|
|
144
|
+
|
|
145
|
+
This project is licensed under the MIT License. See `LICENSE` for more details.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## โค๏ธ Support
|
|
150
|
+
|
|
151
|
+
If this project helped you, feel free to โญ the repo or contribute.
|
|
152
|
+
Spread kindness. Automate it โ ethically.
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import requests
|
|
5
|
+
import random
|
|
6
|
+
import time
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
import sys
|
|
9
|
+
from datetime import datetime, timedelta
|
|
10
|
+
|
|
11
|
+
# ========== COMMON ARGUMENT MISTAKES ==========
|
|
12
|
+
common_mistakes = {
|
|
13
|
+
"-message": "--message",
|
|
14
|
+
"-limit": "--limit",
|
|
15
|
+
"-username": "--username",
|
|
16
|
+
"--m-path": "-m-path",
|
|
17
|
+
"-message-path": "--message-path",
|
|
18
|
+
"-interval": "--interval",
|
|
19
|
+
"-dry-run": "--dry-run",
|
|
20
|
+
"-shuffle": "--shuffle"
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
# ========== OFFENSIVE WORD LIST ==========
|
|
24
|
+
OFFENSIVE_WORDS = [
|
|
25
|
+
"arse", "arsehole", "ass", "asshole", "asswipe", "baklola", "bakloli", "bakrichod", "bastard", "behenchara",
|
|
26
|
+
"bellend", "bhenchod", "bhenchodi", "bhosda", "bhosdake", "bhosdika", "bhosdi", "bhosdiwala", "bhoska",
|
|
27
|
+
"bhosadpappu", "bitch", "bollocks", "bugger", "chakka", "chhinar", "chhinal", "chhokri", "chhokru",
|
|
28
|
+
"chodu", "choot", "chudal", "chuda", "chudail", "chudasi", "chut", "chutad", "chutappa", "chutkan",
|
|
29
|
+
"chutkul", "chutmar", "chutmarani", "chutmarike", "chutni", "chutpana", "chutroo", "chutiya", "chutiyapa",
|
|
30
|
+
"clunt", "cock", "coon", "crap", "cum", "dalla", "dick", "dickhead", "dickwad", "dipshit", "douche",
|
|
31
|
+
"douchebag", "douchecanoe", "faggot", "fuck", "fucker", "fucktard", "fuckwit", "gandiya", "gand",
|
|
32
|
+
"gandfat", "gandhasti", "gandmar", "gandmara", "gandora", "ganduk", "ganduwa", "gaandu", "gook", "hagni",
|
|
33
|
+
"harami", "haramkhor", "hijra", "jackass", "jhaant", "jhaantoo", "jizz", "kameena", "kameeni", "kamina",
|
|
34
|
+
"khotey", "khotta", "kike", "knob", "kotha", "kutti", "kutta", "lavda", "lavde", "madarchod", "madarsi",
|
|
35
|
+
"motherfucker", "napunsak", "nigger", "paki", "phuddi", "prick", "pricktease", "pussy", "randbaaz",
|
|
36
|
+
"randipana", "randwa", "randi", "retard", "sali", "schmuck", "scumbag", "shit", "shitbag", "shitface",
|
|
37
|
+
"shithead", "shitty", "skank", "slag", "slut", "slutbag", "spic", "spick", "suar", "suar ka baccha",
|
|
38
|
+
"tatti", "tossbag", "tosser", "tosspot", "tramp", "turd", "tattu", "twat", "wanker", "wankstain"
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
for arg in sys.argv:
|
|
42
|
+
if arg in common_mistakes:
|
|
43
|
+
correct = common_mistakes[arg]
|
|
44
|
+
sys.stderr.write(f"[ERROR] Did you mean {correct} instead of {arg} ?\n")
|
|
45
|
+
sys.exit(1)
|
|
46
|
+
|
|
47
|
+
# ========== VERSION INFO ==========
|
|
48
|
+
LEGAL_NOTICE = """\
|
|
49
|
+
nglstrike 1.0.0 - Anonymous Auto-Sender for NGL
|
|
50
|
+
|
|
51
|
+
Author : Mallik Mohammed Musaddiq
|
|
52
|
+
GitHub : https://github.com/mallikmusaddiq1/nglstrike
|
|
53
|
+
Email : mallikmusaddiq1@gmail.com
|
|
54
|
+
|
|
55
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
56
|
+
LEGAL & ETHICAL NOTICE:
|
|
57
|
+
This tool is intended strictly for educational and personal experimentation.
|
|
58
|
+
|
|
59
|
+
It was created to promote thoughtful, uplifting, and respectful anonymous communication.
|
|
60
|
+
Do NOT use this tool to spam, harass, or disturb anyone in any form.
|
|
61
|
+
|
|
62
|
+
Misuse may violate NGL's Terms of Service and lead to penalties or bans.
|
|
63
|
+
You alone are responsible for how you use this tool.
|
|
64
|
+
|
|
65
|
+
Use it wisely โ and help keep digital spaces kind, safe, and human.
|
|
66
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
# ========== LOAD MESSAGES ==========
|
|
70
|
+
def load_messages_from_file(file_path):
|
|
71
|
+
path = Path(file_path)
|
|
72
|
+
if path.suffix.lower() != ".txt":
|
|
73
|
+
sys.stderr.write(f"[ERROR] Only .txt files are supported. You provided: {path.suffix}\n")
|
|
74
|
+
sys.exit(1)
|
|
75
|
+
if not path.exists():
|
|
76
|
+
sys.stderr.write(f"[ERROR] File not found: {file_path}\n")
|
|
77
|
+
sys.exit(1)
|
|
78
|
+
if not path.is_file():
|
|
79
|
+
sys.stderr.write(f"[ERROR] Path is not a file: {file_path}\n")
|
|
80
|
+
sys.exit(1)
|
|
81
|
+
try:
|
|
82
|
+
with open(path, "r", encoding="utf-8") as f:
|
|
83
|
+
messages = [line.strip() for line in f if line.strip()]
|
|
84
|
+
if not messages:
|
|
85
|
+
sys.stderr.write("[ERROR] Message file is empty.\n")
|
|
86
|
+
sys.exit(1)
|
|
87
|
+
return messages
|
|
88
|
+
except Exception as e:
|
|
89
|
+
sys.stderr.write(f"[ERROR] Failed to read messages from file: {e}\n")
|
|
90
|
+
sys.exit(1)
|
|
91
|
+
|
|
92
|
+
def is_offensive(message):
|
|
93
|
+
lowered = message.lower()
|
|
94
|
+
return any(bad_word in lowered for bad_word in OFFENSIVE_WORDS)
|
|
95
|
+
|
|
96
|
+
# ========== SEND MESSAGE ==========
|
|
97
|
+
def send_message(username, message, dry_run=False, counter=None, device_id="termux-nglstrike"):
|
|
98
|
+
if dry_run:
|
|
99
|
+
prefix = f"[DRY-RUN] #{counter} โ " if counter else "[DRY-RUN] โ "
|
|
100
|
+
print(f"{prefix}{message}")
|
|
101
|
+
return True
|
|
102
|
+
|
|
103
|
+
url = "https://ngl.link/api/submit"
|
|
104
|
+
payload = {
|
|
105
|
+
"username": username,
|
|
106
|
+
"question": message,
|
|
107
|
+
"deviceId": device_id
|
|
108
|
+
}
|
|
109
|
+
headers = {
|
|
110
|
+
"Content-Type": "application/x-www-form-urlencoded"
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
try:
|
|
114
|
+
response = requests.post(url, data=payload, headers=headers)
|
|
115
|
+
if response.status_code == 200:
|
|
116
|
+
print(f"[SENT] {message}")
|
|
117
|
+
return True
|
|
118
|
+
elif response.status_code == 404:
|
|
119
|
+
sys.stderr.write(f"[ERROR] Username does not exist on NGL (404 Not Found): @{username}\n")
|
|
120
|
+
sys.exit(1)
|
|
121
|
+
else:
|
|
122
|
+
print(f"[FAILED] HTTP {response.status_code} โ {message}")
|
|
123
|
+
return False
|
|
124
|
+
except Exception as e:
|
|
125
|
+
sys.stderr.write(f"[ERROR] Network error: {e}\n")
|
|
126
|
+
return False
|
|
127
|
+
|
|
128
|
+
# ========== MAIN ==========
|
|
129
|
+
def main():
|
|
130
|
+
parser = argparse.ArgumentParser(
|
|
131
|
+
prog="nglstrike",
|
|
132
|
+
description="""\
|
|
133
|
+
nglstrike - Anonymous Auto-Sender for NGL
|
|
134
|
+
Version: 1.0.0
|
|
135
|
+
|
|
136
|
+
USAGE EXAMPLES:
|
|
137
|
+
nglstrike -u your_username -m "Stay strong!"
|
|
138
|
+
nglstrike -u your_username -m-path messages.txt --limit 10 -i 15
|
|
139
|
+
|
|
140
|
+
MESSAGE MODES:
|
|
141
|
+
-m, --message Send a single repeated message
|
|
142
|
+
-m-path, --message-path
|
|
143
|
+
Load multiple messages from a .txt file
|
|
144
|
+
(One per line. Empty lines ignored.)
|
|
145
|
+
|
|
146
|
+
OPTIONS:
|
|
147
|
+
-u, --username Required. Your NGL username (no link)
|
|
148
|
+
-i, --interval Interval between messages in seconds [default: 60]
|
|
149
|
+
--limit Stop after sending N messages
|
|
150
|
+
--dry-run Preview messages without sending
|
|
151
|
+
--shuffle Send each message once in random order (no repeats)
|
|
152
|
+
-v, --version Show version and legal notice
|
|
153
|
+
-h, --help Show this help message and exit
|
|
154
|
+
|
|
155
|
+
EXAMPLE messages.txt:
|
|
156
|
+
You're doing great.
|
|
157
|
+
Someone out there believes in you.
|
|
158
|
+
Keep pushing. You're almost there.
|
|
159
|
+
The best is yet to come.
|
|
160
|
+
|
|
161
|
+
NOTES:
|
|
162
|
+
- Only plain .txt files are supported for --message-path.
|
|
163
|
+
- --limit restricts total messages; --dry-run disables actual sending.
|
|
164
|
+
- With --shuffle, each message is sent only once until exhausted.
|
|
165
|
+
|
|
166
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
167
|
+
Created by Mallik Mohammed Musaddiq
|
|
168
|
+
GitHub: https://github.com/mallikmusaddiq1/nglstrike
|
|
169
|
+
Email : mallikmusaddiq1@gmail.com
|
|
170
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
171
|
+
""",
|
|
172
|
+
formatter_class=argparse.RawTextHelpFormatter
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
parser.add_argument("-u", "--username", required=True, help="Your NGL username (no URL)")
|
|
176
|
+
group = parser.add_mutually_exclusive_group(required=True)
|
|
177
|
+
group.add_argument("-m", "--message", help="Single message to send")
|
|
178
|
+
group.add_argument("-m-path", "--message-path", help="Path to .txt file containing messages (1 per line)")
|
|
179
|
+
parser.add_argument("-i", "--interval", default="60", help="Delay between messages in seconds (default: 60)")
|
|
180
|
+
parser.add_argument("--limit", type=int, help="Limit number of messages to send, then exit")
|
|
181
|
+
parser.add_argument("--dry-run", action="store_true", help="Print messages instead of sending")
|
|
182
|
+
parser.add_argument("--shuffle", action="store_true", help="Send each message once in shuffled order (no repeats)")
|
|
183
|
+
parser.add_argument("-v", "--version", action="version", version=LEGAL_NOTICE)
|
|
184
|
+
|
|
185
|
+
args = parser.parse_args()
|
|
186
|
+
try:
|
|
187
|
+
interval = int(args.interval)
|
|
188
|
+
if interval < 1:
|
|
189
|
+
raise ValueError
|
|
190
|
+
except ValueError:
|
|
191
|
+
sys.stderr.write("[ERROR] Use positive integers only: -i/--interval 5, 10, 60 etc.\n")
|
|
192
|
+
sys.exit(1)
|
|
193
|
+
|
|
194
|
+
if args.limit is not None and args.limit < 1:
|
|
195
|
+
sys.stderr.write("[ERROR] Limit must be at least 1.\n")
|
|
196
|
+
sys.exit(1)
|
|
197
|
+
|
|
198
|
+
if args.message:
|
|
199
|
+
messages = [args.message.strip()]
|
|
200
|
+
if args.shuffle:
|
|
201
|
+
print("[WARNING] --shuffle has no effect when using a single message. Ignoring it.")
|
|
202
|
+
args.shuffle = False
|
|
203
|
+
elif args.message_path:
|
|
204
|
+
messages = load_messages_from_file(args.message_path)
|
|
205
|
+
if args.shuffle:
|
|
206
|
+
random.shuffle(messages)
|
|
207
|
+
else:
|
|
208
|
+
sys.stderr.write("[ERROR] Either --message or --message-path must be provided.\n")
|
|
209
|
+
sys.exit(1)
|
|
210
|
+
if all(is_offensive(msg) for msg in messages):
|
|
211
|
+
sys.stderr.write("[ERROR] All messages are offensive. Exiting.\n")
|
|
212
|
+
sys.exit(1)
|
|
213
|
+
|
|
214
|
+
print(f"[INFO] Starting nglstrike on @{args.username} every {interval}s.")
|
|
215
|
+
print("[INFO] Press CTRL+C to exit.")
|
|
216
|
+
if args.dry_run:
|
|
217
|
+
print("[INFO] Dry-run mode: No messages will actually be sent.")
|
|
218
|
+
if args.shuffle:
|
|
219
|
+
print("[INFO] Shuffle mode enabled: Messages will not repeat.")
|
|
220
|
+
|
|
221
|
+
if args.dry_run and args.limit:
|
|
222
|
+
print(f"\n[DRY-RUN] Planned Message Order (Limit: {args.limit}):\n")
|
|
223
|
+
preview = messages[:args.limit] if args.shuffle else [random.choice(messages) for _ in range(args.limit)]
|
|
224
|
+
for i, msg in enumerate(preview, 1):
|
|
225
|
+
print(f" #{i} โ {msg}")
|
|
226
|
+
print(f"\n[DRY-RUN] {len(preview)} messages would be sent to @{args.username}, interval: {interval}s\n")
|
|
227
|
+
return
|
|
228
|
+
elif args.dry_run and args.message:
|
|
229
|
+
print(f"\n[DRY-RUN] Would repeatedly send:\n โ {messages[0]}\n")
|
|
230
|
+
return
|
|
231
|
+
|
|
232
|
+
count = 0
|
|
233
|
+
index = 0
|
|
234
|
+
sent = 0
|
|
235
|
+
skipped = 0
|
|
236
|
+
failed = 0
|
|
237
|
+
start_time = datetime.now()
|
|
238
|
+
print(f"[INFO] Started at: {start_time.strftime('%H:%M:%S')}")
|
|
239
|
+
|
|
240
|
+
try:
|
|
241
|
+
while True:
|
|
242
|
+
if args.shuffle:
|
|
243
|
+
if index >= len(messages):
|
|
244
|
+
print("[INFO] All messages sent (shuffled list exhausted). Exiting.")
|
|
245
|
+
break
|
|
246
|
+
message = messages[index]
|
|
247
|
+
index += 1
|
|
248
|
+
else:
|
|
249
|
+
message = random.choice(messages)
|
|
250
|
+
|
|
251
|
+
if is_offensive(message):
|
|
252
|
+
print(f"[SKIPPED] Offensive content detected โ {message}")
|
|
253
|
+
skipped += 1
|
|
254
|
+
else:
|
|
255
|
+
result = send_message(args.username, message, dry_run=args.dry_run, counter=count + 1)
|
|
256
|
+
if result:
|
|
257
|
+
sent += 1
|
|
258
|
+
else:
|
|
259
|
+
failed += 1
|
|
260
|
+
|
|
261
|
+
count += 1 # โ Always increment once per loop
|
|
262
|
+
|
|
263
|
+
if args.limit and count >= args.limit:
|
|
264
|
+
print(f"[INFO] Limit of {args.limit} messages reached. Exiting.")
|
|
265
|
+
break
|
|
266
|
+
|
|
267
|
+
remaining = (args.limit - count) if args.limit else None
|
|
268
|
+
if remaining:
|
|
269
|
+
eta = datetime.now() + timedelta(seconds=interval * remaining)
|
|
270
|
+
print(f"[ETA] {remaining} remaining. Estimated finish: {eta.strftime('%H:%M:%S')}")
|
|
271
|
+
|
|
272
|
+
time.sleep(interval)
|
|
273
|
+
|
|
274
|
+
except KeyboardInterrupt:
|
|
275
|
+
print("\n[INFO] Interrupted. Exiting.")
|
|
276
|
+
sys.exit(0)
|
|
277
|
+
|
|
278
|
+
# ======= FINAL SUMMARY ========
|
|
279
|
+
end_time = datetime.now()
|
|
280
|
+
duration = end_time - start_time
|
|
281
|
+
print("\n[SUMMARY]")
|
|
282
|
+
print(f" Sent : {sent}")
|
|
283
|
+
print(f" Failed : {failed}")
|
|
284
|
+
print(f" Skipped : {skipped}")
|
|
285
|
+
print(f" Duration : {str(duration).split('.')[0]}")
|
|
286
|
+
print(f" Finished : {end_time.strftime('%H:%M:%S')}")
|
|
287
|
+
|
|
288
|
+
if __name__ == "__main__":
|
|
289
|
+
main()
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: nglstrike
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Anonymous Auto-Sender for NGL
|
|
5
|
+
Author: Mallik Mohammed Musaddiq
|
|
6
|
+
Author-email: Mallik Mohammed Musaddiq <mallikmusaddiq1@gmail.com>
|
|
7
|
+
License: MIT
|
|
8
|
+
Project-URL: Homepage, https://github.com/mallikmusaddiq1/nglstrike
|
|
9
|
+
Requires-Python: >=3.6
|
|
10
|
+
Description-Content-Type: text/markdown
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Requires-Dist: requests
|
|
13
|
+
Dynamic: author
|
|
14
|
+
Dynamic: license-file
|
|
15
|
+
Dynamic: requires-python
|
|
16
|
+
|
|
17
|
+
# nglstrike
|
|
18
|
+
|
|
19
|
+
Anonymous Auto-Sender for NGL โ because sometimes, kindness needs a little automation.
|
|
20
|
+
|
|
21
|
+
## ๐ Overview
|
|
22
|
+
|
|
23
|
+
`nglstrike` is a professional-grade command-line tool that automates the process of sending anonymous messages via [ngl.link](https://ngl.link). Built for thoughtful experimentation and personal use, it supports single-message repetition or bulk message delivery from `.txt` files โ with built-in delay, dry-run simulation, offensive word filtering, and message shuffling.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## โจ Features
|
|
28
|
+
|
|
29
|
+
* โ
**Send anonymous messages to any NGL username**
|
|
30
|
+
* ๐ **Load messages from a `.txt` file**
|
|
31
|
+
* โฑ๏ธ **Custom interval delay between messages**
|
|
32
|
+
* ๐ **Single message repeat or random pick from message pool**
|
|
33
|
+
* ๐ **Shuffle mode (no message repeats until exhausted)**
|
|
34
|
+
* ๐งช **Dry-run mode** to preview message flow before actually sending
|
|
35
|
+
* ๐ซ **Built-in offensive language filter**
|
|
36
|
+
* ๐ **Common argument mistake detection**
|
|
37
|
+
* ๐ **Clean logging + ETA predictions**
|
|
38
|
+
* ๐ **Auto-generated summary after run**
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## ๐ Installation
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
Option 1 - Clone the repo:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
git clone https://github.com/mallikmusaddiq1/nglstrike.git
|
|
50
|
+
cd nglstrike
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Make it executable:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
chmod +x nglstrike.py
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Run with Python 3:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
nglstrike.py [options]
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
Option 2: Pip installation.
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
pip install nglstrike
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## ๐ง Usage Examples
|
|
74
|
+
|
|
75
|
+
### Send a single message repeatedly:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
nglstrike.py -u your_username -m "Stay strong!"
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Send multiple messages from a file:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
nglstrike.py -u your_username -m-path messages.txt --limit 10 -i 30
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Preview sending order (no actual messages):
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
nglstrike.py -u your_username -m-path messages.txt --dry-run --limit 5
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Shuffle messages (each sent only once):
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
nglstrike.py -u your_username -m-path messages.txt --shuffle
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## ๐ Format for `messages.txt`
|
|
102
|
+
|
|
103
|
+
Plaintext file with one message per line. Example:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
You're amazing.
|
|
107
|
+
Keep going โ you're close.
|
|
108
|
+
Someone out there believes in you.
|
|
109
|
+
The best is yet to come.
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## โ๏ธ Arguments
|
|
115
|
+
|
|
116
|
+
| Argument | Description |
|
|
117
|
+
| --------------------------- | ------------------------------------------------- |
|
|
118
|
+
| `-u`, `--username` | **(Required)** Your NGL username (no link) |
|
|
119
|
+
| `-m`, `--message` | Send a single repeated message |
|
|
120
|
+
| `-m-path`, `--message-path` | Path to `.txt` file with multiple messages |
|
|
121
|
+
| `-i`, `--interval` | Delay between messages in seconds (default: `60`) |
|
|
122
|
+
| `--limit` | Stop after sending `N` messages |
|
|
123
|
+
| `--dry-run` | Preview messages instead of sending |
|
|
124
|
+
| `--shuffle` | Send each message only once in random order |
|
|
125
|
+
| `-v`, `--version` | Show version and legal info |
|
|
126
|
+
| `-h`, `--help` | Show help message |
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## ๐งผ Offensive Word Filter
|
|
131
|
+
|
|
132
|
+
Before sending, `nglstrike` checks each message for offensive content using a predefined blacklist of strictly abusive terms. If **all messages** are flagged as offensive, the tool exits.
|
|
133
|
+
|
|
134
|
+
Use responsibly.
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## ๐ Legal & Ethical Notice
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
This tool is intended strictly for educational and personal experimentation.
|
|
142
|
+
Do NOT use this tool to spam, harass, or disturb anyone.
|
|
143
|
+
Misuse may violate NGL's Terms of Service.
|
|
144
|
+
You alone are responsible for your actions.
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Keep digital spaces kind, safe, and human.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## ๐ค Author
|
|
152
|
+
|
|
153
|
+
**Mallik Mohammed Musaddiq**
|
|
154
|
+
GitHub: [@mallikmusaddiq1](https://github.com/mallikmusaddiq1)
|
|
155
|
+
Email: [mallikmusaddiq1@gmail.com](mailto:mallikmusaddiq1@gmail.com)
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## ๐ License
|
|
160
|
+
|
|
161
|
+
This project is licensed under the MIT License. See `LICENSE` for more details.
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## โค๏ธ Support
|
|
166
|
+
|
|
167
|
+
If this project helped you, feel free to โญ the repo or contribute.
|
|
168
|
+
Spread kindness. Automate it โ ethically.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
setup.py
|
|
5
|
+
nglstrike/__init__.py
|
|
6
|
+
nglstrike/__main__.py
|
|
7
|
+
nglstrike/main.py
|
|
8
|
+
nglstrike.egg-info/PKG-INFO
|
|
9
|
+
nglstrike.egg-info/SOURCES.txt
|
|
10
|
+
nglstrike.egg-info/dependency_links.txt
|
|
11
|
+
nglstrike.egg-info/entry_points.txt
|
|
12
|
+
nglstrike.egg-info/requires.txt
|
|
13
|
+
nglstrike.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
requests
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "nglstrike"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Anonymous Auto-Sender for NGL"
|
|
9
|
+
authors = [
|
|
10
|
+
{ name="Mallik Mohammed Musaddiq", email="mallikmusaddiq1@gmail.com" }
|
|
11
|
+
]
|
|
12
|
+
readme = "README.md"
|
|
13
|
+
requires-python = ">=3.6"
|
|
14
|
+
dependencies = [
|
|
15
|
+
"requests"
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
[project.license]
|
|
19
|
+
text = "MIT"
|
|
20
|
+
|
|
21
|
+
[project.urls]
|
|
22
|
+
Homepage = "https://github.com/mallikmusaddiq1/nglstrike"
|
|
23
|
+
|
|
24
|
+
[project.scripts]
|
|
25
|
+
nglstrike = "nglstrike.main:main"
|
|
26
|
+
|
|
27
|
+
[tool.setuptools.packages.find]
|
|
28
|
+
where = ["."]
|
nglstrike-1.0.0/setup.py
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from setuptools import setup, find_packages
|
|
2
|
+
|
|
3
|
+
setup(
|
|
4
|
+
name="nglstrike",
|
|
5
|
+
version="1.0.0",
|
|
6
|
+
author="Mallik Mohammed Musaddiq",
|
|
7
|
+
author_email="mallikmusaddiq1@gmail.com",
|
|
8
|
+
description="Anonymous Auto-Sender for NGL",
|
|
9
|
+
long_description=open("README.md", encoding="utf-8").read(),
|
|
10
|
+
long_description_content_type="text/markdown",
|
|
11
|
+
packages=find_packages(where="."),
|
|
12
|
+
install_requires=[
|
|
13
|
+
"requests"
|
|
14
|
+
],
|
|
15
|
+
entry_points={
|
|
16
|
+
"console_scripts": [
|
|
17
|
+
"nglstrike = nglstrike.main:main"
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
classifiers=[
|
|
21
|
+
"Programming Language :: Python :: 3",
|
|
22
|
+
"License :: OSI Approved :: MIT License",
|
|
23
|
+
"Operating System :: OS Independent"
|
|
24
|
+
],
|
|
25
|
+
python_requires='>=3.6',
|
|
26
|
+
)
|