PHP Video URL von Twitch Clip auslesen

Pfandfinder

Lieutenant
Registriert
Nov. 2020
Beiträge
619
guten Abend,

ich möchte mit PHP den Videolink eines Twitch Clips auslesen (https://www.twitch.tv/chocotaco/clip/ImpartialCautiousPlumageMrDestructoid). wenn ich mir den kompletten Seitenquelltext der Seite anschaue im Chrome, sehe ich den Link nicht. Aber wenn ich einen Rechtsklick auf das Video mache -> Untersuchen sehe ich dort den Link ganz einfach.

nun die Frage, wie kann ich das auslesen, wenn ich mit PHP nur den Link zum Clip habe?
 

Anhänge

  • 20201123-220351.png
    20201123-220351.png
    28,4 KB · Aufrufe: 234
Du kannst dir mal die Twitch-Einbindung von youtube-dl ansehen. Ich würde allerdings gleich direkt youtube-dl verwenden, da das stetig gepflegt wird. Wenn Twitch demnächst irgendwas ändert, musst du wieder manuell Hand anlegen.
Bash:
$ youtube-dl --get-url https://www.twitch.tv/chocotaco/clip/ImpartialCautiousPlumageMrDestructoid
https://clips-media-assets2.twitch.tv/AT-cm%7C914150553.mp4
 
danke. aber ich kann die Datei einfach nicht mit PHP herunterladen... habe verschiedene Scripts probiert, die Datei ist immer 0 byte groß.

PHP:
file_put_contents("tmp/Tmpfile.mp4", fopen($url, 'r'));

tausche ich $url mit einem Link zu einem Video von meinem webspace aus, lädt er das in tmp/ herunter. am PC kann ich das Video aber ganz normal von Twitch runterladen.
 
Prüf die Rückgabewerte! Man öffnet aber auch keine URLs mit fopen.
https://www.php.net/manual/en/function.fopen.php schrieb:
If PHP has decided that filename specifies a registered protocol, and that protocol is registered as a network URL, PHP will check to make sure that allow_url_fopen is enabled. If it is switched off, PHP will emit a warning and the fopen call will fail.
Was du brauchst ist file_get_contents().
 
  • Gefällt mir
Reaktionen: Pfandfinder
was ist bei dir denn $url? dein originaler link aus #1 oder yuuris extrahierter link aus #2?
der letzte codeschnipsel funktioniert bei mir mit letzterem.
 
na dann klatsch mal ein error_reporting(E_ALL); nach den opening php tag <?php, um fehler anzuzeigen.

auch wie yuuri in #4 bereits empfahl: rueckgabewerte deiner funktionen checken, siehe dokus:
https://www.php.net/manual/de/function.file-get-contents.php
https://www.php.net/manual/de/function.file-put-contents.php

schau auch mal die groesse von $contents nach dem download an (strlen).

allgemein gesprochen sind die beiden benutzten funktionen zwar binary-safe, aber eigentlich fuer strings ausgelegt. eine robustere (aber auch komplexere) loesung waere sicherlich die verwendung von curl. sollte aber wie gesagt auch so funktionieren.
 
was mir jetzt aufgefallen ist: wenn ich anstatt $url jetzt den Link schreibe funktioniert der Download. aber $url ist ja auch der Link, hab die variable ja ausgegeben...

Also, das geht:

PHP:
    $contents = file_get_contents(
        'https://clips-media-assets2.twitch.tv/AT-cm%7C914150553.mp4'
    );


das nicht:

PHP:
    $contents = file_get_contents(
        $url
    );

aber $url ist "https://clips-media-assets2.twitch.tv/AT-cm|914150553.mp4" aus dem shell_exec:

PHP:
$url = shell_exec('youtube-dl --get-url '.$url);

muss ich das verstehen ??
 
naja, das problem ist da vermutlich, dass die ausgabe von youtube-dl am ende noch 'nen newline-character \n enthaelt, den auch shell_exec zurueckgibt. das laesst du dir am anschaulichsten mit var_dump($url); nach aufruf von shell_exec anzeigen. das gefaellt offensichtlich dem http-server beim aufruf von file_get_contents nicht - ich kriege da bspw. 'ne PHP warning:
PHP Warning: file_get_contents(https://clips-media-assets2.twitch.tv/AT-cm|914150553.mp4
): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden
in /tmp/foo.php on line 4
also am besten nochmal ein trim($url) dazwischenstreuen.
 
danke mit trim gehts!

Das Video soll jetzt mein Telegram Bot an mich versenden. Hier sind mir auch Probleme aufgefallen. erstmal das Script:

PHP:
function sendVideo($bot_id,$chat_id,$caption,$disable_notification,$video_url)
{
    $ch = curl_init('https://api.telegram.org/bot'.$bot_id.'/sendVideo');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    $param = array(
        'chat_id' => $chat_id,
        'caption' => $caption,
        'parse_mode' => 'html',
        'disable_notification' => $disable_notification,
        'video' => $video_url
    );

    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param));

    $result = curl_exec($ch);
    curl_close($ch);

    return $result;
}

$url = trim(shell_exec('youtube-dl --get-url '.$url));

sendVideo($bot_id,$chat_id,'',false,$url);
sendMessage($bot_id,$chat_id,false,$url);

Das sendet den Clip sowie den Link, sofern der Clip ziemlich kurz ist (vermutlich kleine Dateigröße?). sobald ich einen längeren Clip, wie mein Beispiel aus #1, also mind. 30 Sekunden anfrage, erhalte ich nur den Link als Nachricht aber es kommt kein Video an. im error Log steht nichts. laut Doku sind aber bis zu 50 MB möglich. Und lade ich den Clip herunter, hat dieser auch nur 35 MB.

Woran kann das jetzt liegen ? Wie kann ich das debuggen ?
 
Um das Thema mit shell_exec nochmal aufzugreifen: Mir ist aufgefallen, dass bei einem fehlerhaften Link die Variable in PHP leer ist. in der Shell sehe ich aber die Fehlermeldung.

PHP:
$message = 'https://clips.twitch.tv/PlayfulWheelUninterestedVanilla';

$link = trim(shell_exec('youtube-dl --get-url '.htmlspecialchars($message)));

echo $link;

Wieso sehe ich das nicht in der variable ? wie bekomme ich das hin ?

var_dump sagt: string(0) ""
 

Anhänge

  • 20201205-112308.png
    20201205-112308.png
    5,4 KB · Aufrufe: 169
Standardmäßig wird nur stdout abgegriffen und die Ausgabe erfolgt wohl auf stderr. Entweder du nimmst den richtigen Weg über proc_open und greifst somit die Streams einzeln ab oder du nimmst den Shorthand
PHP:
$url = htmlspecialchars($message);
shell_exec("youtube-dl --get-url $url 2>&1"));
und leitest stderr auf stdout um. Hast dann halt beide Ausgaben im Output drin.
 
Zurück
Oben