Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Безымянный динамический Table (https://javascript.ru/forum/events/73024-bezymyannyjj-dinamicheskijj-table.html)

VNad66 14.03.2018 17:56

Безымянный динамический Table
 
Доброго времени суток уважаемые гуру, профи и гости форума. Прошу Вашей помощи с извлечением содержимого безымянной (без id) динамически создаваемой и обновляемой интерфейсом роутера таблицы.

Краткое описание задачи: Есть роутер TL-WR940N (его эмулятор на оф.сайте TP-LINK). С его помощью я планирую отслеживать активность сотрудников нашей компании (их наличии в кабинете фирмы, в коридоре или же за пределами действия сети Wifi компании, т.е. не на рабочем месте). Нанимать профи я не могу позволить, мы еще молодые и бюджет свободных наличных просто не позволяет. Из всевозможных логов роутера я могу определить уровень сигнала к тому или иному устройству в сети а так же его отсутствие в таковой и т.к. роутер всего в одном помещении и на его уровень сигнала ничего из замеченного мной, не влияет, сотрудники компании в активной сети Wifi и есть доказательство что они на рабочем месте а не активничают где-то за пределами офиса. Благодаря динамич.dns мне для подключения к роутеру не требуется прямое присутствие в своей сети wifi.

Что мне удалось выяснить: Веб-интерфейс роутера имеет несколько фреймов, интересующий меня фрейм "mainFrame" (он идет по центру веб-интерфейса и отображает детали выбранного пункта настроек). Доступ к нему я получаю штатно:
var frame_details = document.getElementsByTagName("frame")[2].contentDocument;
Далее уже могу выдергивать некоторые параметры, как "версия морды" или "версия прошивки", да многое другое, по след.примерам:
var software_version = frame_details.getElementById("fversion").innerHTML;
var hardware_version = frame_details.getElementById("hversion").innerHTML;
Но есть и такие которые я не могу выдернуть т.к. они находятся в той части таблицы что не имеет свой id, генерируется самим роутером и обновляется каждые 5 секунд. Хотелось бы запарсить всю таблицу а не ее отдельные элементы, а дальше уже разбор полетов деталей. Вот пример кода генерируемого роутером, он отображает имя Wifi сети (это просто как пример из все той же таблицы)
<tr><td class="Item" id="t_name_ssid">Имя беспроводной сети (SSID):</td><td colspan="2">KafelPlitka<br></td></tr>
<tr><td class="Item" id="t_mode">Режим:</td><td colspan="2"><span id="t_11bgnm">11bgn смешанный</span></td></tr>
<tr><td class="Item" id="t_chanel_width">Ширина канала:</td><td><span id="t_automatic" name="t_automatic">Автоматический</span></td></tr>
<tr><td class="Item" id="t_channel">Канал:</td><td colspan="2"><span id="t_auto" name="t_auto">Автоматически</span> (<span id="t_cur_chl" name="t_cur_chl">Текущий канал</span> 2)</td></tr>
<tr><td class="Item" id="t_mac_addr" name="t_mac_addr">МАС-адрес:</td><td colspan="2">EC-08-6B-64-47-04</td></tr>
<tr><td class="Item" id="t_wds_status">Состояние WDS:</td><td colspan="2"><span id="t_wds_dis">Отключено</span></td></tr>
и как выдернуть эти данные я не понимаю, не могу в силу своей молодости в Javascript и прошу помощи в любом виде и форме. Поиски по id "t_name_ssid" и им подобным ни к чему ни привели

Заранее благодарен за любую помощь
:yes:

Signal 14.03.2018 18:48

ты полез не в те дебри, с роутером можно работать через ssh программно и получать все необходимое оттуда, если чего-то нет, то как правильно теми же его стредствами линукс можно закинуть любую (ну все зависит от размера и версии) программу на него, зайди на свой роутер тем же путти и ты увидишь приглашение командой строки терминала линукс и вперед

Nexus 14.03.2018 19:09

Цитата:

Сообщение от VNad66
Поиски по id "t_name_ssid" и им подобным ни к чему ни привели

Это как? Как вы смогли получить доступ к версии ПО, но не смогли получить поле таблицы?

VNad66 14.03.2018 19:48

Цитата:

Сообщение от Signal (Сообщение 480527)
ты полез не в те дебри, с роутером можно работать через ssh программно и получать все необходимое оттуда

а вот это для меня дебри да и не все от туда можно получить а заливать свой шелл теоретически найти факи в сети можно, но роутер дороже таких экспериментов
Цитата:

Сообщение от Nexus (Сообщение 480528)
Это как? Как вы смогли получить доступ к версии ПО, но не смогли получить поле таблицы?

Просто (из примера) по id "t_name_ssid" он возвращает дефолтное значение значение названия параметра "Имя беспроводной сети (SSID):", а не его значение "KafelPlitka", хотя оператор .innerHTML вроде должен возвращать содержимое а тип, заголовок или оператор

... я еще молод в JS, может подскажите что я делаю не так или пропустил чего?
:(

Signal 14.03.2018 20:21

Цитата:

Сообщение от VNad66 (Сообщение 480535)
а вот это для меня дебри да и не все от туда можно получить а заливать свой шелл теоретически найти факи в сети можно, но роутер дороже таких экспериментов
:(

все то, что отображается в вебе на роутере, 100% есть уже в нем линуксовыские команды для тех операций, перешивать роутер не будет надобности, ну а если с таблицей то попробуй
$('table tr').asArray()

laimas 14.03.2018 21:26

Цитата:

Сообщение от VNad66
хотя оператор .innerHTML вроде должен возвращать содержимое а тип, заголовок или оператор

Таблицу можно перетрясти тем, чем она обладает - https://learn.javascript.ru/traversi...igation-tables. Получить html элемент в ней - td.querySelector(selector), где td ячейка к которой нужно обратиться. А нужно ли искать html элемент в ячейке можно определить по типу узла в ней https://learn.javascript.ru/basic-do...D0%BF-nodetype

Можно использовать querySelectorAll() в купе c forEach().

VNad66 14.03.2018 21:41

В общем с JS-фидлером отпарсил искомый фрейм и выяснилось что там всего одна таблица, название странноватое "autoWidth" да и черт с ним. После форматирования и вычленения всего содержимого получился вполне приемлемый результат, кому интересно - вот код:
var info_frame = document.getElementsByTagName("frame")[2].contentDocument;
	var info_table = info_frame.getElementById("autoWidth");
	var info_result = info_table.innerText;  //--правда в хроме работает только .innerText
	document.write(info_result);
Но все равно, всем спасибо за подсказки и как результат - искомые данные прекрасно извлекаются
:thanks:


Часовой пояс GMT +3, время: 00:04.