Показать полную графическую версию : вытянуть информацию из 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 мы имеем дело с объектами, а не с текстом.
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.