├── TelegramExtract.json
├── README.md
└── TelegramExtract.py
/TelegramExtract.json:
--------------------------------------------------------------------------------
1 | {
2 | "grupo.id": "",
3 | "Membros Filtrados": [],
4 | "Sistema Anti-Spam": {
5 | "aguardar(segundos) a cada adicao de membro": [60, 180],
6 | "aguardar(segundos) por peerflooderror": [100, 1000],
7 | "limide de adicao de membros por conta": 20,
8 | "periodo de horas(em segundos) que contas ira hibernar após atingir limites de adicao de membros": 28800
9 | },
10 | "Telegram Accounts": {
11 |
12 | }
13 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## Extrair/Adicionar Membros no Telegram com Python
2 | Este projeto visa automatiza o processo de Extrair/Adicionar membros em grupos do Telegram de forma 100% automática. Usando o módulo [Telethon](https://github.com/LonamiWebs/Telethon) do [Python](https://www.python.org/), é possível realizar essa tarefa de forma totalmente automatizada.
3 |
4 |
5 | FUNCIONALIDADES:
6 |
• Conecta em várias contas do Telegram(Tratando errors de FloodError, FloodWaitError, PhoneNumberBannedError)
7 |
• Extrai Membros de grupo do Telegra por completo e em ordem alfabetica de A...Z(consegue extrair de 70% a 98% dos membros)
8 |
• Adiciona Membros de forma 100% automática no seu grupo do Telegram(Tratando errors de FloodError, FloodWaitError, PeerFloodError, UserPrivacyRestrictedError...)
9 |
• Sistema Anti-Spam, Bot aguarda de 60/180s para adicionar cada membro, e adiciona apenas 20 membros por vez e troca de conta, depois de adicionar 20 membros com cada conta, ele aguarda algumas horas e repete todo o processo...(OBS: Você pode moficiar as configurações do Sistema Anti-Spam)
10 |
11 |
12 |
13 | ### 1. Instalando Dependência(Telethon & Colorama)
14 | Para usar este projeto, é necessário ter o [Python 3.6](https://www.python.org/downloads/release/python-360/) ou superior instalado em sua máquina. Além disso, você precisará instalar as seguintes dependências:
15 | ```bash
16 | pip install telethon
17 | pip install colorama
18 | ```
19 |
20 | ### 2. Clonando Repositório
21 | ```bash
22 | git clone https://github.com/davideduardotech/TelegramExtract.git
23 | cd pyTelegram
24 | ```
25 |
26 | ### 3. Configurando
27 | Antes de usar este projeto, você precisará obter as chaves de API's das suas contas do Telegram(API_ID,API_HASH) Para fazer isso, siga as instruções em https://core.telegram.org/api/obtaining_api_id.
28 |
29 | Em seguida, Adicione suas contas editando o arquivo TelegramExtract.json, adicionando suas contas dentro da chave "Telegram Account" com as suas informações de PHONE.session, PHONE, API_ID e API_HASH
30 |
31 | EXEMPLO:
32 | ```bash
33 | {
34 | "Telegram Accounts":{
35 | "+5581993762632.session:{
36 | "phone":+5581993762632,
37 | "api_id":767623,
38 | "api_hash": "d93449f3e5b4bc1fb096a29c2fe7cb71b"
39 | },
40 | ...
41 | }
42 | }
43 | ```
44 |
45 | nas configurações do "Sitema Anti-Spam" você pode alterar e personalizar o tempo estre os requests como você quiser quiser para evitar bloqueios:
46 |
• "aguardar(segundos) a cada adicao de membro"
47 |
• "aguardar(segundos) por peerflooderror"
48 |
• "limide de adicao de membros por conta"
49 |
• "periodo de horas(em segundos) que contas ira hibernar após atingir limites de adicao de membros"
50 |
51 | EXEMPLO PADRÃO DO ANTI-SPAM:
52 | ```bash
53 | {
54 | ...
55 | "Sistema Anti-Spam": {
56 | "aguardar(segundos) a cada adicao de membro": [60, 180],
57 | "aguardar(segundos) por peerflooderror": [100, 1000],
58 | "limide de adicao de membros por conta": 20,
59 | "periodo de horas(em segundos) que contas ira hibernar após atingir limites de adicao de membros": 28800
60 | },
61 | ...
62 | }
63 | ```
64 |
65 | ### 4. Pronto, agora basta utilizar
66 | Para usar este projeto, basta executar o script TelegramExtract.py, Por exemplo:
67 | ```bash
68 | python TelegramExtract.py
69 | ```
70 |
71 | ### 👨💻 Contribuição
72 | Se você deseja contribuir para este projeto, basta criar um pull request com suas alterações. Todas as contribuições serão analisadas e, se aceitas, serão mescladas com o branch principal.
73 |
74 |
75 |
76 |
77 |
--------------------------------------------------------------------------------
/TelegramExtract.py:
--------------------------------------------------------------------------------
1 | """
2 | CODDING: Bot(Python) de automação para Extrair/Adicionar membros em grupos do Telegram de forma 100% automática
3 | • DESENVOLVEDOR(GITHUB): https://github.com/davideduardotech
4 | """
5 |
6 | from telethon.sync import TelegramClient
7 | from telethon import functions, types,errors
8 | from telethon.errors import FloodWaitError
9 | from datetime import datetime
10 | import re, sys, time, os
11 | import json
12 | import random
13 | from colorama import Fore, init
14 | init(autoreset=True, convert=True)
15 |
16 |
17 |
18 | """
19 | CODDING: Variaveis
20 | • Variaveis Responsaveis por Controlar/Gerenciar Sistema
21 | """
22 | TOTAL_DE_MEMBROS_ADICIONADO = 0
23 |
24 |
25 |
26 | """
27 | CODDING: TelegramExtract
28 | • Conectar no Telegram com Telethon
29 | • Extrair/Adicionar Membros em Grupos do Telegram
30 | """
31 | class TelegramExtract:
32 | def configuracoes(newConfiguracoes=None):
33 | """
34 | Função responsavel por retornar/atualizar configurações e contas do Telegram do arquivo TelegramExtract.json
35 | """
36 |
37 | #$ CODDING: VARIAVEIS DE MENSAGEM
38 | MENSAGEM_DE_ARQUIVO_DE_CONFIGURACAO_NAO_ENCONTRADO = f'{Fore.RED}[ARQUIVO NÃO ENCONTRADO]{Fore.RESET} Arquivo dependente "TelegramExtract.json" não encontrado, impossivel iniciar realize o download novamente em https://github.com/davideduardotech/TelegramExtract'
39 |
40 | if newConfiguracoes:
41 | try:
42 | with open('TelegramExtract.json', 'w') as f:
43 | #$ Atualizar --> TelegramExtract.json
44 | json.dump(newConfiguracoes, f)
45 | textExtract = open("TelegramExtract.json","r")
46 | textExtract = textExtract.read()
47 | return json.loads(textExtract) #$ Return: {"grupo.id":...,"Membros Filtrados":...,"Telegram Accounts":...}
48 | except Exception as erro:
49 | return False
50 | else:
51 | try:
52 | textExtract = open("TelegramExtract.json","r")
53 | textExtract = textExtract.read()
54 | return json.loads(textExtract) #$ Return: {"grupo.id":...,"Membros Filtrados":...,"Telegram Accounts":...}
55 | except Exception as erro:
56 | print(MENSAGEM_DE_ARQUIVO_DE_CONFIGURACAO_NAO_ENCONTRADO)
57 | TelegramExtract.exit()
58 |
59 | def conectar_em_conta_do_telegram(phone,api_id,api_hash):
60 | """
61 | Função responsavel por conectar na sua conta no Telegram usando as seguintes informações PHONE, API_ID e API_HASH
62 | """
63 |
64 | #$ CODDING: VARIAVEIS DE MENSAGENS
65 | MENSAGEM_DE_CONTA_CONECTADA = f'{Fore.GREEN}[CONTA DO TELEGRAM]{Fore.RESET} Telegram({phone}) Conectado'
66 | MENSAGEM_SENDCODE = f'{Fore.GREEN}[CONTA DO TELEGRAM]{Fore.RESET} Digite seu codigo de confirmação({phone}):'
67 | MENSAGEM_FLOODERROR = f'{Fore.GREEN}[CONTA DO TELEGRAM]{Fore.RESET} FloadError detectado na conta({phone}) para aguardar segundos, impossivel conectar na conta...'
68 | MENSAGEM_ACCOUNT_BANNED = f'{Fore.RED}[CONTA DO TELEGRAM]{Fore.RESET} Conta do Telegram({phone}) Banida'
69 | MENSAGEM_ERROR = f'{Fore.RED}[CONTA DO TELEGRAM]{Fore.RESET} Não foi possivel conectar na conta do Telegram({phone})'
70 |
71 |
72 | try:
73 | client = TelegramClient(phone, api_id,api_hash)
74 | client.connect()
75 |
76 |
77 | if not client.is_user_authorized():
78 | try:
79 | client.send_code_request(phone)
80 | print(MENSAGEM_SENDCODE,end=" ")
81 | client.sign_in(phone, input())
82 |
83 | except errors.FloodError as erro:
84 | numbers = ""
85 | for caracter in erro.args[0]:
86 | if caracter.isdigit():
87 | numbers += caracter
88 | print(MENSAGEM_FLOODERROR.replace("",numbers),end='')
89 | return (False , None)
90 | except errors.PhoneNumberBannedError as erro:
91 | print(MENSAGEM_ACCOUNT_BANNED)
92 | return (False, None)
93 | except Exception as erro:
94 | return (False, None)
95 | if client.is_connected():
96 | print(MENSAGEM_DE_CONTA_CONECTADA)
97 | return (True, client)
98 | else:
99 | print(MENSAGEM_ERROR)
100 | return (False, None)
101 | except errors.FloodError as erro:
102 | numbers = ""
103 | for caracter in erro.args[0]:
104 | if caracter.isdigit():
105 | numbers += caracter
106 | print(MENSAGEM_FLOODERROR.replace("",numbers),end='')
107 | return (False, None)
108 | except Exception as erro:
109 | print(MENSAGEM_ERROR)
110 | return (False,None)
111 | def adicionar_membros(client,grupo,account):
112 | global TOTAL_DE_MEMBROS_ADICIONADO
113 | TelegramExtractJSON = TelegramExtract.configuracoes()
114 | for usuario in TelegramExtractJSON["Membros Filtrados"][:TelegramExtractJSON["Sistema Anti-Spam"]["limide de adicao de membros por conta"]]:
115 | usuario_entity = client.get_input_entity(usuario["username"])
116 | try:
117 | client(functions.channels.InviteToChannelRequest(grupo,[usuario_entity]))
118 | TOTAL_DE_MEMBROS_ADICIONADO += 1
119 | #$ COODDING: Remover Usuario da Lista de Membros Filtrados
120 | try:
121 | TelegramExtractJSON["Membros Filtrados"].remove(usuario)
122 | TelegramExtractJSON = TelegramExtract.configuracoes(newConfiguracoes=TelegramExtractJSON)
123 | except Exception as erro:
124 | print(erro)
125 | print(f"{Fore.GREEN}{account.replace('.session','')}{Fore.RESET} adicionou","{}".format(Fore.GREEN,usuario["username"],Fore.RESET),"no grupo | {}No total, {}".format(Fore.LIGHTBLACK_EX,'Apenas 1 Membro foi Adicionado' if TOTAL_DE_MEMBROS_ADICIONADO == 1 else '{} Membros foram adicionados'.format(TOTAL_DE_MEMBROS_ADICIONADO)))
126 | time.sleep(random.randrange(TelegramExtractJSON["Sistema Anti-Spam"]["aguardar(segundos) a cada adicao de membro"][0], TelegramExtractJSON["Sistema Anti-Spam"]["aguardar(segundos) a cada adicao de membro"][1]))
127 | except errors.FloodWaitError as erro:
128 | numbers = ""
129 | for caracter in erro.args[0]:
130 | if caracter.isdigit():
131 | numbers += caracter
132 | print(f'{Fore.RED}[CONTA DO TELEGRAM {account.replace(".session","")}] FloodWaitError Detectado, aguardando {numbers} segundos para depois continuar')
133 | time.sleep(int(numbers))
134 | except errors.PeerFloodError as erro:
135 | numbers = random.randrange(TelegramExtractJSON["Sistema Anti-Spam"]["aguardar(segundos) por peerflooderror"][0],TelegramExtractJSON["Sistema Anti-Spam"]["aguardar(segundos) por peerflooderror"][1])
136 | print(f'{Fore.RED}[CONTA DO TELEGRAM {account.replace(".session","")}] PeerFloodError Detectado(Erro de Inundação do Telegram), aguardando {numbers} segundos para depois continuar')
137 | time.sleep(numbers)
138 | except errors.UserPrivacyRestrictedError as erro:
139 | #$ COODDING: Remover Usuario da Lista de Membros Filtrados
140 | try:
141 | TelegramExtractJSON["Membros Filtrados"].remove(usuario)
142 | TelegramExtractJSON = TelegramExtract.configuracoes(newConfiguracoes=TelegramExtractJSON)
143 | except Exception as erro:
144 | print(erro)
145 |
146 | print(f'{Fore.RED}[CONTA DO TELEGRAM {account.replace(".session","")}] UserPrivacyRestrictedError Detectado, As configurações de privacidade do usuário({usuario["username"]}) não permitem você adicionar ele(a) a grupos')
147 | time.sleep(random.randrange(TelegramExtractJSON["Sistema Anti-Spam"]["aguardar(segundos) a cada adicao de membro"][0], TelegramExtractJSON["Sistema Anti-Spam"]["aguardar(segundos) a cada adicao de membro"][1]))
148 | except Exception as erro:
149 | try:
150 | TelegramExtractJSON["Membros Filtrados"].remove(usuario)
151 | TelegramExtractJSON = TelegramExtract.configuracoes(newConfiguracoes=TelegramExtractJSON)
152 | except Exception as erro:
153 | print(erro)
154 | print(f'{Fore.RED}[CONTA DO TELEGRAM {account.replace(".session","")}] {erro.args[0]}')
155 | time.sleep(random.randrange(TelegramExtractJSON["Sistema Anti-Spam"]["aguardar(segundos) a cada adicao de membro"][0], TelegramExtractJSON["Sistema Anti-Spam"]["aguardar(segundos) a cada adicao de membro"][1]))
156 |
157 |
158 |
159 | def exit():
160 | """Função responsavel por fechar programa"""
161 | input()
162 | sys.exit()
163 |
164 |
165 | """
166 | CODDING: Variaveis de Mensagens do Sistema
167 | """
168 | MENSAGEM_NENHUM_GRUPO_ESCOLHIDO = f'{Fore.RED}[CONTAS DO TELEGRAM]{Fore.RESET} Nenhuma conta do telegram encontrada, impossivel iniciar...'
169 | MENSAGEM_DE_ESCOLHER_GRUPO_PARA_EXTRAIR_MEMBROS = f'{Fore.GREEN}[CONTA DO TELEGRAM ]{Fore.RESET} escolha um grupo pra extrair membros'
170 | MENSAGEM_DE_ESCOLHA_DE_GRUPO_INVALIDA = f'{Fore.RED}[GRUPO INVÁLIDO]{Fore.RESET} Escolha inválida, não foi possivel selecionar nenhum grupo, tente novamente...'
171 |
172 |
173 |
174 | TelegramExtractJSON = TelegramExtract.configuracoes()
175 | if len(TelegramExtractJSON["Telegram Accounts"]) > 0:
176 | try:
177 | while True:
178 | for index,account in enumerate(TelegramExtractJSON["Telegram Accounts"]):
179 |
180 | phone = TelegramExtractJSON["Telegram Accounts"][account]["phone"]
181 | api_id = TelegramExtractJSON["Telegram Accounts"][account]["api_id"]
182 | api_hash = TelegramExtractJSON["Telegram Accounts"][account]["api_hash"]
183 |
184 | status,client = TelegramExtract.conectar_em_conta_do_telegram(phone,api_id, api_hash)
185 | if status:
186 | if len(TelegramExtractJSON["Membros Filtrados"]) == 0:
187 | while True:
188 | """
189 | CODDING: Extrair Membros de Grupo do Telegram
190 | """
191 | try:
192 | Groups = []
193 | contagem_dos_grupos = 0
194 |
195 | print(MENSAGEM_DE_ESCOLHER_GRUPO_PARA_EXTRAIR_MEMBROS.replace("", phone))
196 | for dialog in client.get_dialogs():
197 | if dialog.is_group and dialog.is_channel:
198 | contagem_dos_grupos +=1
199 | Groups.append(dialog)
200 | if dialog.entity.admin_rights != None:
201 | print(' {}. {} {}{}({} participantes, {}admin{})'.format(contagem_dos_grupos, dialog.name, dialog.id,Fore.LIGHTBLACK_EX ,dialog.entity.participants_count,Fore.GREEN,Fore.LIGHTBLACK_EX))
202 | else:
203 | print(' {}. {} {}{}({} participantes){}'.format(contagem_dos_grupos, dialog.name, dialog.id, Fore.LIGHTBLACK_EX ,dialog.entity.participants_count,Fore.RESET))
204 |
205 |
206 | index = int(input(' digite sua escolha: '))
207 | grupo = Groups[index-1]
208 | break
209 | except Exception as erro:
210 | print(MENSAGEM_DE_ESCOLHA_DE_GRUPO_INVALIDA)
211 |
212 |
213 |
214 |
215 |
216 |
217 | """
218 | CODDING: Extraindo membros
219 | """
220 | print('\n\n Grupo escolhido: {}{}'.format(Fore.GREEN, grupo.name))
221 | alfabeto = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
222 | MembrosFiltrados = []
223 | NumerosFiltrados = []
224 |
225 | for key in alfabeto:
226 | offset = 0
227 | limit = 100
228 | while True:
229 | participantes = client(functions.channels.GetParticipantsRequest(
230 | grupo,
231 | types.ChannelParticipantsSearch(key),
232 | offset,
233 | limit,
234 | hash=0))
235 |
236 |
237 | if not participantes.users:
238 | print(' Usuarios filtrados por Search({}): {}'.format(key,offset))
239 | break
240 |
241 | for user in participantes.users:
242 | try:
243 | if re.findall(r"\b[a-zA-Z]", user.first_name)[0].lower() == key:
244 | if user.username != None:
245 | MembrosFiltrados.append({'username':user.username,'id':user.id,'access_hash':user.access_hash})
246 | if user.phone != None:
247 | NumerosFiltrados.append(user.phone)
248 | except:
249 | pass
250 |
251 |
252 | offset += len(participantes.users)
253 |
254 |
255 | """
256 | CODDING: criando arquivos com numeros filtrados
257 | """
258 | print(' {}{} membros filtrados do grupo'.format(Fore.GREEN,len(MembrosFiltrados),grupo.name))
259 |
260 | TelegramExtractJSON["Membros Filtrados"] = MembrosFiltrados
261 | TelegramExtractJSON = TelegramExtract.configuracoes(newConfiguracoes=TelegramExtractJSON)
262 |
263 | else:
264 | pass
265 |
266 | """
267 | CODDING: Adicionar Membros de Grupo do Telegram
268 | """
269 |
270 | Groups = []
271 | GroupsADM = []
272 | contagem_dos_grupos = 0
273 |
274 | TelegramExtractJSON = TelegramExtract.configuracoes()
275 |
276 | print(f'{Fore.GREEN}[MEMBROS]{Fore.RESET} {len(TelegramExtractJSON["Membros Filtrados"])} Membros filtrados prontos para serem adicionados ao seu grupo')
277 |
278 | while True:
279 | try:
280 | print('{}[CONTA DO TELEGRAM {}]{} escolha um grupo para adicionar membros'.format(Fore.GREEN,TelegramExtractJSON["Telegram Accounts"][account]['phone'], Fore.RESET))
281 | for dialog in client.get_dialogs():
282 | Groups.append(dialog)
283 | contagem_dos_grupos +=1
284 | if dialog.is_group and dialog.is_channel:
285 | if dialog.entity.admin_rights != None:
286 | print(' {}. {} {}{}({} participantes, {}admin{})'.format(contagem_dos_grupos, dialog.name, dialog.id,Fore.LIGHTBLACK_EX ,dialog.entity.participants_count,Fore.GREEN,Fore.LIGHTBLACK_EX))
287 | else:
288 | print(' {}. {} {}{}({} participantes){}'.format(contagem_dos_grupos, dialog.name, dialog.id, Fore.LIGHTBLACK_EX ,dialog.entity.participants_count,Fore.RESET))
289 |
290 |
291 |
292 | index = int(input(' digite sua escolha: '))
293 | grupo = Groups[index-1]
294 | break
295 | except Exception as erro:
296 | print(MENSAGEM_DE_ESCOLHA_DE_GRUPO_INVALIDA)
297 |
298 | TelegramExtractJSON["grupo.id"] = str(grupo.id)
299 | TelegramExtractJSON = TelegramExtract.configuracoes(newConfiguracoes=TelegramExtractJSON)
300 | print(f' grupo escolhido: {Fore.GREEN}{grupo.name}')
301 |
302 | TelegramExtract.adicionar_membros(client, grupo,account)
303 |
304 |
305 |
306 | else:
307 | pass
308 |
309 | print(f'{Fore.GREEN}[SISTEMA ANTI-SPAM]{Fore.RESET} Limite de adicição de Membros Atingido, '+'aguardando {} segundos para adicionar {} membros por conta novamente'.format(TelegramExtractJSON["Sistema Anti-Spam"]["periodo de horas(em segundos) que contas ira hibernar após atingir limites de adicao de membros"],TelegramExtractJSON["Sistema Anti-Spam"]["limide de adicao de membros por conta"]))
310 | time.sleep(TelegramExtractJSON["Sistema Anti-Spam"]["periodo de horas(em segundos) que contas ira hibernar após atingir limites de adicao de membros"])
311 | except Exception as erro:
312 | print(f'd{Fore.RED}[*] Error: {erro}')
313 | TelegramExtract.exit()
314 | else:
315 | print(MENSAGEM_NENHUM_GRUPO_ESCOLHIDO)
316 | TelegramExtract.exit()
317 |
318 |
319 |
--------------------------------------------------------------------------------