Как отправлять в ESB (1С: Шина) прямые сообщения по amqp 1.0 на Python?
Как отправить сообщение в 1С:шину напрямую, используя Python по протоколу amqp 1.0? Я пробовал библиотеки uamqp, qpid proton, ни одну не осилил, т.к. не нашел толковых примеров реализации.
Подключаюсь к шине так:
import requests
import base64
url = 'http://localhost:9090/auth/oidc/app-token'
id = 'id-example'
secret = 'pass-example'
qry = '{id}:{secret}'.format(id=id, secret=secret)
basicAuthKey = base64.b64encode(str.encode(qry)).decode('ascii')
headers = {
'Authorization': 'Basic {}'.format(basicAuthKey),
'Content-Type': 'application/x-www-form-urlencoded'
}
resp = requests.post(url, headers=headers, data='grant_type=client_credentials')
if (not resp.ok):
print('Auth error: ' + resp.reason)
authToken = resp.json()['id_token']
Пробовал через pika:
conn = pika.BlockingConnection(pika.ConnectionParameters('host',
port,
'channel'))
channel = conn.channel()
with open('output_dict.json', 'r') as fp:
lines = fp.readlines()
channel.basic_publish('exchange', 'queue', ''.join(lines))
Вываливает ошибку:
pika.adapters.utils.connection_workflow.AMQPConnectorStackTimeout: Timeout during AMQP handshake
Что делать? Может не там копаю, подскажите, кто-то сталкивался с таким?
Ответы (1 шт):
Решил проблему кардинально, использовал nodeJS для отправки сообщений в шину, и решил переписать весь остальной скрипт. Использовалась библиотека rhea-promise на TS , прописываем хост, токен, пароль, порт, канал в examples/send.ts
const host = process.env.AMQP_HOST || "host";
const username = process.env.AMQP_USERNAME || "sharedAccessKeyName";
const password = process.env.AMQP_PASSWORD || "sharedAccessKeyValue";
const port = parseInt(process.env.AMQP_PORT || "5671");
const senderAddress = process.env.SENDER_ADDRESS || "address";
Запускаем скрипт командой
ts-node ./examples/send.ts
Наслаждаемся успехом.