|
import gradio as gr
|
|
|
|
from utils.auth import AuthState, ClientConnector
|
|
from utils.components import Components, ComponentsFn
|
|
from utils.parser import Parser
|
|
|
|
|
|
def create_interface() -> gr.Blocks:
|
|
auth_state = AuthState()
|
|
auth_state.check_start_auth_status()
|
|
|
|
|
|
css = '''
|
|
.gradio-container {
|
|
width: 70% !important;
|
|
margin: 0 auto !important; /* Центрирование по горизонтали */
|
|
}
|
|
'''
|
|
|
|
with gr.Blocks(css=css) as interface:
|
|
gr.Markdown(Components.welcome_message_markdown)
|
|
|
|
auth_state = gr.State(auth_state)
|
|
chats_list = gr.State([])
|
|
csv_names = gr.State([])
|
|
|
|
dynamic_visible_components = ComponentsFn.get_dynamic_visible_components(auth_state.value, render=False)
|
|
code, code_btn, password_2fa, password_2fa_btn, delete_session_btn = dynamic_visible_components
|
|
|
|
with gr.Group():
|
|
gr.Markdown('Авторизация')
|
|
with gr.Row():
|
|
with gr.Column():
|
|
session_type = Components.session_type_radio()
|
|
auth_status = Components.auth_status(value=auth_state.value.message)
|
|
with gr.Row():
|
|
auth_btn = Components.auth_btn()
|
|
delete_session_btn.render()
|
|
code.render()
|
|
code_btn.render()
|
|
password_2fa.render()
|
|
password_2fa_btn.render()
|
|
|
|
with gr.Column():
|
|
api_id = Components.api_id()
|
|
api_hash = Components.api_hash()
|
|
phone_number = Components.phone_number()
|
|
|
|
auth_btn.click(
|
|
fn=ClientConnector.start_auth,
|
|
inputs=[auth_state, api_id, api_hash],
|
|
outputs=[auth_state],
|
|
).then(
|
|
fn=ClientConnector.send_code,
|
|
inputs=[auth_state, phone_number],
|
|
outputs=[auth_state],
|
|
).then(
|
|
fn=ComponentsFn.get_dynamic_visible_components,
|
|
inputs=[auth_state],
|
|
outputs=dynamic_visible_components,
|
|
).then(
|
|
fn=ComponentsFn.update_status,
|
|
inputs=[auth_state],
|
|
outputs=[auth_status],
|
|
)
|
|
|
|
code_btn.click(
|
|
fn=ClientConnector.verify_code,
|
|
inputs=[auth_state, phone_number, code],
|
|
outputs=[auth_state],
|
|
).then(
|
|
fn=ComponentsFn.get_dynamic_visible_components,
|
|
inputs=[auth_state],
|
|
outputs=dynamic_visible_components,
|
|
).then(
|
|
fn=ComponentsFn.update_status,
|
|
inputs=[auth_state],
|
|
outputs=[auth_status],
|
|
)
|
|
|
|
password_2fa_btn.click(
|
|
fn=ClientConnector.verify_2fa,
|
|
inputs=[auth_state, password_2fa],
|
|
outputs=[auth_state],
|
|
).then(
|
|
fn=ComponentsFn.get_dynamic_visible_components,
|
|
inputs=[auth_state],
|
|
outputs=dynamic_visible_components,
|
|
).then(
|
|
fn=ComponentsFn.update_status,
|
|
inputs=[auth_state],
|
|
outputs=[auth_status],
|
|
)
|
|
|
|
delete_session_btn.click(
|
|
fn=ComponentsFn.delete_session,
|
|
inputs=[auth_state],
|
|
outputs=None,
|
|
).then(
|
|
fn=ComponentsFn.get_dynamic_visible_components,
|
|
inputs=[auth_state],
|
|
outputs=dynamic_visible_components,
|
|
).then(
|
|
fn=ComponentsFn.update_status,
|
|
inputs=[auth_state],
|
|
outputs=[auth_status],
|
|
)
|
|
|
|
session_type.change(
|
|
fn=ComponentsFn.update_auth_state_session_type,
|
|
inputs=[auth_state, session_type],
|
|
outputs=None,
|
|
)
|
|
|
|
|
|
with gr.Group():
|
|
gr.Markdown('Парсинг')
|
|
with gr.Row():
|
|
with gr.Column():
|
|
with gr.Group():
|
|
gr.Markdown('Чаты для парсинга')
|
|
chats_usernames = Components.chats_usernames()
|
|
add_chat_btn = Components.add_chat_btn()
|
|
chats_list_status = Components.chats_list_status()
|
|
with gr.Column():
|
|
with gr.Group():
|
|
gr.Markdown('Параметры парсинга')
|
|
parse_args = Components.get_parse_args()
|
|
with gr.Column():
|
|
with gr.Group():
|
|
gr.Markdown('Результаты парсинга')
|
|
start_parse_btn = Components.start_parse_btn()
|
|
parse_status = Components.parse_status()
|
|
download_btn = Components.download_btn()
|
|
|
|
add_chat_btn.click(
|
|
fn=Parser.add_chat_to_chats_list,
|
|
inputs=[auth_state, chats_usernames, chats_list, api_id, api_hash],
|
|
outputs=[chats_list_status],
|
|
)
|
|
|
|
start_parse_btn.click(
|
|
fn=Parser.parse_chats,
|
|
inputs=[auth_state, chats_list, api_id, api_hash, *parse_args],
|
|
outputs=[parse_status, csv_names],
|
|
).then(
|
|
fn=ComponentsFn.update_download_btn,
|
|
inputs=[csv_names],
|
|
outputs=[download_btn],
|
|
)
|
|
|
|
return interface
|
|
|