Pregunta

Estoy tratando de escribir un script PHP simple que se configuran automáticamente los nuevos etherpads (véase http://etherpad.com/ ).

No tienen una API (aún) para la creación de nuevas pastillas, así que estoy tratando de averiguar si puedo hacer las cosas de otra manera.

Después de jugar un poco, he encontrado que si agrega una cadena aleatoria a etherpad.com a una almohadilla que aún no es creada por, que va a volver con una forma que le pregunta si desea crear un nuevo Etherpad en esa dirección . Si envía esa forma, una nueva almohadilla se creará en ese URL.

Mi pensamiento era entonces tan sólo pudiera crear una usando CURL script PHP que implicaría una duplicación de la forma y el truco Etherpad en la creación de una nueva almohadilla en cualquier URL que le doy. Escribí el guión, pero hasta ahora no puedo conseguir que funcione. ¿Puede alguien decirme lo que estoy haciendo mal?

En primer lugar, aquí está el formulario HTML en la página de creación de Etherpad:

`

<p><tt id="padurl">http://etherpad.com/lsdjfsljfa-fdj-lsdf</tt></p>

<br/>
<p>There is no EtherPad document here. Would you like to create one?</p>

<input type="hidden" value="lsdjfsljfa-fdj-lsdf" name="padId"/>
<input type="submit" value="Create Pad" id="createPad"/>

`

A continuación, aquí está mi código que intenta enviar el formulario utilizando CURL

$ch = curl_init();

//set POST variables
$url = "http://etherpad.com/ep/pad/create?padId=ldjfal-djfa-ldkfjal";
$fields = array(
  'padId'=>urlencode("ldjfal-djfa-ldkfjal"),
);

$useragent="Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)";  

// set user agent  
curl_setopt($ch, CURLOPT_USERAGENT, $useragent); 

//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value; }
print_r($fields_string);

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);

//execute post
$result = curl_exec($ch);
print_r($result);
//close connection
curl_close($ch);

Al ejecutar la secuencia de comandos, PHP informa espalda que todo lo ejecutado correctamente, pero no crea Etherpad mi libreta. Alguna pista de lo que está pasando?

¿Fue útil?

Solución 3

Aquí está la respuesta a un amigo me ayudó a llegar a:

  

Están aparentemente haciendo algunas galletas   validación, es por eso que la secuencia de comandos   que no está funcionando. Usted puede encontrar esto   cargando la nueva petición de creación de la almohadilla   página, borrar las cookies, y luego   volver a cargar la página. No va a funcionar.   Complicado, pero eficaz para más casual   bots.

     

Aquí hay un script que se pone alrededor de la   limitación. Sólo tiene que insertar su deseada   $ PadId y ya está.

<?php

$padId = 'asdfjklsjfgadslkjflskj';

$ch = curl_init();

# for debugging
curl_setopt($ch, CURLOPT_HEADER, true);

# parse cookies and follow all redirects
curl_setopt($ch, CURLOPT_COOKIEFILE, '/dev/null');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

# first, post to get a cookie
curl_setopt($ch, CURLOPT_URL, 'http://etherpad.com/' . urlencode 
($padId));
$result = curl_exec($ch);
echo $result;

# next, post to actually create the etherpad
curl_setopt($ch, CURLOPT_URL, 'http://etherpad.com/ep/pad/create');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'padId=' . urlencode($padId));
$result = curl_exec($ch);
echo $result;

curl_close($ch);

Otros consejos

No he investigado este sitio específico, pero supongo que hay algunas cabeceras importantes que faltan. Aquí es un enfoque muy general que se aplica a casi cualquier sitio web:

Utilice un succionador de la red como Wireshark para capturar todos los CONEXIONES. A continuación, compare los campos de la POST enviados con la suya.

Una forma aún más fácil es utilizar Netcat. Sólo tiene que guardar la página en el disco, cambiar la forma-URL para http: // localhost: 3333 / y ejecutar

$ nc -l -p 3333

Ahora abre el archivo HTML local y rellene los campos apropiadamente. Inmediatamente verá todas las cabeceras que habrían sido transmitidos al host.

(También hay extensiones para Mozilla Firefox pero en general sólo ralentizan el navegador sin proporcionar muchos beneficios.)

También leo lo que he publicado en para auto llenar un área de texto utilizando php rizo , ya que le puede ayudar con su realización en PHP.

Por cierto, que está enviando el "padId" parámetro mediante GET y POST. Eso no es necesario. Comprobar lo que realmente utiliza el Etherpad-forma y se pega con él.

Mi conjetura es que se está perdiendo las cookies y / o la de referencia. Se puede comprobar la URL de referencia para asegurar que las personas no están creando almohadillas sin confirmación.

Wireshark ayudará, pero añadir que a su rizo y ver si funciona.

Para crear un archivo directamente desde HTML o texto

Utilice la setText o setHTML punto final de la API. http://etherpad.org/doc/v1.5.0/#index_sethtml_padid_html

Para hacer esto fácilmente el uso del Cliente https://github.com/TomNomNom/etherpad -Lite-cliente

Para publicar una entrada de un archivo

Esta característica es proporcionada por un plugin Etherpad. Para activarlo ...

Instalar el plugin ep_post_data Etherpad escribiendo en su instancia npm install ep_post_data Etherpad.

En su cliente tipo de máquina de la CLI: curl -X POST -d @yourfile.here http://youretherpad/post

  1. Reemplazar yourfile.here con su archivo
  2. Sustituir la url con la instancia Etherpad que desea trabajar a.

Fuente: http: / /blog.etherpad.org/2014/12/17/post-to-etherpad-with-this-simple-plugin/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top