Обмен данными между библиотекой Python Telethon и Node.js

Я столкнулся с такой проблемой: в моем небольшом тестовом приложении у меня есть простой сервер node.js (экспресс) и скрипт на python, который позволяет мне взаимодействовать с API Telegram, используя библиотеку Telethon. В моем сценарии я должен предоставить моему скрипту Python номер телефона и пароль. Эти данные запрашиваются в режиме ввода, поэтому я не могу понять, как я могу:

  1. Принять входной запрос от скрипта Python на стороне node.js;
  2. Предоставьте эти учетные данные с помощью node.js и передайте их обратно через ввод python;
  3. Повторите эти действия несколько раз, чтобы получить всю необходимую мне информацию.

Это мои тестовые файлы:

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}!`)
);

Итак, есть ли способ решить это дело?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование 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

Выполняя шаги последовательно и интерактивно, ожидая, пока необходимые параметры успешно войдут в систему, а также помня о том, что у вас есть ограничение по времени до истечения срока действия кода, ваша задача — обрабатывать любое их неопределенное поведение в зависимости от вашего варианта использования.

Другие вопросы по теме