2017-05-10 6 views
1

Ich versuche, die neueste Version von Roundcube anzuzeigen. Ich bekomme die Ergebnisse, die ich mit willDie neueste Version von Roundcube erhalten

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

Ich versuche, diese in ein RC-Plugin zu arbeiten, also muss ich dies über php tun und es funktioniert nicht, wie ich hoffe, würde.

<?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; 
?> 

Es gibt

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

Jede Hilfe sehr geschätzt wird. Danke

Antwort

0

Sie setzen CURLOPT_POSTFIELDS auf grep tag_name | grep -o \"1.2.[0-9]\{1,\}\" | sort -n | tail -1. Dies hat den Effekt, dass eine Anforderung HTTP POST an die GitHub Releases API gesendet wird und dieser Shellbefehl als POST-Daten gesendet wird.

Es gibt viele Probleme mit Ihrem Ansatz:

  1. Die /repos/:owner/:repo/releases endpoint akzeptiert nur HTTP GET-Anfragen. Das Senden einer POST-Anfrage wird nicht unterstützt und führt zu einer Fehlermeldung.
  2. Die grep... Befehle sind nicht ausgeführt von den GitHub-Servern. Sie sind Unix-Befehle, die auf Ihrem lokalen Rechner ausgeführt werden. Daher gibt es keinen Grund, sie als Teil der API-Anfrage zu senden.
  3. Sie sollten nicht grep und Freunde verwenden, um die Ausgabe zu analysieren. Die Antwort von der GitHub-API ist in einem Standardformat mit der Bezeichnung JSON. Sie sollten use json_decode instead, die schneller und zuverlässiger als reguläre Ausdrücke sein wird. Sie können den Befehl sort durch PHP sorting functions ersetzen.
  4. Wenn Sie nur die neueste Version möchten, sollten Sie stattdessen den /repos/:owner/:repo/releases/latest Endpunkt verwenden. Da nur ein Release zurückgegeben wird, müssen Sie nicht sortieren, und Sie können direkt auf das Attribut tag_name zugreifen.
  5. Ihnen fehlen mehrere wichtige Optionen:

    • CURLOPT_RETURNTRANSFER => true, haben curl_exec die Antwort tatsächlich zurück.
    • CURLOPT_SSL_VERIFYHOST => false und CURLOPT_SSL_VERIFYPEER => false, um die HTTPS-Zertifikatsprüfung zu deaktivieren, was lästig ist.

Hier ist, wie ich es umsetzen würde:

<?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; 
+0

ich in diesen Ansatz sah zu beginnen, aber ich kann nichts für einen Anfänger findet auch, um herauszufinden, zu beginnen, wie man es abzieht ... – texxasrulez

+0

@texxasrulez Nochmals aktualisiert, und diesmal ist es getestet. – MultiplyByZer0

+0

Vielen Dank für Ihre Hilfe. Das bekommt es fast. Es zeigt den ersten tag_name, aber nicht die höchste Version an. Es zeigt 1.0.11 und 1.2.5 ist die höchste Veröffentlichung.Ich habe dies als Cronjob zum Speichern einer Textdatei und print_file_contents im Plugin zur Anzeige der Version. Ein ziemlich rückwärts arbeiten, aber mit dem Beispiel, das Sie hier gezeigt haben, hilft mir zu lernen. Ich schätze Ihre Hilfe. – texxasrulez

Verwandte Themen