获取Roundcube的最新版本

时间:2017-05-10 22:19:04

标签: php version github-api roundcube

我正在尝试显示最新版本的圆形立方体。我得到了我想要的结果

curl https://api.github.com/repos/roundcube/roundcubemail/releases | grep tag_name | grep -o "1.2.[0-9]\{1,\}" | sort -n | tail -1

我正在尝试将此工作转换为RC插件,所以我必须通过php执行此操作并且它无法正常工作。

<?php
$ch = curl_init();
curl_setopt_array(
$ch, array(
CURLOPT_URL => 'https://api.github.com/repos/roundcube/roundcubemail/releases',
CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'],
CURLOPT_POSTFIELDS => 'grep tag_name | grep -o \"1.2.[0-9]\{1,\}\" | sort -n | tail -1'));

$output = curl_exec($ch);
echo $output;
?>

返回

  

{“message”:“Not Found”,“documentation_url”:“https://developer.github.com/v3”} 1

感谢任何帮助。感谢

1 个答案:

答案 0 :(得分:0)

您将CURLOPT_POSTFIELDS设为grep tag_name | grep -o \"1.2.[0-9]\{1,\}\" | sort -n | tail -1。这样做的结果是向GitHub Releases API发出HTTP POST请求,并将该shell命令作为POST数据发送。

您的方法存在许多问题:

  1. /repos/:owner/:repo/releases endpoint仅接受HTTP GET请求。不支持发送POST请求并导致错误消息。
  2. GitHub服务器执行的grep...命令。它们是在本地计算机上执行的Unix命令。因此,没有理由将它们作为API请求的一部分发送。
  3. 您不应该使用grep和朋友来解析输出。 GitHub API的响应采用名为JSON的标准格式。你应该use json_decode instead,它比正则表达式更快,更可靠。您可以将sort命令替换为PHP sorting functions
  4. 如果您只想要最新版本,则应使用/repos/:owner/:repo/releases/latest端点。由于这只返回一个版本,因此您无需进行排序,并且可以直接访问tag_name属性。
  5. 您缺少几个重要选项:

    • CURLOPT_RETURNTRANSFER => true,让curl_exec实际返回回复。
    • CURLOPT_SSL_VERIFYHOST => falseCURLOPT_SSL_VERIFYPEER => false,禁用HTTPS证书检查,这很烦人。
  6. 以下是我将如何实现它:

    <?php
    $ch = curl_init();
    curl_setopt_array($ch, array(
        CURLOPT_URL => 'https://api.github.com/repos/roundcube/roundcubemail/releases/latest',
        CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'],
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_SSL_VERIFYPEER => false
    ));
    $output = json_decode(curl_exec($ch))->tag_name;
    echo $output;