Как извлечь URL из исходного кода веб-страницы? - PullRequest
1 голос
/ 11 апреля 2019

Я пытаюсь настроить поток для некоторых сканеров, которые я нашел на Broadcastify. Проблема заключается в том, что используемые ими URL-адреса являются динамическими и только одинаковыми в течение нескольких часов. Я хотел бы создать сценарий оболочки, который может просто сканировать страницу, с которой осуществляется доступ к потоку (которая имеет статический URL-адрес), и возвращать текущий URL-адрес потока, который затем можно подать на аудиоплеер.

Например, прямо сейчас следующий поток в https://www.broadcastify.com/listen/feed/30185/web имеет поток в http://audio12.broadcastify.com/kq2ydfr1jz98shw.mp3

Однако ссылка на поток будет работать только в течение короткого периода времени. Мне нужен поток MP3, подобный приведенному выше.

enter image description here

У меня только небольшой опыт работы со сценариями оболочки, поэтому мне интересно, какой лучший подход был бы здесь. В частности, моя первая проблема заключается в том, что если я просто "Просмотреть исходный код страницы" и ищу "mp3", результатов нет. Я могу найти URL только путем проверки элемента (инструменты разработчика F12) и, например, в Chrome, перейдя в Application & rarr; Рамки & rarr; Средства массовой информации. Я думал, что мог бы сделать «источник просмотра кадра» на аудиоплеере в прошлом, но сейчас этого нет.

Я полагаю, я мог бы использовать grep, если бы мне удалось CURL исходного кода, но я не уверен, что мне нужно здесь CURL, если это имеет смысл.

UPDATE

Спасибо mk12 за понимание. Исходя из этого, вот мой сценарий оболочки:

#!/bin/bash

curl "https://www.broadcastify.com/listen/feed/$1/web" | grep webAuth > /var/tmp/broadcastifyauth$1.txt
pta=`cat /var/tmp/broadcastifyauth$1.txt | sed -i 's/$.ajaxSetup({ headers: { "webAuth": "//g' /var/tmp/broadcastifyauth$1.txt`
pta=`cat /var/tmp/broadcastifyauth$1.txt | sed -i 's/" }});//g' /var/tmp/broadcastifyauth$1.txt`
auth=`cat /var/tmp/broadcastifyauth$1.txt`
echo $auth

curl "https://www.broadcastify.com/listen/webpl.php?feedId=$1" --request POST --header "webAuth: $auth" --data 't=14' >/var/tmp/broadcastify$1.txt

pta=`cat /var/tmp/broadcastify$1.txt | grep -o 'http://[^"]*' > /var/tmp/broadcastify$1.b.txt`
pta=`cat /var/tmp/broadcastify$1.b.txt`
echo $pta
#pta=`cat /var/tmp/broadcastify$1.txt | sed -n '/<audio/s/^.*<audio width="300px" id="mePlayer_$1" src="\([^"]*\)".*/\1/p' > /var/tmp/broadcastify$1.b.txt`
#ptb=`cat /var/tmp/broadcastify$1.b.txt`
#echo $ptb

Вот его вывод:

root@na01:/etc/asterisk/scripts/music# ./broadcastify.sh 30185
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  9175  100  9175    0     0  51843      0 --:--:-- --:--:-- --:--:-- 52130
74f440ad812f0cc2192ab782e27608cc
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   946    0   942  100     4   3851     16 --:--:-- --:--:-- --:--:--  3844
http://relay.broadcastify.com/b94hfrp5k1s0tvy.mp3?xan=DCJP4HvtwMoXdH9HvtwMJ5vv342DfleDptcoX3dH9H48vtwMJ

Works!

1 Ответ

1 голос
/ 12 апреля 2019

URL-адрес mp3 отсутствует в исходном HTML-документе - он добавляется в DOM позже с помощью кода JavaScript.Вот почему вы не можете найти его в «View source source», но можете это сделать с «Inspect element».

Если вы запустите curl https://www.broadcastify.com/listen/feed/30185/web, вы увидите следующее где-то посередине:

<div id="fp" width="300px"></div>
<script>
    $.ajaxSetup({ headers: { "webAuth": "74f440ad812f0cc2192ab782e27608cc" }});
    $('#fp').load('/listen/webpl.php?feedId=30185',{t:14});
