Я столкнулся с такой проблемой: в моем небольшом тестовом приложении у меня есть простой сервер node.js (экспресс) и скрипт на python, который позволяет мне взаимодействовать с API Telegram, используя библиотеку Telethon. В моем сценарии я должен предоставить моему скрипту Python номер телефона и пароль. Эти данные запрашиваются в режиме ввода, поэтому я не могу понять, как я могу:
Это мои тестовые файлы:
file.py
import os
from telethon import TelegramClient
api_id = 12345
api_hash = 'hash'
session = 'testing'
proxy = None
client = TelegramClient(session, api_id, api_hash, proxy=proxy).start()
def get_ids_list():
ids_dict = {}
async def do_fetch():
async for dialog in client.iter_dialogs():
ids_dict[dialog.name] = dialog.id
with client:
client.loop.run_until_complete(do_fetch())
return ids_dict
def print_ids_list():
async def do_print():
async for dialog in client.iter_dialogs():
print(dialog.name, 'has ID', dialog.id)
with client:
client.loop.run_until_complete(do_print())
print_ids_list()
Когда этот скрипт запускается, мне предлагается следующий ввод:
Please enter your phone (or bot token):
А это мой index.js, в котором я хочу передать на этот вход подготовленные данные:
import express from "express";
import { spawn } from "child_process";
const app = express();
const port = 3000;
app.get("/", (req, res) => {
var myPythonScript = "path/to/file.py";
var pythonExecutable = "python";
var uint8arrayToString = function (data) {
return String.fromCharCode.apply(null, data);
};
const scriptExecution = spawn(pythonExecutable, [myPythonScript]);
scriptExecution.stdout.on("data", (data) => {
console.info(uint8arrayToString(data));
});
scriptExecution.stderr.on("data", (data) => {
console.info(uint8arrayToString(data));
});
scriptExecution.on("exit", (code) => {
console.info("Process quit with code : " + code);
});
});
app.listen(port, () =>
console.info(`Example app listening on port ${port}!`)
);
Итак, есть ли способ решить это дело?






Использование with client эквивалентно client.start(), и как указано:
По умолчанию этот метод будет интерактивным (при необходимости запрашивается ввод данных пользователем) и будет обрабатывать 2FA, если он также включен.
Вместо этого вам нужно сделать то, что он делает вручную, удалить блокировку with и создать функцию для аутентификации (или подтверждения, если она уже авторизована).
для минимального примера функции:
....
if not client.is_connected():
await client.connect()
if not await client.is_user_authorized():
await client.send_code_request(phone)
# get the code somehow, and in a reasonably fast way
try:
await client.sign_in(phone, code)
except telethon.errors.SessionPasswordNeededError:
'''
Retry with password.
note: it's necessary to make it error once
even if you know you have a pass, iow don't pass password the first time.
'''
await client.sign_in(phone, code, password=password)
return client
else:
return client
Выполняя шаги последовательно и интерактивно, ожидая, пока необходимые параметры успешно войдут в систему, а также помня о том, что у вас есть ограничение по времени до истечения срока действия кода, ваша задача — обрабатывать любое их неопределенное поведение в зависимости от вашего варианта использования.