전보에서 데이터를 수집하는 응용(제2부분: 채팅 참여자)

23169 단어
안녕하십니까? 두 번째 부분에서 우리는 계속해서'안전하고 두 번 암호화된'전신 서버에서 채팅 데이터를 수집할 것입니다.
이 글을 읽기 전에 강력히 추천합니다.그 안에 우리는 텔레그램 개발자 계정을 만들고 프로젝트를 설정했다.
현재 우리 프로젝트는 '.py' 파일, 설정, 세션 파일만 있습니다.
모두가 알고 있는 지혜가 말한 바와 같다.
체인의 강도는 그것의 가장 약한 고리에 달려 있다.
그래서 우리는 아름답고 강력한 프로젝트를 만들 것이다
이 부분에서 우리는 텔레그램 채팅에서 사용자 목록을 얻을 것이다. 만약에 우리가 채팅 관리자가 아니라 일반 사용자로서 텔레그램을 방문한다면 텔레그램은 우리에게 참여자에 대한 정보를 제공할 것이다.

내 친구를 찾아가다


코드에서 나중에 혼동되지 않도록 프로젝트 디렉토리에 여러 파일을 생성합니다.
사용자py
링크.txt
우리는 단독 파일에서 이 장의 모든 코드를 작성할 것이다.피야.이것은 우리의 앞으로의 업무를 크게 간소화할 것이다.
이 파일을 메인 프로젝트에 가져옵니다. 이것은 우리가 첫 번째 부분에서 작성한 것입니다. (본문 말미에 이 두 부분의 코드를 발표할 것이니 걱정하지 마십시오.)
import Users
또한 채팅 사용자와 더욱 협력하기 위해 Telethon 라이브러리에서 더 많은 내용을 가져와야 합니다.
from telethon.tl.functions.channels import GetParticipantsRequest
from telethon.tl.types import ChannelParticipantsSearch
또렷하고 편리하도록 프로젝트에 TQM 라이브러리를 설치합니다.이것은 우리가 컨트롤 데스크톱에 보기 좋은 진도 표시줄을 만들 수 있도록 할 것이다. (진도를 해제하는 도형 표시줄)
pip install tqdm 명령 작성
라이브러리 클래스를 프로젝트에 가져오기
from tqdm import tqdm
마스터 파일의 모든 가져오기:
import configparser
from telethon import TelegramClient
import Users
from telethon.tl.functions.channels import GetParticipantsRequest
from telethon.tl.types import ChannelParticipantsSearch
from tqdm import tqdm
우리는 여전히 링크를 모르는 파일을 가지고 있다.txt, 당신과 나는 그것을 우리의 채팅 링크 목록으로 사용할 것입니다. 우리는 그 중에서 데이터를 분석할 것입니다. 그러나 우리는 이 문제를 더욱 토론할 것입니다.
파일 사용자비동기 함수를 만듭니다.
async def dump_all_participants(channel,
                                ChannelParticipantsSearch,
                                client,
                                GetParticipantsRequest,
                                tqdm):
채널-이것은 우리의 전보 채팅, 우리가 우리에게 전달할 기능
channelparticipantsearch와GetParticipantsRequest는 위에서 가져온 것입니다.Telethon 라이브러리에서 함수에 필요한 같은 종류입니다.
TQM은 진행 상태 막대 라이브러리입니다.
클라이언트는 우리가 첫 번째 부분에서 만든 연결입니다.이게없으면 안돼.
이제 파일 링크에서 읽기 채팅 링크를 설정합니다.txt
주 파일 업데이트 중입니다.py는 이전 부분의 주 함수에서 다음과 같은 코드를 작성할 것입니다
async def main():
    with open("links.txt", "r") as f:
        while True:
            try:
                text = f.readline()
                url = text
                channel = await client.get_entity(url)
                await Users.dump_all_participants(channel, ChannelParticipantsSearch,
                                                  client, GetParticipantsRequest, tqdm)
            except Exception:
                pass
여기서 파일을 읽은 후 파일 사용자로부터 dump all participants 함수를 즉시 호출합니다.우리의 논점을 그것에 전달함으로써
계속...
파일 사용자로 이동합니다.py, Dump all participants 함수를 만들었습니다. Telethon 라이브러리에 초기 설정을 작성할 것입니다.
async def dump_all_participants(channel,
                                ChannelParticipantsSearch,
                                client,
                                GetParticipantsRequest,
                                tqdm):
    print('Get info from channel', channel.title)
    OFFSET_USER = 0   #start user position
    LIMIT_USER = 200  #the maximum number of records transmitted 
                      #at a time, but not more than 200
    ALL_PARTICIPANTS = []  
    FILTER_USER = ChannelParticipantsSearch('') #filter user

