Как разобрать данные из url?

В url есть данные вида, это я уже отформатировал их, они могут быть без urlencode()

/botorder.php#tgWebAppData=user={
"id":185197,
"first_name":"Алекс",
"last_name":"Кова",
"language_code":"ru",
"allows_write_to_pm":true,
"photo_url":"https://ifKXEnhs.svg"}
&chat_instance=1059515225
&chat_type=supergroup
&auth_date=174688
&signature=vWpE4HWBw
&hash=d07177fab235f8
&tgWebAppVersion=9.0
&tgWebAppPlatform=ios
&tgWebAppThemeParams={
"section_separator_color":"#545458",
"bg_color":"#000000",
"bottom_bar_bg_color":"#1d1d1d",
"link_color":"#3e88f7",
"text_color":"#ffffff",
"accent_text_color":"#3e88f7",
"section_header_text_color":"#8d8e93",
"button_color":"#3e88f7",
"secondary_bg_color":"#000000",
"header_bg_color":"#1a1a1a",
"subtitle_text_color":"#98989e",
"hint_color":"#98989e",
"button_text_color":"#ffffff",
"section_bg_color":"#1c1c1d",
"destructive_text_color":"#eb5545"}

Как такие параметры можно разобрать?

Пробовал как обычно, но не получается

<input name="name2" id="name2" type="text" value="">
const url = new URL(window.location);
$('#name2').val(url.searchParams.get('first_name'));

Ответы (2 шт):

Автор решения: Alex Krass

Через самостоятельный парсинг hash составляющей URL, можно воспользоваться встроенными метода браузера для помощи в этом деле.

const url = new URL(`http://test.my?#tgWebAppData=user={
"id":185197,
"first_name":"Алекс",
"last_name":"Кова",
"language_code":"ru",
"allows_write_to_pm":true,
"photo_url":"https://ifKXEnhs.svg"}
&chat_instance=1059515225
&chat_type=supergroup
&auth_date=174688
&signature=vWpE4HWBw
&hash=d07177fab235f8
&tgWebAppVersion=9.0
&tgWebAppPlatform=ios
&tgWebAppThemeParams={
"section_separator_color":"#545458",
"bg_color":"#000000",
"bottom_bar_bg_color":"#1d1d1d",
"link_color":"#3e88f7",
"text_color":"#ffffff",
"accent_text_color":"#3e88f7",
"section_header_text_color":"#8d8e93",
"button_color":"#3e88f7",
"secondary_bg_color":"#000000",
"header_bg_color":"#1a1a1a",
"subtitle_text_color":"#98989e",
"hint_color":"#98989e",
"button_text_color":"#ffffff",
"section_bg_color":"#1c1c1d",
"destructive_text_color":"#eb5545"}`);

/* Парсинг с помощью URLSearchParams */
const params = new URLSearchParams(
  url.hash.substring(1) 
);

/* Получение параметра */
const tgData = params.get("tgWebAppData");

/* Если он сложный, можно еще раз прогнать в URLSearchParams */
const user = new URLSearchParams(params.get("tgWebAppData"))

/* Спарсить в JSON */
const userData = JSON.parse(user.get('user'))

console.log(userData)

→ Ссылка
Автор решения: Solt

Какой-то винегрет, а не параметры.

  1. Тут нет параметров вовсе, ибо параметры бывают после символа '?'. А тут - огромный хеш-тег.
  2. url.searchParams.get('first_name') не сработает, Даже если был бы символ '?', тут нет такого параметра. Есть параметр tgWebAppData, содержащий текст 'user={...}'. Чтоб его разобрать надо отрезать 'user=' а остальное - через JSON.parse

Лучше не мучаться с разбором такого запроса, а договориться с отправляющим, чтобы сделал однотипные данные - либо всё как положено - '?key=val&...&keyN=valN', либо, если нужен многомерный массив, всё одним параметром, содержащим JSON-текст

→ Ссылка