├── +923089442289.session ├── +923431441319.session ├── .gitignore ├── .vscode └── settings.json ├── SessionFiles ├── +923089442289.session ├── +923431441319.session ├── data.bak ├── data.dat └── data.dir ├── __pycache__ ├── inviter.cpython-38.pyc └── memberScraper.cpython-38.pyc ├── final.zip ├── inviter.py ├── main.py ├── memberScraper.py ├── message.txt └── sample-conf.ini /+923089442289.session: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runetech0/telegramMembersInvite/0c4f863537b02c47ab99ff8ab31f643724f9edcb/+923089442289.session -------------------------------------------------------------------------------- /+923431441319.session: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runetech0/telegramMembersInvite/0c4f863537b02c47ab99ff8ab31f643724f9edcb/+923431441319.session -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | conf.ini 2 | tests* 3 | .vscode 4 | __py* 5 | MembersLists/* 6 | 7 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.pythonPath": "/home/virchual/anaconda3/envs/telethon/bin/python" 3 | } -------------------------------------------------------------------------------- /SessionFiles/+923089442289.session: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runetech0/telegramMembersInvite/0c4f863537b02c47ab99ff8ab31f643724f9edcb/SessionFiles/+923089442289.session -------------------------------------------------------------------------------- /SessionFiles/+923431441319.session: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runetech0/telegramMembersInvite/0c4f863537b02c47ab99ff8ab31f643724f9edcb/SessionFiles/+923431441319.session -------------------------------------------------------------------------------- /SessionFiles/data.bak: -------------------------------------------------------------------------------- 1 | 'i', (0, 5) 2 | 'Panacloud Bootcamp', (512, 5) 3 | 'lastIndex', (1024, 5) 4 | 'count', (1536, 5) 5 | -------------------------------------------------------------------------------- /SessionFiles/data.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runetech0/telegramMembersInvite/0c4f863537b02c47ab99ff8ab31f643724f9edcb/SessionFiles/data.dat -------------------------------------------------------------------------------- /SessionFiles/data.dir: -------------------------------------------------------------------------------- 1 | 'i', (0, 5) 2 | 'Panacloud Bootcamp', (512, 5) 3 | 'lastIndex', (1024, 5) 4 | 'count', (1536, 5) 5 | -------------------------------------------------------------------------------- /__pycache__/inviter.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runetech0/telegramMembersInvite/0c4f863537b02c47ab99ff8ab31f643724f9edcb/__pycache__/inviter.cpython-38.pyc -------------------------------------------------------------------------------- /__pycache__/memberScraper.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runetech0/telegramMembersInvite/0c4f863537b02c47ab99ff8ab31f643724f9edcb/__pycache__/memberScraper.cpython-38.pyc -------------------------------------------------------------------------------- /final.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runetech0/telegramMembersInvite/0c4f863537b02c47ab99ff8ab31f643724f9edcb/final.zip -------------------------------------------------------------------------------- /inviter.py: -------------------------------------------------------------------------------- 1 | import csv 2 | import time 3 | from telethon import utils 4 | 5 | 6 | class Inviter: 7 | def __init__(self, client): 8 | self.client = client 9 | 10 | 11 | async def invite(self, csv_list): 12 | users = [] 13 | with open(csv_list, encoding='UTF-8') as f: 14 | rows = csv.reader(f,delimiter=",",lineterminator="\n") 15 | next(rows, None) 16 | for row in rows: 17 | user = {} 18 | user['seq_no'] = row[0] 19 | user['username'] = row[1] 20 | user['id'] = int(row[2]) 21 | user['access_hash'] = int(row[3]) 22 | user['name'] = row[4] 23 | users.append(user) 24 | en = await self.client.get_entity(users[190]['id']) 25 | await en.send_message('Hello') -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from telethon.sync import TelegramClient 2 | from configparser import ConfigParser 3 | from memberScraper import Scraper 4 | from threading import Lock 5 | import asyncio 6 | import time 7 | from random import randrange 8 | 9 | loop = asyncio.get_event_loop() 10 | config = ConfigParser() 11 | config.read('conf.ini') 12 | 13 | 14 | async def invite(k, v, lock): 15 | PHONE = config[k]['PHONE_NUMBER_IN_INTERNATIONAL_FORMAT'] 16 | API_ID = config[k]['API_ID'] 17 | API_HASH = config[k]["API_HASH"] 18 | target_group_name = config['CONF']['TARGET_GROUP_NAME'] 19 | cl = TelegramClient(PHONE, API_ID, API_HASH) 20 | await cl.connect() 21 | if not await cl.is_user_authorized(): 22 | await cl.send_code_request(PHONE) 23 | await cl.sign_in(PHONE, input(f'Enter login/verificatoin code for {PHONE} : ')) 24 | scraper = Scraper(cl, lock, id=API_ID) 25 | await scraper.scrape(target_group_name) 26 | 27 | 28 | lock = Lock() 29 | for k, v in config.items(): 30 | if k == 'DEFAULT' or k == 'CONF': 31 | continue 32 | loop.create_task(invite(k, v, lock)) 33 | time.sleep(3) 34 | 35 | 36 | async def keepRunning(): 37 | while True: 38 | await asyncio.sleep(10000) 39 | 40 | loop.run_forever() 41 | -------------------------------------------------------------------------------- /memberScraper.py: -------------------------------------------------------------------------------- 1 | from telethon.sync import TelegramClient 2 | from telethon.tl.functions.messages import GetDialogsRequest 3 | from telethon import errors 4 | from telethon.tl.types import InputPeerEmpty 5 | import csv 6 | import os 7 | from asyncio import sleep 8 | import random 9 | import time 10 | import sys 11 | from datetime import datetime 12 | import shelve 13 | 14 | # Test 15 | 16 | from telethon.tl.functions.channels import GetParticipantsRequest 17 | from telethon.tl.types import ChannelParticipantsSearch 18 | 19 | 20 | class Scraper: 21 | def __init__(self, client, lock, id=None): 22 | self.client = client 23 | self.id = id 24 | self.lock = lock 25 | f = open('message.txt', 'r') 26 | self.message = f.read() 27 | f.close() 28 | 29 | async def scrape(self, target_group_name, **kwargs): 30 | if not os.path.exists('./SessionFiles'): 31 | os.mkdir('./SessionFiles') 32 | chats = [] 33 | result = await self.client.get_dialogs() 34 | chats.extend(result) 35 | target_group = None 36 | for chat in chats: 37 | if chat.title == target_group_name: 38 | target_group = chat 39 | break 40 | if target_group is None: 41 | print('Could Not find the target group to scrape members ...') 42 | sys.exit(1) 43 | all_participants = [] 44 | print('Getting a list of all the members ...') 45 | all_participants = await self.client.get_participants(target_group, aggressive=True) 46 | await sleep(10) 47 | for p in all_participants: 48 | while True: 49 | if self.lock.locked(): 50 | await sleep(0.2) 51 | continue 52 | self.lock.acquire() 53 | break 54 | shelf = shelve.open('./SessionFiles/data') 55 | try: 56 | lastIndex = shelf[target_group_name] 57 | except KeyError: 58 | shelf[target_group_name] = 0 59 | lastIndex = 0 60 | shelf.sync() 61 | if all_participants.index(p) <= lastIndex: 62 | shelf.sync() 63 | shelf.close() 64 | self.lock.release() 65 | await sleep(1) 66 | continue 67 | try: 68 | await self.client.send_message(p, self.message) 69 | # shelf = shelve.open('./SessionFiles/data') 70 | shelf[target_group_name] = all_participants.index(p) 71 | try: 72 | count = shelf[f'{target_group_name}_count'] 73 | except KeyError: 74 | shelf[f'{target_group_name}_count'] = 1 75 | count = shelf[f'{target_group_name}_count'] 76 | shelf[f'{target_group_name}_count'] = count + 1 77 | print(f'Invite Count: {count}') 78 | shelf.sync() 79 | shelf.close() 80 | self.lock.release() 81 | await sleep(random.randrange(100, 120)) 82 | continue 83 | except errors.rpcerrorlist.PeerFloodError: 84 | print("Telegram requests rate limit detected !") 85 | shelf.sync() 86 | shelf.close() 87 | self.lock.release() 88 | await sleep(random.randrange(300, 500)) 89 | continue 90 | except errors.rpcerrorlist.FloodWaitError as e: 91 | print( 92 | f'Telegram wants us to wait for {e.seconds} before sending the next request ...') 93 | shelf.sync() 94 | shelf.close() 95 | self.lock.release() 96 | await sleep(e.seconds + 5) 97 | continue 98 | -------------------------------------------------------------------------------- /message.txt: -------------------------------------------------------------------------------- 1 | Are you from sialkot? -------------------------------------------------------------------------------- /sample-conf.ini: -------------------------------------------------------------------------------- 1 | [CONF] 2 | 3 | API_ID = 1836160 4 | API_HASH = 960bbd16fdee972e5a120156907b852d 5 | PHONE_NUMBER_IN_INTERNATIONAL_FORMAT = +923431441319 6 | TARGET_GROUP_NAME = Panacloud Bootcamp 7 | --------------------------------------------------------------------------------