1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/sjdy521-Mojo-Webqq

Клонировать/Скачать
Controller-API.md 20 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 13.03.2025 11:55 7780505

Управление несколькими аккаунтами в API QQ

  • Поддерживает управление множеством аккаунтов (запуск, остановка, проверка состояния)
  • Совместим со всеми API одного аккаунта, при этом в адресах существующих API одного аккаунта добавляется параметр client=xxx, чтобы различать различных клиентов аккаунтов

Сводка API

Адрес API Описание API
/openqq/start_client Запуск одного клиента QQ
/openqq/stop_client Остановка одного клиента QQ
/openqq/check_client Проверка состояния клиента QQ
/openqq/get_qrcode Получение QR-кода входа
Совместимость с другими API одного аккаунта QQ Совместимость с другими API одного аккаунта QQ

Сначала запустите сервер API Controller:

Вы можете сохранить следующий код как исходный файл (обязательно используйте UTF8 кодировку) и запустить его с помощью интерпретатора Perl.

#!/usr/bin/env perl
use Mojo::Webqq::Controller;
my ($host, $port, $post_api, $poll_api);
``````markdown
    $host = "0. 0. 0. 0"; # Адрес прослушивания сервера API Controller, если нет специальных требований, не изменяйте это значение
    $port = 4000;      # Прослушиваемый порт сервера API Controller, измените на тот порт, который вы хотите использовать
    #$post_api = 'http://xxxx';  # URL для отправки сообщений каждого аккаунта QQ, если вам не требуется получать уведомления о сообщениях, удалите или закомментируйте эту строку
    #$poll_api = 'http://xxxx';  # Необходимо, см. раздел документации API одного аккаунта о пробросе внутренней сети, если не требуется, удалите или закомментируйте эту строку
    my $controller = Mojo::Webqq::Controller->new(
         слушать              => [{ хост => $хост, порт => $порт }], # адрес и порты для прослушивания
         backend_start_port   => 5000, # минимальный порт для распределения аккаунтов QQ в бэкэнде
         post_api             => $post_api, # api адрес для отчетов каждого аккаунта QQ
         poll_api             => $poll_api, # api адрес для запросов пульса контроллера
         poll_interval        => 5, # интервал времени между запросами пульса контроллера
         max_clients          => 100, # максимальное количество допустимых клиентских соединений, по умолчанию 100
     #   tmpdir               => '/tmp', # временная директория
     #   pid_path             => '/tmp/mojo_webqq_controller_process.pid', # путь к файлу pid процесса контроллера
     #   backend_path         => '/tmp/mojo_webqq_controller_backend.dat', # путь к файлу данных бэкэнда
     #   check_interval       => 5, # интервал проверки состояния аккаунтов QQ в бэкэнде
#   log_level            => 'debug', # уровень логгирования: debug | info | msg | warn | error | fatal
 #   log_path             => '/tmp/mojo_webqq_controller.log', # путь к файлу логов
 #   log_encoding         => 'utf8', # кодировка вывода в консоль
 #   template_path        => '/tmp/mojo_webqq_controller_template.pl', # шаблон файла для создания клиентского соединения
 );
 $контроллер->run();

