【问题标题】:Get and update text every few seconds from an HTTP source to an HTTPS website每隔几秒钟从 HTTP 源获取和更新文本到 HTTPS 网站
【发布时间】:2018-04-10 02:40:50
【问题描述】:

所以,我有一个广播电台,我的主机提供商没有 SSL 证书,我有一个带有 SSL 证书的网站,我想在其中显示当前曲目名称(再次提及,只有曲目名称,而不是艺术家)正在广播电台播放。曲目名称可以在这里找到:http://91.121.139.194:8157/currentsong?sid=1

以上链接的输出显示:X - X - Y

X - 艺术家, Y - 曲目名称。 我不希望显示第一个 X,因此它不会显示艺术家两次(一次来自艺术家元数据,一次来自曲目名称元数据)

问题是我无法将文本从 HTTP 获取到 HTTPS。 我尝试了 Ajax 和 Javascript。一个个都被屏蔽了。

我知道显示来自不安全 HTTP 的数据会对我拥有的 HTTPS 造成风险,这就是为什么我会隐藏曲目名称,直到用户单击播放。播放音频也有风险,因为它是从 HTTP 发送的......

我的主机提供商也提供了一个 API,但它附带的 javascript 也从 HTTP 请求数据,被阻止...

有什么解决方法吗?我认为放置我使用的 Ajax 和 Javascript 是没有意义的,因为这两种方法都不起作用。我也听说过使用 curl 或 file_get_contents,但我真的不想花更多的时间,就像我尝试的前两种方法一样,我只是发现它不起作用。我需要关于该怎么做的建议。

另外,如果有更好的方法从 ShoutCast 服务器获取曲目名称,我可以接受。

顺便说一句,我真的不知道为什么我的主机提供商不使用 OpenSSL……它是免费的。

编辑:我正在考虑的另一个想法是从实际的 .mp3 流媒体源中获取曲目标题元数据。但它来自一个不安全的 HTTP,我不确定它是否会工作。

【问题讨论】:

  • 我认为您需要在您的服务器上创建一个代理端点,它将调用该 http 源,因为正如您所说 - 如果您使用纯 JS,我将被浏览器阻止跨度>
  • @AlonEitan 我期待有人提出这个建议......但那是我认为我无法做到的事情......
  • 好吧,看看其他用户是否有更好的建议/替代方案会很有趣,因为这是我能想到的唯一解决方案
  • @AlonEitan 找到了解决方法。
  • @SumutiuMarius 感谢您及时通知我。所以我看到你毕竟创建了一个代理:)

标签: javascript php jquery ajax ssl


【解决方案1】:

找到了解决方法。 这可能对大多数拥有广播电台的人有所帮助。

我在 Internet-Radio 上注册了我的电台。我不会派你去那里注册你的广播电台。您可能希望对任何您想要的网站执行此操作,但请确保它们通过 HTTPS 显示所有数据以使其正常工作。

他们很可能有一个代理来将数据从不安全的 HTTP 获取到 HTTPS,并且他们的整个网站都是安全的。添加您的广播电台后,在顶部搜索栏上搜索它,并确保您只显示搜索中的广播电台。这有助于file_get_contents 获得更少的 HTML,从而更快地加载。像我一样,获取最少的关键字以仅显示您的广播电台: https://www.internet-radio.com/search/?radio=Riddim+Dubstep+-+Keep

检查元素并找到带有曲目名称的标签。右键单击它并复制 -> 在 Chrome 上复制 XPath,不确定在其他浏览器上。实际上我花了一些时间才发现我可以从右键单击复制 XPath -> Inspect...

<?php
libxml_use_internal_errors(false);
$html = file_get_contents('https://www.internet-radio.com/search/?radio=Riddim+Dubstep+-+Keep');
$doc = new DOMDocument;
$doc->loadHTML($html);
$xpath = new DOMXpath($doc);
$node = $xpath->query('/html/body/div[1]/div[1]/div[1]/table/tbody/tr/td[3]/b')->item(0);
echo $node->textContent;
?>

使用您刚刚复制的 XPath 修改 $xpath-&gt;query,并使用您获得 XPath 的该页面的 URL 修改 URL。

将此文件另存为

trackid.php

