Tengo un simple script de python "hola mundo" aquí
imprimir("Hola mundo")
Lo subí a mi sitio (similar a Pastebin o GitHub gist)
https://www.bunlongheng.com/raw/YWFjOGMxYTktM2Y5Mi00ZDdlLWI1NWQtOTg0Y2EwYjVlMDM5
Cuando compartí el enlace, puedo ver el ícono y el campo de título como el texto real, es agradable. Probado en iPhone a continuación
Cuando enrollé el enlace, obtuve las etiquetas <title> y <link> así:
<title>print("Hello World")</title><link rel="shortcut icon" href="https://i.imgur.com/yRk5mqb.png" /><pre>print("Hello World")</pre>Lo que, por supuesto, se romperá si ejecuto remotamente mis códigos como este
curl https://www.bunlongheng.com/raw/YWFjOGMxYTktM2Y5Mi00ZDdlLWI1NWQtOTg0Y2EwYjVlMDM5 | python % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 153 0 153 0 0 354 0 --:--:-- --:--:-- --:--:-- 353 File "<stdin>", line 1 <title>print("Hello World")</title><link rel="shortcut icon" href="https://i.imgur.com/yRk5mqb.png" /><pre>print("Hello World")</pre> ^ SyntaxError: invalid syntax ¿Cómo puedo devolver solo lo que está dentro de mi etiqueta <pre> si alguien hace un cURL o wget a mi enlace?
Puede intentar olfatear el encabezado User-Agent pero no es una buena manera de determinar qué tipo de contenido proporcionar a un cliente.
Un mejor enfoque (utilizando las funciones integradas en HTTP que están diseñadas para manejar diferentes representaciones del mismo contenido) podría ser usar el encabezado Accept .
En Python , puede usar el módulo accept-types para esto.
return_type = get_best_match(request.META.get('HTTP_ACCEPT'), ['text/html', 'application/python']) if return_type == 'application/python': return render_python() else: return render_html()Consulte esta pregunta para manejarlo en PHP .
Entonces el cliente podría pedir el código de Python si lo quisiera:
curl -H "Accept: application/python" http://example.com/foo | pythonsimilar a Quentin, verificaría si el encabezado de aceptación contiene la cadena "html" y serviría el html si lo hace. pero si no menciona explícitamente html, sirva el python directamente. porque todos los navegadores web dicen alguna versión de Accept: ...html... (como Chrome dice Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 )
mientras que wget/curl/libcurl solo dice Accept: */*
terminé haciendo esto
$usuarioAgente = $_SERVIDOR['HTTP_USER_AGENT']; if (stripos($userAgent, 'curl') !== false || stripos($userAgent, 'wget') !== false ){ return $paste->raw; }
public function raw($uuid) { $paste = Paste::where('uuid', base64_decode($uuid))->first(); $userAgent = $_SERVER['HTTP_USER_AGENT']; if (stripos($userAgent, 'curl') !== false || stripos($userAgent, 'wget') !== false ){ return $paste->raw; } if($paste->type == 'json'){ return response()->json($paste->data); } else { $result = htmlentities($paste->raw); return '<title>'.$result.'</title><link rel="shortcut icon" href="https://i.imgur.com/WWWynu9.png" /><pre>'.$result.'</pre>'; } } Ahora puedo ejecutar bash o python de forma remota desde cURL sin una etiqueta HTML adicional. La mejor parte es que no tengo que comprometer el ícono y el título para el navegador y el navegador móvil.