Сохраните приведённый ниже код в файл xxxx.pl, затем запустите его с помощью perl, чтобы выполнить вход в систему QQ и создать локальный HTTP-сервер, слушающий указанный адрес и порт.```bash $ perl xxxx.pl


### Архитектурный дизайн

Используется модель многопоточного процесса, основной процесс (wqcontroller) прослушивает порт 4000 и предоставляет единый сервис запросов API. Каждый аккаунт QQ является независимым подпроцессом, который получает отдельный порт для связи с основным процессом.

В Linux можно легко просмотреть состояние процессов с помощью команды `ps ef`.

_ wqcontroller # прослушивает порт 4000, предоставляя единую службу API _ wqclient(webqq_client_01) # подпроцесс прослушивает порт 5000 _ wqclient(webqq_client_02) # подпроцесс прослушивает порт 5001 _ wqclient(webqq_client_03) # подпроцесс прослушивает порт 5002 _ wqclient(webqq_client_04) # подпроцесс прослушивает порт 5003


### Описание данных файлов

Процесс wqcontroller и каждый созданный им клиент QQ (wqclient) во время работы генерируют множество файлов, которые по умолчанию сохраняются в временной директории системы.

Вы можете использовать параметр `tmpdir` в wqcontroller для изменения местоположения временной директории, как показано в примерах кода раздела [Нужно сначала запустить Controller API сервер](Controller-API.md#нужно-сначала-запустить-controller-api-сервер).

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

wqcontroller :

    mojo_webqq_controller_backend.dat  # файл информации о клиентах, созданной wqcontroller
    mojo_webqq_controller_template.pl  # шаблонный файл, используемый wqcontroller для создания клиентов
    
wqclient:    mojo_webqq_cookie_{имя_клиента}.dat # cookie-файл клиента, используется для повторного входа без сканирования QR-кода
    mojo_webqq_pid_{имя_клиента}.pid    # файл, содержащий PID клиента, предотвращающий создание нескольких экземпляров одного и того же аккаунта QQ
    mojo_webqq_qrcode_{имя_клиента}.jpg # файл QR-кода входа клиента
    mojo_webqq_state_{имя_клиента}.json # файл состояния работы клиента, JSON-формат, обновляется в реальном времени
    

Что касается шаблонного файла, используемого при создании клиентов, следует сделать особое упоминание:

При создании клиента, wqcontroller использует временный файл mojo_webqq_controller_template.pl, находящийся в временной директории, для запуска процесса клиента QQ. Вы можете использовать метод Mojo::Webqq::Controller->new, который принимает параметр template_path, указывающий путь к пользовательским шаблонным файлам, а также позволяющий модифицировать эти шаблоны для изменения значений по умолчанию в конфигурации QQ клиента.

Например, можно изменить список плагинов, которые будут загружены по умолчанию. Формат шаблонного файла представлен ниже:

Обратите внимание: Шаблонные файлы имеют специальное оформление (в основном это установка многих параметров с чтением из переменных окружения, так как wqcontroller передает параметры запуска клиенту через переменные окружения).```perl use Mojo::Webqq; $|=1; my $client = Mojo::Webqq->new(log_head=>"[$ENV{MOJO_WEBQQ_ACCOUNT}][$$]"); $0 = "wqclient(" . $client->account . ")" if $^O ne "MSWin32"; $client->load(["ShowMsg","UploadQRcode"]); $client->load("Openqq", data=>{listen=>[{host=>"127.0.0.1", port=>$ENV{MOJO_WEBQQ_PLUGIN_OPENQQ_PORT}}], post_api=>$ENV{MOJO_WEBQQ_PLUGIN_OPENQQ_POST_API} || undef, post_event=>$ENV{MOJO_WEBQQ_PLUGIN_OPENQQ_POST_EVENT} // 1, post_media_data=>$ENV{MOJO_WEBQQ_PLUGIN_OPENQQ_POST_MEDIA_DATA} // 1, poll_api=>$ENV{MOJO_WEBQQ_PLUGIN_OPENQQ_POLL_API} || undef, poll_interval=>$ENV{MOJO_WEBQQ_PLUGIN_OPENQQ_POLL_INTERVAL}}, call_on_load=>1); $client->run();


### Описание состояний работы клиента

При работе клиента он проходит через различные состояния, некоторые из которых являются блокирующими, то есть представляют собой бесконечные циклы, которые могут быть прерваны только при выполнении определённых условий.

Большинство API работают в режиме неблокировки во время работы, поэтому большинство этих блокирующих процессов делает невозможной работу большинства API (отправка сообщений/получение сообщений и т.д.).

Например: В состоянии сканирования входа, до завершения входа невозможно использовать API для отправки сообщений.

Знание различий между этими состояниями поможет вам правильно использовать API.|   Состояние  |Режим    |Описание состояния
|------------|------------|:---------------------------------------------|
|init        |-           |Исходное состояние после создания клиента      |
|loading     |блокирующее|Клиент загружает плагины                       |
|scanning    |блокирующее|Ожидание сканирования телефона                  |
|confirming  |блокирующее|Ожидание нажатия кнопки [Подтвердить]          |
|updating    |блокирующее|Обновление информации о пользователе, друзьях и группах|
|running     |неблокирующее|Клиент работает, может нормально получать и отправлять сообщения, **соответствующие API доступны**|
|stopped     |блокирующее|Клиент остановлен                               |

Общий процесс миграции состояния клиента:`init` => `loading` => `scanning` => `confirming` => `updating` => `running` => `stopping`

Состояние клиента в реальном времени обновляется в файл `mojo_webqq_state_{название_клиента}.json`, который можно использовать для получения информации о вышеупомянутых изменениях состояния.

Также состояние может быть проверено через интерфейс `/openqq/check_client`.

(Интерфейс `/openqq/check_client` фактически возвращает данные из файла `mojo_webqq_state_{название_клиента}.json`)

### Запуск QQ-клиента

|API|Запуск QQ-клиента|
|---|------------------|
|URI|/openqq/start_client|
|Метод запроса|GET|
|Параметры запроса|**client**: Уникальный номер QQ-аккаунта, используемый для отличия различных клиентов QQ.<br>Другие параметры, поддерживаемые методом Mojo::Webqq#new, такие как log_level/log_encoding/tmpdir и т.д., см. [Mojo::Webqq#new](https://metacpan.org/pod/distribution/Mojo-Webqq/doc/Webqq.pod#new)|
|Пример использования|http://127.0.0.1:4000/openqq/start_client?client=webqq_client_01<br>http://127.0.0.1:4000/openqq/start_client?client=webqq_client_01&log_level=debug|

Примечание: если используется способ входа с использованием пароля, параметр **client** должен содержать уникальный номер QQ-аккаунта, иначе вход будет невозможен. Пример:

http://127.0.0.1:4000/openqq/start_client?client=12345678&login_type=password&pwd=25d55ad283aa400af464c76d713c07ad


Ответ JSON:

{"client":"webqq_client_01","code":0,"pid":32294,"port":5000,"status":"success"}


### Остановка QQ-клиента|API|Остановка QQ-клиента|
|---|---------------------|
|URI|/openqq/stop_client|
|Метод запроса|GET|
|Параметры запроса|**client**: Уникальный номер QQ-аккаунта, используемый для различия различных клиентов QQ|
|Пример использования|http://127.0.0.1:4000/openqq/stop_client?client=webqq_client_01|Ответ JSON:

{"client":"webqq_client_01","code":0,"pid":32294,"port":5000,"status":"успех"}


### Получение QR-кода для входа

|API|Получение списка всех QQ-клиентов|
|---|-----------------------------|
|URI|/openqq/get_qrcode|
|Метод запроса|GET|
|Параметры запроса|**client**: Указанный клиент для запроса, иначе выводятся все клиенты|
|Пример использования|http://127.0.0.1:4000/openqq/get_qrcode?client=xxx|

GET /openqq/get_qrcode?client=xxx HTTP/1.1 User-Agent: curl/7.29.0 Host: Yöstemliche Änderungen sind nicht erforderlich. Accept: /

< HTTP/1.1 200 OK < Content-Type: image/png < Cache-Control: no-cache < Date: Mon, 24 Oct 2016 02:11:31 GMT < Content-Length: 37821 < Server: Mojolicious (Perl)


## Проверка состояния клиентов QQ

|   API  |Позволяет получить список одного или всех клиентов QQ |
|--------|:----------------------------------------------------|
|uri     |/openqq/check_client|
|Метод запроса|GET|
|Запросные параметры|**client**: Опционально, указывает на клиента, которого требуется проверить; если не указано, выводятся все клиенты|
|Пример использования|http://127.0.0.1:4000/openqq/check_client<br>http://127.0.0.1:4000/openqq/check_client?client=xxx|Формат возвращаемых данных JSON:
```json
{
    "code": 0,
    "client": [
        {   # Первый клиент
            "account": "123", # Аккаунт клиента
            "state": "scanning", # Состояние клиента init|loading|scanning|confirming|updating|running|stop
            "tmpdir": "/tmp",
            "cookie_path": "/tmp/mojo_weixin_cookie_123.dat",
            "pid_path": "/tmp/mojo_weixin_pid_123.pid",
            "qrcode_path": "/tmp/mojo_weixin_qrcode_123.jpg",
            "state_path": "/tmp/mojo_weixin_state_123.json",
            "http_debug": "0",
            "log_encoding": null,
            "log_level": "info",
            "log_path": null,
            "os": "linux",
            "pid": 2380,
            "plugin": [
                {
                    "auto_call": null,
                    "call_on_load": 1,
                    "name": "Mojo::Webqq::Plugin::Openqq",
                    "priority": 98
                },
                {
                    "auto_call": 1,
                    "call_on_load": 0,
                    "name": "Mojo::Webqq::Plugin::ShowMsg",
                    "priority": 100
                }
            ],
            "port": 5000,
            "start_time": "1477273654",
            "version": "1.2.2"
        }
    ]
}
```### Поддержка других API для одиночного аккаунта QQ

Информация о конкретном аккаунте QQ, отправка сообщений, отчеты о сообщениях и другие операции выполняются аналогично [API для одиночного аккаунта](API.md), за исключением того, что URL теперь содержит параметр `client=xxx`, который используется для разделения различных клиентов.

#### Получение информации о пользователе QQ:

http://127.0.0.1:4000/openqq/get_user_info?client=webqq_client_01

#### Отправка сообщения другу с помощью конкретного аккаунта QQ:

http://127.0.0.1:4000/openqq/send_friend_message?client=webqq_client_01&id=xxxx&content=hello

Каждый аккаунт QQ будет независимо отправлять отчеты о сообщениях. Например, если адрес POST API для отправки отчетов установлен как http://127.0.0.1/post_message,

то при отправке каждого отчета будет **автоматически добавлен параметр client**, чтобы отличить различные клиенты.

ПОСТ http://127.0.0.1/post_message?client=webqq_client_01

ПОСТ http://127.0.0.1/post_message?client=webqq_client_02

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/sjdy521-Mojo-Webqq.git
git@api.gitlife.ru:oschina-mirror/sjdy521-Mojo-Webqq.git
oschina-mirror
sjdy521-Mojo-Webqq
sjdy521-Mojo-Webqq
master