무한while 순환을 만듭니다:
while True:
우리의 순환 속에서 마법 자체가 시작된다.
participants = await client(GetParticipantsRequest(channel,
               FILTER_USER, OFFSET_USER, LIMIT_USER, hash=0)
if not participants.users:
            break
ALL_PARTICIPANTS.extend(participants.users)
OFFSET_USER += len(participants.users)


우리는 텔레그램으로 향했다. 클래스와 상수의 도움으로 우리가 흥미를 느끼는 채팅 사용자 목록을 얻기 위해 요청을 보냈다. 이 목록은 채널 변수에 저장된다.
따라서 참여자 변수에는 각 사용자 정보가 포함된 객체 목록이 표시됩니다.
명시적으로 Dell은 받은 정보를 텍스트 파일에 기록하도록 사전에 규정합니다.
with open(f"{channel.title}.txt", "w", encoding="utf-8") as file:
문자를 포함하는 닉네임에 문제가 생기지 않도록 인코딩을 지정해야 합니다.
이제 TQM 라이브러리를 사용하여 사용자를 순환하지만
 for participant in tqdm(ALL_PARTICIPANTS):
        try:
           file.writelines(f" ID: {participant.id} "
                           f" First_Name:{participant.first_name}"
                           f" Last_Name: {participant.last_name}"
                           f" Username: {participant.username}"
                           f" Phone: {participant.phone}"
                           f" Channel: {channel.title} \n")
            except Exception as e:
                print(e)
print('The end!')
다음은 파이썬에 대한 첫 번째 채팅 예제의 결과입니다.

프로그램의 루트 디렉토리에 파일 {channel name}이 있습니다.사용자 정보 포함 txt

파일 링크에서 우리의 해석을 실행합니다.txt 채팅방이나 그룹의 링크를 삽입해야 합니다.채팅 설명에서 이 링크를 찾을 수 있습니다.

중요!채널 관리자가 아니므로 채널을 확인할 수 없습니다.채팅이나 그룹을 분석하려면 구독이 필요합니다.)
채팅 링크가 많아요.새로운 줄부터 쓰는 것이 매우 중요하다.
완벽하다우리는 방금 채팅 사용자 목록을 다운로드했다.우리는 그들의 유일한 식별자 (ID) 를 찾았는데, 이것은 우리가 장래에 이 (또는 다른 채팅) 에서 사용자의 정보를 찾을 수 있도록 도와줄 것이다.우리는 세 번째 부분에서 채팅에서 메시지를 제거하는 것에 대해 토론할 것이다.
관심 가져주셔서 감사합니다!평론에 너의 인상을 써라.

By tradition, the full code.


파일을 업데이트합니다.py
import configparser
from telethon import TelegramClient
import Users
from telethon.tl.functions.channels import GetParticipantsRequest
from telethon.tl.types import ChannelParticipantsSearch
from tqdm import tqdm
config = configparser.ConfigParser()
config.read("config.ini")

api_id: str = config['Telegram']['api_id']
api_hash = config['Telegram']['api_hash']
username = config['Telegram']['username']
client = TelegramClient(username, api_id, api_hash)
client.start()
async def main():
    with open("links.txt", "r") as f:
        while True:
            try:
                text = f.readline()
                url = text
                channel = await client.get_entity(url)
                print(url)
                await Users.dump_all_participants(channel, 
                ChannelParticipantsSearch,
                client, 
                GetParticipantsRequest, tqdm)
            except Exception:
                pass
with client:
    client.loop.run_until_complete(main())
파일 사용자입니다.py
async def dump_all_participants(channel, 
                                ChannelParticipantsSearch,
                                client,
                                GetParticipantsRequest, tqdm):

    print('Get info from channel', channel.title)

    OFFSET_USER = 0  
    LIMIT_USER = 200 
    ALL_PARTICIPANTS = []  
    FILTER_USER = ChannelParticipantsSearch('') 
    while True:
       participants = await client(GetParticipantsRequest(channel,
                     FILTER_USER, OFFSET_USER, LIMIT_USER,hash=0))
        if not participants.users:
            break
        ALL_PARTICIPANTS.extend(participants.users)
        OFFSET_USER += len(participants.users)
        with open(f"{channel.title}.txt", "w", encoding="utf-8")
                                                         as file:
            for participant in tqdm(ALL_PARTICIPANTS):
                try:
                    file.writelines(f" ID: {participant.id} "
                          f" First_Name:{participant.first_name}"
                          f" Last_Name: {participant.last_name}"
                          f" Username: {participant.username}"
                          f" Phone: {participant.phone}"
                          f" Channel: {channel.title} \n")
                except Exception as e:  
                    print(e)
    print('The end!')

당신의 성공을 축원합니다!


Write me on Face....oh...Meta

좋은 웹페이지 즐겨찾기