如何通过http获取joomla版本?


11

我看过一个解决方案的屏幕截图,那里的Joomla版本仅通过http访问页面而被检测到。

例如,解决方案显示了Joomla版本的所有3位数字。例如2.5.28或1.0.x等,只需通过http访问网页即可。

我想创建一个小型应用程序,以通知服务器上安装的版本。由于我并不总是拥有对FTP存储的完全访问权限,因此我想知道如何从简单的HTTP GET中提取Joomla版本。


您是指自己的网站还是外部网站。如果是外部的,则无法完成
Lodder


@Farahmand-提供的链接对于确切的版本(例如2.5.28)不会有任何帮助。仅主版本号(例如1.52.5
-Lodder,2015年

@Lodder-请检查此链接:显示确切版本的whitefirdesign.com/tools/joomla-version-check.html
Farahmand

@Lodder-我检查了链接,它适用于Joomla 2.5版本,但不适用于某些Joomla 3版本。
Farahmand

Answers:


15

好的,这就是我昨天写的。

仅适用于Joomla 2.5和3.x

  1. 检查http://网址中是否缺少前缀。如果是,则将其添加。请注意,在这种情况下我也不会考虑https://考虑。
  2. 然后,它尝试获取Joomla清单文件并检查是否存在/可读。
  3. 如果存在,则从<version>标签获取值。
  4. 如果XML文件不可读,则我编写了一个后备版本以获取TinyMCE版本。同样,它将尝试从<version>标签读取值。
  5. 从这里开始,我花了很长时间浏览每个Joomla版本的发行说明,以了解哪些版本具有TinyMCE更新。这样做的话,我switch在代码中进一步添加了自己的代码块。这种方法除了给出其中的2个之外,不会给出确切的版本,但会给出平均值。我当时正在考虑检测jQuery版本,但后来意识到很多人将核心版本更新为最新版本,这会使结果不准确。
  6. 如果找不到TinyMCE版本(因此基本上不是Joomla站点),则该函数将返回Unknown

注意:此脚本使用,CURL因此请确保在服务器上启用了该脚本。


class JoomlaVersions
{
    public function getJoomlaVersion($site)
    {
        // Add http prefix if missing
        if (strpos($site,'http://') === false)
        {
            $site = 'http://'.$site;
        }

        // Get the number value from the <version> tag in the XML file
        $dom = new DOMDocument;
        $url = $site . '/administrator/manifests/files/joomla.xml';
        libxml_use_internal_errors(true);

        $exists = $this->XMLexists($url);

        if( $exists )
        {
            $dom->load($url);
            $versions = $dom->getElementsByTagName('version');

            foreach ($versions as $version) 
            {
                return $version->nodeValue;
            }
        }
        else 
        {
            $mce = $this->getTinyMCEversion($site);

            if($mce)
            {
                // Base Joomla version on the TinyMCE version
                switch ($mce)
                {
                    case '3.5.6':
                        $joomla = '3.0.0 - 3.1.6';
                        break;
                    case '4.0.10':
                        $joomla = '3.2.0 - 3.2.1';
                        break;
                    case '4.0.12':
                        $joomla = '3.2.2';
                        break;
                    case '4.0.18':
                        $joomla = '3.2.3 - 3.2.4';
                        break;
                    case '4.0.22':
                        $joomla = '3.3.0';
                        break;
                    case '4.0.28':
                        $joomla = '3.3.1 - 3.3.6';
                        break; 
                    case '4.1.7':
                        $joomla = '3.4.0';
                        break; 
                    default:
                        $joomla = '3.x';
                }

                return $joomla;
            }
            else 
            {
                return 'Unknown';
            }
        }   
    }

    // Get TinyMCE Version 
    private function getTinyMCEversion($site)
    {
        $tinymce = $site . '/plugins/editors/tinymce/tinymce.xml';      
        libxml_use_internal_errors(true);

        $exists = $this->XMLexists($tinymce);

        if( $exists )
        {
            $dom->load($tinymce);
            $vTag = $dom->getElementsByTagName('version');

            foreach ($vTag as $tag) 
            {
                return $tag->nodeValue;
            }
        }
    }

    // Check file exists using CURL
    private function XMLexists($url)
    {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_NOBODY, true);
        curl_exec($ch);
        $getinfo = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        return $getinfo;
    }

}

然后像这样调用该函数:

$version = new JoomlaVersions;
echo $version->getJoomlaVersion('http://joomla.org');

我已经在网站上创建了一个模块作为其他用户的工具:

Joomla版本检测工具

如果您希望分叉它或提交请求,我也创建了一个Github存储库:

Joomla版本检测Github回购

无论如何,正如您所知,我不是后端开发人员,因此可能会对代码进行很多改进。如果您有其他解决方案,或者可以更新我当前拥有的解决方案,请确保将其发布为新答案。


很好的解决方案!无论如何,这意味着您有权访问/administrator/manifests/files/joomla.xml文件。因此,并非总是如此。另一个提到的页面有一个解决方案,该解决方案仅在/页面的GET上检测版本。因此,目前尚不清楚该如何完成。apache日志仅告诉域的一个简单的获取,仅此而已。
hkais 2015年

1
我已经在答案中添加了Github存储库链接。
罗德(Lodder),2015年

出色的答案也有助于回答我在joomla.stackexchange.com/q/182/120上
Neil Robertson

@Joomjunk我在您的站点上尝试了该脚本以检查多个Joomla站点。不工作 响应为空。

@Marc-有些站点可以工作,而其他站点则不会由于主机不允许某些XML文件的读取权限而导致,这是我的版本检测的工作方式。还有另一个站点使用不同的方法来检测版本,但是我不确定它们如何执行此操作。如果我能找到一种更合适的方法,我将予以实施。
2015年

3

如果您只对所管理网站的版本感兴趣,则可以通过打开插件URL创建并安装一个共享Joomla版本的小插件。
http://example.com/plugins/getversion/getversion.php?configuredSecret

  • 我还不需要它,所以我没有代码。但是根据Lodder的回答,您可以看到如何阅读Joomla!mainfest文件/administrator/manifests/files/joomla.xml以返回版本号。

主要针对新手的注意事项:这configuredSecret是仅向授权请求共享公开可见频道的经典方法之一。如果没有更好的方法来保护集成连接,则通常用于连接两个系统。


管理员/清单/文件/joomla.xml是答案,至少是joomla 2.5
Lynob

@Lynob –当然。在这种情况下,OP希望有一个轻量级的应用程序,该应用程序仅接收单个数字,而不接收整个XML文件。因此,您的解决方案适合胖客户端,而我的解决方案适合瘦客户端。
miroxlav

0

我将其添加为单独的答案,因为它不完全是代码解决方案。

我已经开发了执行2个XHR请求的Firefox扩展。第一个访问Joomla API网站以获取最新版本,另一个joomla.xml访问您正在查看的当前网站的文件。然后它将比较两个版本和console.log()结果。

网址:https//github.com/C-Lodder/joomla-update-checker

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.