</script>

Обратите внимание, в частности, что он загружает контент (используя jQuery .load ) в изначально пустое <div id="fp"> чуть выше.Когда вы используете «Inspect element» для поиска аудиоплеера, вы обнаружите, что он находится внутри этого div.

Прежде чем пытаться воспроизвести этот запрос с помощью curl, я посмотрел на вкладке Network инструментов разработчика, чтобыпосмотрим, что сделал браузер.Фильтрация по запросу "прослушать" обнаружила запрос webpl.php.Вот соответствующая информация на вкладке «Заголовки»:

  • URL: https://www.broadcastify.com/listen/webpl.php?feedId=30185
  • Запрос
    • POST /listen/webpl.php HTTP / 1.1
    • Тип содержимого: application / x-www-form-urlencoded
    • webAuth: 74f440ad812f0cc2192ab782e27608cc
  • Параметры строки запроса
    • feedId:30185
  • Данные запроса
    • MIME Тип: application / x-www-form-urlencoded
    • t: 14

Давайте воспроизведем этот запрос с помощью curl:

curl 'https://www.broadcastify.com/listen/webpl.php?feedId=30185' \
  --request POST \
  --header 'webAuth: 74f440ad812f0cc2192ab782e27608cc' \
  --data 't=14'

Вот результат:

<script src="/scripts/me_4.2.9/mediaelement-and-player.min.js"></script>
<link rel="stylesheet" href="/scripts/me_4.2.9/mediaelementplayer.min.css"/>
<audio width="300px" id="mePlayer_30185" src="http://relay.broadcastify.com/9wzfd3hrpyctvqx.mp3?xan=DCJP4HvtwMoXdH9HvtwMJ5vv342DfleDptcoX3dH9H48vtwMJ" type="audio/mp3" controls="controls"
       autoplay="true">
</audio>
<script>
    $('audio').mediaelementplayer({
        features: ['playpause', 'current', 'volume'],
        error: function () {
            alert("Feed has disconnected from the server.  This could be due to a power outage, network connection problem, or server problem.  Click OK to restart the player.  If the player fails to connect then the feed might be down for an extended timeframe.");
            location.reload();
        }
    });
</script>
<br />
<div class="c">If the feed does not automatically play, click or touch the play icon in the player above.</div>

Это ваша mp3-ссылка в атрибуте src <audio> тег.Если мы попытаемся получить его:

$ curl http://relay.broadcastify.com/9wzfd3hrpyctvqx.mp3?xan=DCJP4HvtwMoXdH9HvtwMJ5vv342DfleDptcoX3dH9H48vtwMJ
Moved Temporarily. Redirecting to http://audio13.broadcastify.com/9wzfd3hrpyctvqx.mp3?nocache=2623053&xan=DCJP4HvtwMoXdH9HvtwMJ5vv342DfleDptcoX3dH9H48vtwMJ

Если вы попытаетесь получить доступ к этому URL (или к исходному с помощью -L с указанием curl следовать перенаправлениям), поток mp3 начнет печататься на вашем терминале каккуча бессмысленных символов.

Итак, ваш сценарий оболочки должен попасть в конечную точку /listen/webpl.php, а не пытаться очистить HTML-страницу веб-плеера.Или, возможно, просто почистите страницу, чтобы сначала получить токен webAuth.

Обновление

В ответ на ваше обновление с помощью сценария оболочки приведен упрощенный сценарий, который делает то же самое, а также удаляетПрефикс «Перемещено временно», чтобы получить аудио URL.Обратите внимание, что нет необходимости использовать временный файл, и синтаксис $(...) предпочтительнее синтаксиса `...`:

#!/bin/bash

# I always start my scripts with this. See https://sipb.mit.edu/doc/safe-shell/
set -eufo pipefail

auth=$(curl -s "https://www.broadcastify.com/listen/feed/$1/web" \
    | grep webAuth \
    | head -n 1 \
    | sed 's/^.*"webAuth": "//;s/".*$//')

relay_url=$(curl -s "https://www.broadcastify.com/listen/webpl.php?feedId=$1" \
    -H "webAuth: $auth" -d 't=14' \
    | grep -o 'http://[^"]*')

audio_url=$(curl -s "$relay_url" | cut -d' ' -f5)

echo "$audio_url"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...