├── 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 | --------------------------------------------------------------------------------