понедельник, 26 июня 2017 г.

Парсим netsh в cmd и смотрим геолокацию по Wi-Fi точкам доступа


Понадобилось мне тут для одного дела удобная геолокация источника.
То есть, например, ноутбук смотрит доступные ему беспроводные точки доступа и говорит – вот, вижу такие-то.
А на основе данных о точках доступа нынче можно вполне себе узнать примерное местоположение. Через Яндекс, например.
Есть для такой задачи и сервисы, но все они таки платные. Не наш это метод, не спортивно.
Старая-добрая командная строка, пара утилит (родных Windows и не очень) и мы имеем список точек.



Как получить в Windows список видимых точек Wi-Fi? Очень просто – вводим в командную строку

netsh wlan show all

чтобы точно сработало
До этого ещё неплохо включить все имеющиеся беспроводные устройства.
Я делаю так (нужен devcon – скачать x86 x64):

SETLOCAL ENABLEDELAYEDEXPANSION
:: find all wi-fi devices
for /F "eol=: tokens=1 delims=, " %%I IN ('devcon find * ^| find /I "wireless"') DO (
      set WIFIDEV=%%I
    :: Cut some symbols and add asterisks
    set WIFIDEV2=^*!WIFIDEV:~4,17!^*
    :: Mirroring &
    set WIFIDEV3=!WIFIDEV2:^&=^^^&!
    :: Enable all wi-fi adapters. Will work only from admin
    devcon enable !WIFIDEV3!
)

for /F "eol=: tokens=1 delims=, " %%I IN ('devcon find * ^| find /I "802.11"') DO (

    set WIFIDEV0=%%I
    :: Cut some symbols and add asterisks
    set WIFIDEV02=^*!WIFIDEV0:~4,17!^*
    :: Mirroring &

    set WIFIDEV03=!WIFIDEV02:^&=^^^&!

    :: Enable all wi-fi adapters. Will work only from admin

    devcon enable !WIFIDEV03!
)

endlocal

timeout 10

Правда, получаем по результатам команды длиннющую немашиночитаемую простыню, которая годится только для вызова аццкого сотоны.

Ну, так и наши руки не для скуки.


На входе мы имеем примерно такое:

SSID 4: MGTS_GPON_6034
Тип сети: Инфраструктура
Проверка подлинности: WPA2-Personal
Шифрование: CCMP
BSSID 1: ff:ff:ff:f1:dd:e8
Сигнал: 36%
Тип радио: 802.11n
Канал: 1
Базовая скорость (мбит/с): 1 2 5.5 11
Другие скорости (мбит/с): 6 9 12 18 24 36 48 54


А надо нам так (на примере json-синтаксиса Яндекс.Локатор):


{"mac":" ff-ff-ff-ff-a3-b5","signal_strength":-67,"age": 0,},


Пишем, собственно, скрипт парсинга вывода netsh wlan на cmd (или bat, кому как больше нравится):


setlocal enabledelayedexpansion
:: Ищем строки с ключевыми словами
FOR /f "skip=3 tokens=*" %%I in ('FINDSTR /C:"BSSID" /C:"Сигнал:" %RAWDATAFILE%') do (
    :: Для каждого найденного:
    SET TMPSTR=%%I
    :: Удаляем пробелы
    SET "TMPSTR=!!TMPSTR: =!!"
    :: Удаляем слова
    SET "TMPSTR=!!TMPSTR:BSSID1:=!!"
    SET "TMPSTR=!!TMPSTR:Сигнал:=!!"
    :: Заменяем двоеточия на тире
    SET "TMPSTR=!!TMPSTR::=-!!"
    :: Удаляем знаки процента
    SET "TMPSTR=!!TMPSTR:%%=!!"
    :: Разбираемся с силой сигнала. Если текущее
    :: найденное – число, конвертим проценты в децибелы

    SET /a BLNVAR=!COUNT!%%2
    IF !BLNVAR!==1 (
    SET /A TMPSTR=^(!TMPSTR!/2^)-100
)
:: Сохраняем всё в файл
ECHO !TMPSTR!>>tmp1.txt



Ну что ж, netsh wlan распарсили, дадим cmd новую задачу. Нужно привести данные к корректному json-виду для передачи в Яндекс.Локатор. Чтобы ручками не копировать, а сразу карту на нужном месте открыть.


ECHO json^={"common":{"version": "1.0","api_key":"somekey"},"wifi_networks":[>>ywjds.txt
SET /A COUNT=0
FOR /f "tokens=*" %%Z in (tmp1.txt) do (
    SET /a BLNVAR=!COUNT!%%2
    SET TMPSTR=%%Z
    IF !BLNVAR!==0 (
        ECHO ^{^"mac":">>ywjds.txt
        ECHO !TMPSTR!>>ywjds.txt
        ECHO ^","signal_strength":>>ywjds.txt
    )
    IF !BLNVAR!==1 (
        ECHO !TMPSTR!>>ywjds.txt
        ECHO ,"age": 0,}, >>ywjds.txt
    )
    SET /A COUNT+=1
)
ECHO ]}>>ywjds.txt


Тут, по идее, всё должно быть понятно. В файле у нас всё по порядку, сначала мак, потом сила сигнала. Простыми средствами cmd оборачиваем их в корректную json-обёртку. И отправляем:


wget --post-file=ywjds.txt http://api.lbs.yandex.net/geolocation


Одна проблема. Ответ приходит также в виде файла. А мы-то хотим карту! К счастью, и карту сразу открыть можно средствами cmd:


SET LON="XXX"
SET LAT="XXX"
FOR /f "tokens=*" %%J in ('FINDSTR /C:"longitude" geolocation') do (
    SET "LON=%%J"
)
SET "LON=%LON:"longitude" :=%"
SET "LON=%LON: =%"
SET "LON=%LON:,=%"
FOR /f "tokens=*" %%N in ('FINDSTR /C:"latitude" geolocation') do (
    SET LAT=%%N
)

SET "LAT=%LAT:"latitude" :=%"
SET "LAT=%LAT: =%"
SET "LAT=%LAT:,=%"
"C:\Program Files\Mozilla Firefox\firefox.exe" https://www.google.ru/maps/place/@%LAT%,%LON%,18z


Подсунуть Яндекс.Картам в http-запрос широту и долготу у меня не получилось, зато через гугл всё работает. Кто справится с Яндексом – отпишитесь в комментариях!


Скачать скрипт парсер netsh wlan в архиве




Комментариев нет:

Отправить комментарий