How to pass metadata in POST request and then extract it?

Okay, I finally did it

JSON:

{
	"sender": "12321133",
	"message": "hey",
	"metadata": {"aaaa":"AAAAAAA", "bbbbb":"BBBBBB"}  	
}

It’s necessary to implement custom channel -> Custom Connectors

In RestInput class create method _extract_metadata

def _extract_metadata(self, req: Request) -> Text:
    return req.json.get("metadata") or self.name()

Extract metadata in receive method

@custom_webhook.route("/webhook", methods=["POST"])
async def receive(request: Request):
    sender_id = await self._extract_sender(request)
    text = self._extract_message(request)
    metadata = self._extract_metadata(request)
    metadata = "{\"metadata\": \"" + str(metadata) + "\"}"
    metadata = json.loads(metadata)

Few lines below pass extracted metadata into UserMessage constructor

try:
    await on_new_message(
        UserMessage(
            text, collector, sender_id, input_channel=input_channel, metadata=metadata
        )
    )

Then you may extract metadata from last user message in custom action like this (not a perfect code but it works)

events = tracker.current_state()['events']
user_events = []
for e in events:
    if e['event'] == 'user':
        user_events.append(e)

print(user_events[-1]['metadata'])

Action endpoint server output:

{'metadata': "{'aaaa': 'AAAAAAA', 'bbbbb': 'BBBBBB'}"}
127.0.0.1 - - [2019-09-02 13:42:41] "POST /webhook HTTP/1.1" 200 169 0.003994
8 Likes