Исходник YouGame member parser | Python

ставь чайник, зажигай плиту
Эксперт
Статус
Оффлайн
Регистрация
22 Май 2020
Сообщения
1,444
Реакции[?]
1,092
Поинты[?]
10K
Простой скрипт, который парсит основую информацию с профиля юг и сохраняет её.
Для работы необходимо создать также файл cookie.txt с куки вашего аккаунта (document.cookie в консоль браузера)
Куки нужны для обхода js проверки от кфа и парса челов в бане
Модули для установки: requests, sty, beautifulsoup4

Python:
import ctypes, requests, json, os
from sty import fg
from bs4 import BeautifulSoup as bs

# to show colors
ctypes.windll.kernel32.SetConsoleMode(ctypes.windll.kernel32.GetStdHandle(-11), 7)

# console title
ctypes.windll.kernel32.SetConsoleTitleW('YouGame parser by Flowseal')

try:
    os.mkdir("accounts")
except:
    pass

try:
    with open('cookie.txt') as f:
        cookie = f.read()
except:
    print(fg.li_red + 'cookie.txt not found!' + fg.rs)
    raise

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36 OPR/75.0.3969.285',
    'cookie': cookie
}

class ParseError(Exception):
    pass

def parse(link):
    output = {}

    req = requests.get(link, headers=headers)
    if req.status_code not in [503, 200]:
        print(fg.li_red + '\nНевозможно обработать ссылку: нет подключения' + fg.rs)
        raise Exception(f'Incorrect status code: {req.status_code}')

    soup = bs(req.content, 'html.parser')

    name_block = soup.find('span', class_='username')
    if not name_block:
        print(fg.li_red + '\nНевозможно обработать ссылку.' + fg.rs + ' Возможные причины:\n- Captcha\n- Профиль скрыт\n- Невалидные cookie')
        raise ParseError('Wrong document structure')

    username = name_block.find('span').text
    role = ''.join(soup.find('em', class_='userBanner').find_all(text=True)).strip()
    uid = name_block["data-user-id"]
    date = soup.find_all('div', class_='memberHeader-blurb')[1].find('time').text
    messages = ''.join(soup.find_all('div', class_='memberHeader-content')[1].find('dt', text='Сообщения').parent.find('dd').find_all(text=True)).strip()
    reactions = ''.join(soup.find_all('div', class_='memberHeader-content')[1].find('dt', text='Реакции').parent.find('dd').find_all(text=True)).strip()

    output.update({'username': username, 'role': role, 'uid': uid, 'date': date, 'messages': messages, 'reactions': reactions})

    donation = soup.find_all('div', class_='memberHeader-content')[1].find('dt', title='Пожертвовал')
    if donation:
        donated = donation.parent.find('dd').text.strip()
        output.update({'donated': donated})

    viewers = soup.find('span', class_='viewCount').text
    output.update({'viewers': viewers})

    return output

    

if __name__ == '__main__':
    while True:
        link = input('\nВведите ссылку на аккаунт: ')
    
        while link.find('https://yougame.biz/') == -1 or link[len(link)-1] != '/':
            print(f'\n{fg.li_red}Введена ссылка невалидного формата.{fg.rs} Примеры {fg.green}правильной{fg.rs} ссылки:\n- https://yougame.biz/flowseal/\n- https://yougame.biz/members/82060/')
            link = input('\nВведите ссылку на аккаунт: ')

        output = parse(link)
        
        for key in output:
            print(f'{key}: {output[key]}')

        with open(f'accounts/{output["username"]}.json', 'w') as f:
            json.dump(output, f)
 
Сверху Снизу