client=xxx
, чтобы различать различных клиентов аккаунтовАдрес API | Описание API |
---|---|
/openqq/start_client | Запуск одного клиента QQ |
/openqq/stop_client | Остановка одного клиента QQ |
/openqq/check_client | Проверка состояния клиента QQ |
/openqq/get_qrcode | Получение QR-кода входа |
Совместимость с другими API одного аккаунта QQ | Совместимость с другими API одного аккаунта QQ |
Вы можете сохранить следующий код как исходный файл (обязательно используйте 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-аккаунта, иначе вход будет невозможен. Пример:
Ответ 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 )