Кибор » Кибор - Интегрированная среда разработки ботов » Связка Кибор с другими программами » Связка Kibor + Telegram API(Python)

Страниц (1): [1]
 

1. Brumo - 28 Февраля, 2021 - 12:57:44 - перейти к сообщению
Пример управления скриптом Kibor из Telegram, с помощью Telegram API на Python (библиотека "Telethon" )
Обмен данными между Kibor и Python через Shared memory



Требуется:

  • Необходимо получить api_id и api_hash (Отобразить)

  • Получить Token, cоздав в телеграм бота (через @BotFather) (Отобразить)

  • Установленная библиотека Telethon (работает только на пайтоне версии >3.5) (Отобразить)



  • В config.ini записать полученные api_id и api_hash.
    В button.py, в переменную chat, записать свой user_id
    Найти через поиск своего бота(начать диалог).
    При первом запуске button.py потребуется указать Token бота.

    P.s.Использовался Python версии 3.8.6, Telethon 1.19.4
    (Добавление)

    Kibor (Отобразить)
    2. Budni - 01 Марта, 2021 - 15:54:34 - перейти к сообщению
    Brumo , Протестировал, шикарно работает ::kruto.gif:: Можно ещё ввод данных организовать?
    3. Brumo - 02 Марта, 2021 - 22:52:45 - перейти к сообщению
     Budni пишет:
    Можно ещё ввод данных организовать?

    Не знаю как, я сам не спец в этом.
    Но примерно представляю, надо копать в сторону NewMessage, отлавливать новые сообщения, ну и потом по аналогии, записывать в память, а кибором читать
    4. Brumo - 03 Марта, 2021 - 11:30:10 - перейти к сообщению
     Brumo пишет:
    через NewMessage, отлавливать новые сообщения

    Примерно так:


    Kibor (Отобразить)


    5. Brumo - 16 Марта, 2021 - 12:44:39 - перейти к сообщению
    Другой способ управления скриптом.

    Так как хоть задачи и схожи (управление скриптом через телеграм), но есть принципиальное отличие в методе передачи данных.

    В прошлом примере передача осуществлялась через sharedmemory, здесь же происходит запись напрямую в память.
    При таком способе кардинально упрощается интеграция в готовый скрипт Kibor, не требуется использование функций WinApi.
    Для того чтобы изменять переменную, достаточно добавить одну строку, которая будет записывать в файл данные о переменной:

    ====================================================

     Цитата:

    fwrite("x[0]|Переменная x[0]|"+format(address(#x[0]))+"^n" );


    Где:
    x[0] - имя переменной
    Переменная x[0] - имя создаваемой кнопки
    format(address(#x[0])) - указатель на переменную

    ^n - новая строка, можно и так:
    fwrite("x[0]|Переменная x[0]|"+format(address(#x[0])));
    fwrite(ENDL);

    Разделитель "|" обязателен.


    И соответственно fopen() и fclose():

     Цитата:
    fopen("C:\telegram\var_list.txt", "w" );//создаст по указанному пути список переменных, вместо var_list можно другое имя
    fwrite("x[0]|Переменная x[0]|"+format(address(#x[0]))+"^n" );
    fclose();

    Добавлять в начале скрипта, после инициализации переменных.

    ====================================================

    Другое немаловажное отличие, не требуется внесение изменений в сам скрипт Python.
    Все кнопки в Telegram создаются автоматически, минимально необходимые настройки происходят в файле config.ini:

     Цитата:
    [Telegram]
    ;указать api_id
    api_id = 1234567

    ;указать api_hash
    api_hash = 1234567890abcdef1234567890abcdef

    ;имя кэша сессии
    username = Qwerty

    ;указать user_id где создавать кнопки
    chat = 1234567890

    ;указать имя процесса
    process = kibor.exe

    ;количество кнопок в ряду
    row_width = 2

    ;путь к файлу полный: C:\telegram\var_list.txt либо относительный: var_list.txt
    pvar_list = var_list.txt

    Как получить api_id, api_hash и user_id указано в начале темы.

    ====================================================

    Порядок запуска:
    Запустить скрипт Кибор, создастся файл с данными.

    Запустить write_pm.py от имени администратора, считает данные с файла, создаст кнопки в Telegram.
    После нажатия определенной кнопки, в поле ввода вставляется текст такого вида: @Имя_вашего_бота x[0]=
    после знака "=" ввести новое значение переменной, нажать отправить.

    ..от "@Имя_вашего_бота" избавиться нельзя, по крайней мере в нынешней версии Telegram Api..
    Можно вводить вручную, и без "@Имя_вашего_бота":
    x[0]=111

    ..если случайно вместе с числом, ввести посторонние символы, к примеру так:
    x[0]= h 111
    Python удалит лишние пробелы, буквы, оставит только 111


    Для закрытия write_pm.py нажать кнопку 'Close', либо в консоли 'Ctrl+C'


    P.s. На данный момент изменять можно только int, подумываю добавить позднее char.
    string под вопросом, возникли некоторые нюансы.

    ====================================================

    Ссылка на write_pm.py и config.ini

    ====================================================

    Пример скрипта Кибор:
    CODE:
    int flag_1=1;
    int flag_2=0;
    int timer=12;
    int x[2], y[2];
    x[0]=100;
    y[0]=100;
    x[1]=200;
    y[1]=200;


    fopen ("C:\telegram\var_list.txt", "w");

    fwrite("flag_1|Флаг 1|"+format(address(#flag_1))+'^n');
    fwrite("flag_2|Флаг 2|"+format(address(#flag_2))+'^n');
    fwrite("timer|Таймер|"+format(address(#timer))+'^n');
    fwrite("x[0]|координата x[0]|"+format(address(#x[0]))+'^n');
    fwrite("y[0]|координата y[0]|"+format(address(#y[0]))+'^n');
    fwrite("x[1]|координата x[1]|"+format(address(#x[1]))+'^n');
    fwrite("y[1]|координата y[1]|"+format(address(#y[1])));

    fclose();


    loop(600)
    {
    textout(0, 760, 320, 'Флаг 1 = '+format(flag_1), 1);
    textout(1, 760, 340, 'Флаг 2 = '+format(flag_2), 1);
    textout(2, 760, 360, 'Таймер = '+format(timer), 1);
    textout(3, 760, 380, 'координата x[0] = '+format(x[0]), 1);
    textout(4, 760, 400, 'координата y[0] = '+format(y[0]), 1);
    textout(5, 760, 420, 'координата x[1] = '+format(x[1]), 1);
    textout(6, 760, 440, 'координата y[1] = '+format(y[1]), 1);
    pause(100);
    }



    Так будут выглядеть кнопки в Telegram:
    6. Budni - 16 Марта, 2021 - 23:41:07 - перейти к сообщению
    Brumo , Не перестаешь удивлять) Хотелось бы увидеть ещё реализацию передачи картинок и тогда можно будет что-то типо обработчика фотографий сделать)
    7. Brumo - 21 Марта, 2021 - 10:54:12 - перейти к сообщению
    Версия 2.0

    Добавлено:

    int:
    //Записывает int (4 байта)

    char:
    //Записывает char (1 байт)

    char[]:
    //Записывает массив char ("длина" + 1 байт(0))

    double:
    //Записывает double (8 байт)

    screen:
    //Получение скриншота

    button:
    //Клик кнопки в диалоговом окне

    ====================================================

     Цитата:
    fwrite("int:x[0]|Переменная x[0]|"+format(address(#x[0]))+'^n' );


    Параметры:
    int:x[0] - тип(int: ) и имя переменной(x[0])
    Переменная x[0] - имя создаваемой кнопки
    format(address(#x[0]) - указатель на переменную

    С остальными типами аналогично:
     Цитата:
    fwrite("char:c|Переменная c|"+format(address(#c))+'^n' );
    fwrite("char[]:ch[0]|Переменная ch[0]|"+format(address(#ch[0]))+'^n' );
    fwrite("double:d|Переменная d|"+format(address(#d))+'^n' );


    ====================================================

     Цитата:
    fwrite("screen:0|Скриншот|0, 0, 1680, 1050|C:\Telegram\PrintScr\"+'^n' );


    Параметры:
    screen:0 - тип(screen: ) и номер кнопки(0)
    Скриншот - имя создаваемой кнопки
    0, 0, 1680, 1050 - старт_X, старт_Y, финиш_X, финиш_Y, сохранит указанную зону
    C:\Telegram\PrintScr\ - путь к сохраненному файлу

    При нажатии, сделает скрин экрана и сохранит по указанному пути(с указанием даты и времени в имени, формат png), отправит в чат телеграм

    ====================================================

     Цитата:
    fwrite("button:0|Старт|"+format(b0)+'^n' );


    Параметры:
    button:0 - тип(button: ) и номер кнопки(0)
    Старт - имя создаваемой кнопки
    format(b0) - дескриптор окна(button)

    Клик кнопки в диалоговом окне.

    Если второй параметр не указывать(имя кнопки):
     Цитата:
    fwrite("button:0||"+format(b0)+'^n' );

    python перед созданием получит текст окна(button) по указанному дескриптору(через функцию GetWindowText),
    если после нажатия текст изменился, то поменяется и имя кнопки в телеграм.

    Дескриптор возвращает функция CreateWindow, пример:
    b0=CreateWindow(0, "BUTTON", "Старт", WS_CHILD | WS_VISIBLE, 0, 0, 100, 40, gethwnd(1), 0, 0, 0);


    добавлять после createdialog();

    ====================================================

    Ссылка(google)

    Ссылка(yandex)

    ====================================================


    Пример скрипта Кибор(button):


    CODE:
    #define WS_VISIBLE 268435456
    #define WS_CHILD 1073741824
    #define WS_BORDER 8388608

    external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
    external(INT, "SetWindowLong", "SetWindowLongA", "User32.dll" );
    external(INT, "SetWindowText", "SetWindowTextA", "User32.dll" );


    int flag1=0, flag2=0;
    int a=0, b=0;
    int b0=0, b1=0, be;

    createdialog(1);

    fopen("C:\Telegram\var_list.txt", "w");
    fwrite("button:1||"+format(b0)+'^n');
    fwrite("button:2||"+format(b1)+'^n');
    fwrite("button:3||"+format(be)+'^n');
    fclose();

    showdialog(1, "Диалог",740, 525, 198, 78, 1, 1);
    SetWindowLong(gethwnd(1), -16, WS_VISIBLE);
    enabletimer(1);



    loop(60000)
    +HIDE0>{
    if(flag1==1)
    {
    textout(0, 780, 480, format(a), 0);
    a++;
    }

    if(flag2==1)
    {
    textout(1, 876, 480, format(b), 0);
    b++;
    }
    pause(10);
    }/HIDE0>

    function getmessage(1, WM_CREATE)
    +HIDE1>
    {
    b0=CreateWindow(0, "BUTTON", "T1 старт", WS_CHILD | WS_VISIBLE, -2, -2, 100, 40, gethwnd(1), 0, 0, 0); // создать кнопку
    b1=CreateWindow(0, "BUTTON", "T2 старт", WS_CHILD | WS_VISIBLE, 98, -2, 100, 40, gethwnd(1), 0, 0, 0); // создать кнопку
    be=CreateWindow(0, "BUTTON", "Exit", WS_CHILD | WS_VISIBLE, -2, 38, 200, 40, gethwnd(1), 0, 0, 0); // создать кнопку
    }/HIDE1>

    function getmessage(1, WM_COMMAND)
    +HIDE2>
    {
    if(message.lparam==b0)
    {
    if(flag1==1)
    {
    flag1=0;
    SetWindowText(b0, "T1 старт");
    }
    else
    {
    flag1=1;
    SetWindowText(b0, "T1 пауза");
    }
    }

    if(message.lparam==b1)
    {
    if(flag2==1)
    {
    flag2=0;
    SetWindowText(b1, "T2 старт");
    }
    else
    {
    flag2=1;
    SetWindowText(b1, "T2 пауза");
    }
    }

    if(message.lparam==be)
    {
    goto global end;
    }
    }/HIDE2>

    CREATE_TIMER(1, 1)
    +HIDE3>
    {
    while(flag1==0&&flag2==0){sleep(1);}
    }/HIDE3>

    end:
    destroydialog(1);
    8. Kibor - 25 Января, 2022 - 11:16:40 - перейти к сообщению
    Версия 6.03 Получение от Телеграма и отправка сообщений в Телеграм без Python
    Получение от Телеграма и отправка сообщений в Телеграм

    Powered by ExBB FM 1.0 Final