您将添加到您的主页的以下代码。

<script src="jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
function trackid() {
$.get('trackid.php', function(data) {
$(".TrackTitle").text(data);
}); 
}
trackid()
setInterval(trackid, 5000);
</script>
<div class="TrackTitle">Loading...</div>

DIV TrackTitle将放置在您希望显示当前歌曲的位置。您可能需要向其添加一些 CSS 以将文本格式化为更适合页面的格式。

注意:不要忘记从 Google 的 API 下载最新的 jquery.min.js 并更新指向它的链接。我在我的虚拟主机上下载了它以加快加载速度,但您可以毫无问题地使用直接链接。

【讨论】:

    【解决方案2】:

    如果您的网络托管服务提供商已打开您用于 Shoutcast 站的端口,请执行我将在下面解释的操作。如果没有,请检查下面的其他答案。

    方法一

    index.php 附近创建一个名为trackid.php 的文件,并输入以下代码:

    <?php
    $server = "http://91.121.139.194:8157/stats?sid=1";
    $srv_url = urlencode($server);
    $sc_stats = simplexml_load_file($srv_url);
    echo $sc_stats->SONGTITLE
    ?>
    

    这会将数据(歌曲名称)从不安全的 HTML 解析为安全的 HTML,由echoit 直接从安全连接访问。 不要忘记更换IP和端口。

    index.php 添加这个:

    <script src="jquery.min.js" type="text/javascript"></script>
    <script type="text/javascript">
    function trackid() {
    $.get('trackid.php', function(data) {
    $(".TrackTitle").text(data);
    }); 
    }
    trackid()
    setInterval(trackid, 5000);
    </script>
    <div class="TrackTitle">Loading...</div>
    

    这种方法的缺点是它会在您的服务器上为每个用户创建一个后台进程,因为 javascript 要求为每个用户输出一个 PHP 文件。

    方法二

    您还可以设置trackid.php 以每 6 秒将输出(曲目名称)保存在 FTP 上的文本文件中:

    <?php
    $server = "http://91.121.139.194:8157/stats?sid=1";
    $LoopMaximum = 10;
    $LoopInitial = 0;
    Loop: {
        if ($GLOBALS["LoopInitial"] < $GLOBALS["LoopMaximum"]) {
            $srv_url = urlencode($GLOBALS["server"]);
            $sc_stats = simplexml_load_file($srv_url);
            $node = $sc_stats->SONGTITLE;
            $location = fopen("playing.txt","w+");
            fwrite ($location, $node);
            fclose($location);
            $GLOBALS["LoopInitial"]++;
            sleep(6);
            goto LoopFollow;} else if ($GLOBALS["LoopInitial"] == $GLOBALS["LoopMaximum"]){
            exit();}
    }
    LoopFollow: {
        if ($GLOBALS["LoopInitial"] < $GLOBALS["LoopMaximum"]) {
            $srv_url = urlencode($GLOBALS["server"]);
            $sc_stats = simplexml_load_file($srv_url);
            $node = $sc_stats->SONGTITLE;
            $location = fopen("playing.txt","w+");
            fwrite ($location, $node);
            fclose($location);
            $GLOBALS["LoopInitial"]++;
            sleep(6);
            goto Loop;} else if ($GLOBALS["LoopInitial"] == $GLOBALS["LoopMaximum"]){
            exit();}
    }
    ?>
    

    每分钟添加一个 CronJob:

    php /home/user/public_html/trackid.php >/dev/null 2>&1
    

    注意:每个虚拟主机的 PHP 路径可能不同。

    现在每 5 秒从文本文件中读取一次曲目:

    <script type="text/javascript">
    function trackid() {
    var client = new XMLHttpRequest();
    client.open('GET', '/playing.txt');
    client.onreadystatechange = function() {
    var trackName = client.responseText;
    $(".TrackTitle").text(trackName);
    }
    client.send();
    }
    trackid()
    </script>
    setInterval(trackid, 5000);
    <div class="TrackTitle">Loading...</div>
    

    此方法没有缺点,但您需要能够访问 CronJobs 并至少允许 5 个后台进程。 曲目名称将作为 DIV 元素上的文本。然后你可以用 CSS 格式化它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      相关资源
      最近更新 更多