Войти

Показать полную графическую версию : вытянуть информацию из html полученного через curl


Страниц : [1] 2 3 4 5 6 7 8

Griboed0ff
16-04-2020, 08:26
Доброго всем времени суток. Есть задача, которую надо решить именно через bat. Через curl скачивается страничка и из нее нужно извлечь нужную информацию, на скрине отмечено, что нужно вытянуть мак-адрес, номер телефона, модель и серийный номер. На данный момент батник уже может: узнает какая подсеть на компе, потом сканит диапазон из этой подсети, потом curl скачивает странички с айпишки с данными. А вот далее нужно, чтобы батник мог как-то вытянуть данные со странички и плюс как-то мог сам подставить все странички, которые есть в папке.

Griboed0ff
16-04-2020, 08:27
@echo off
::chcp 866
cd /d "%~d0%~p0"
:: Удаляем файлы с прошлого запуска
ERASE 1.txt, 2.txt, 3.txt, 4.txt
:: узнаем ip пк
setlocal enabledelayedexpansion
(for /f "usebackq tokens=2 delims=:" %%a in (`ipconfig ^| findstr /r "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"`) do (
set _temp=%%a
set _ipaddress=!_temp:~1!
echo !_ipaddress! >1.txt
))
:: убираем последнюю цыфру ip
for /F %%i in (1.txt) do set result=%%i
set str=%result%
Echo %str:~0,7% >2.txt
:: берем предыдущее значение и пингуем 130-190.
for /F %%i in (2.txt) do set result2=%%i
for /l %%i in (130,1,190) do ping -n 1 -w 400 -l 1 %result2%.%%i >nul 2>&1 && arp -a %result2%.%%i|findstr "динам">>3.txt
:: выбираем из списка только ip
FOR /f "usebackq delims= " %%i IN ("3.txt") DO echo %%i>> 4.txt
::подставляем ip в команду скачивания странички.
FOR /f "usebackq delims=" %%i IN ("4.txt") DO (
set result3=%%i
D:\bat\phone\curl-7.69.1-win64-mingw\bin\curl -k -o %%i.txt https://%%i/CGI/Java/Serviceability?adapter=device.statistics.device >nul 2>&1
)
::ищем и копируем нужно на страничке

pause

в общем батник для сбора информации о телефонах в подсети, в которой находится пк. У телефонов только есть веб морда, с которой есть нужная инфа.

DJ Mogarych
16-04-2020, 08:57
именно через bat »
Powershell не используется из принципа?


$html = (gc "D:\temp\10.83.3.150.html.txt" -encoding utf8) -replace "<.*?>",";" -split ';+ ' -replace "^.*;"

$obj = [pscustomobject]@{'MAC-адрес'= $html[-18]
'Номер телефона'= $html[-16]
'Серийный номер'= $html[-11]
'Номер модели'= $html[-10]
}

Griboed0ff
16-04-2020, 09:37
Powershell не используется из принципа? »

Я ни разу не пользовался, если использовать Powershell, то надо переписывать и весь остальной батник, либо как-то запускать данный скрипт из батника.

DJ Mogarych
16-04-2020, 10:17
Вряд ли переписать будет сложно.
В Powershell есть команда curl, это не точная копия, но, полагаю, с вашей задачей справится.

На мой взгляд, это гораздо понятнее батников с их нагромождением костылей и спецсимволов. К тому же, в PS мы имеем дело с объектами, а не с текстом.

Iska
16-04-2020, 10:17
Griboed0ff, переписывайте.

Griboed0ff
16-04-2020, 10:17
Пробовал запустить отрабатывает без ошибок, но где результат посмотреть или записать его в файл?!

Вряд ли переписать будет сложно. »

Я сегодня первый раз запустил ps1 скрипт, я вообще ничего не знаю про него и не могу даже вывод скрипта вашего увидеть. Что-то написать сейчас это за гранью фантастики.

DJ Mogarych
16-04-2020, 10:22
Я поместил результат в переменную $obj.
Чтобы вывести её содержимое, нужно написать $obj после скрипта.

Самый наглядный метод - выполнять скрипт из Powershell ISE (см. в меню Пуск). Там есть кнопочка "плей", как на магнитофоне.

Вам файл в каком виде нужен?

Griboed0ff
16-04-2020, 10:27
Я поместил результат в переменную $obj.
Чтобы вывести её содержимое, нужно написать $obj после скрипта. »
спасибо получилось, это просто превосходно по сравнению с батником.
Тогда помогите пожалуйста с остальным: задача снять данные с веб морд айпишек в диапазоне *.*.*.130-*.*.*.190, в подсети где находится комп на котором запускается, сложить это все в .csv или txt

curl на компах не установлен, я просто ложил рядом с батником и указывал в батнике путь к нему. Можно ли в Powershell только встроенными средствами?

DJ Mogarych
16-04-2020, 10:36
Если вы в Powershell выполните что-то типа

(curl "https://192.168.0.130/CGI/Java/Serviceability?adapter=device.statistics.device").rawcontent

(подставьте правильный ip), это будет тот самый html?

Griboed0ff
16-04-2020, 10:50
(подставьте правильный ip), это будет тот самый html? »
Да это он

DJ Mogarych
16-04-2020, 11:05
Приведите кусок того, что будет в результате:

$report = @()
$ips = 130..190 |% {"192.168.0." + $_}

foreach ($ip in $ips) {
if (Test-Connection $ip -Count 1 -Quiet) {
$html = (curl "https://$ip/CGI/Java/Serviceability?adapter=device.statistics.device").rawcontent -replace "<.*?>",";" -split ';+ ' -replace "^.*;"
$obj = [pscustomobject]@{'MAC-адрес'= $html[-18]
'Номер телефона'= $html[-16]
'Серийный номер'= $html[-11]
'Номер модели'= $html[-10]
}
}
$report += $obj
}

$report

Griboed0ff
16-04-2020, 11:28
выдает ошибку
$ips = 130..190 |% {"192.168.0." + $_} »
Подсеть всегда разная, сейчас 10.83.3.0/24, к примеру на другом пк будет 10.80.50.0/24, одинаковость в подсетях только 10.*.*.*/24

DJ Mogarych
16-04-2020, 11:37
Тогда замените строку

$ips = 130..190 |% {"192.168.0." + $_}

на

$ips = "10.83.3.1","10.83.3.2"

, где это будет два заведомо правильных IP.

Griboed0ff
16-04-2020, 12:11
вписал два реальных ip на которых точно есть нужная html страничка.

DJ Mogarych
16-04-2020, 12:54
Вставьте в начало скрипта вот этот код:

add-type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

Griboed0ff
16-04-2020, 13:03
Вставьте в начало скрипта вот этот код: »
Отлично, скрипт отработал. Осталось только как-то заставить его собирать инфу с 130 по 190 ip в подсети где запускается скрипт. Так как у нас организация и подсетей под каждый офис много (тысячи).

DJ Mogarych
16-04-2020, 13:38
Где можно получить IP компов? Есть DNS? Домен? DHCP?

Надо разобраться и найти закономерности строения тех или иных сетей.
Либо, придётся рисовать скрипт для каждой подсети отдельно.

Griboed0ff
16-04-2020, 13:45
можно просто взять ip пк, с которого запускается скрипт, отбросить последнюю цифру и записать в переменную для дальнейшей обработки.
$ips = 130..190 |% {"192.168.0." + $_}, 192.168.0. заменить на переменную с прошлого шага

Griboed0ff
16-04-2020, 14:06
в батнике так и было сделано, но проблема, что в ps я не знаю как это сделать.




© OSzone.net 2001-2012