Pergunta

Eu estou tentando escrever um script PHP simples que configura automaticamente novas etherpads (ver http://etherpad.com/ ).

Eles não têm uma API (ainda) para a criação de novas pastilhas então eu estou tentando descobrir se eu posso fazer as coisas de outra forma.

Depois de brincar um pouco, descobri que se você acrescentar uma seqüência aleatória de etherpad.com a uma almofada ainda-não-criado, ele vai voltar com uma forma perguntando se você deseja criar um novo EtherPad nesse endereço . Se você enviar esse formulário, uma nova almofada será criado nesse URL.

Meu pensamento era então eu poderia apenas criar um script PHP usando CURL que duplicar esse formulário e truque EtherPad em criar um novo bloco a qualquer URL Dou-lhe. Eu escrevi o roteiro, mas até agora eu não posso fazê-lo funcionar. Alguém pode me dizer o que estou fazendo de errado?

Em primeiro lugar, aqui está o formulário HTML na página de criação 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"/>

`

Então aqui está o meu código que tenta enviar o formulário usando 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);

Quando eu executar o script, PHP reporta que tudo executado corretamente, mas EtherPad não cria minha almofada. Qualquer pistas o que está acontecendo?

Foi útil?

Solução 3

Aqui está a resposta para um amigo me ajudou a vir para cima com:

Eles estão aparentemente fazendo algum bolinho validação, é por isso que seu script não está funcionando. Você pode descobrir isso carregando o novo prompt criação pad página, limpar os cookies, e depois recarregar a página. Não vai funcionar. Complicado, mas eficaz para mais casual bots.

Aqui está um script que fica em torno do limitação. Basta inserir o seu desejado $ PadId e você vai longe.

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

Outras dicas

Eu não investigaram este site específico, mas eu acho que existem alguns cabeçalhos importantes que estão faltando. Aqui é uma abordagem muito geral que se aplica para quase qualquer site:

Use um sniffer de rede, tais como Wireshark para capturar todos connectons. Em seguida, compare os campos enviados POST com o seu.

Uma forma ainda mais fácil é usar Netcat. Basta salvar a página em disco, mudar a forma-URL para http: // localhost: 3333 / e executar

$ nc -l -p 3333

Agora abra o arquivo HTML local e preencher os campos adequadamente. Imediatamente você verá todos os cabeçalhos que teria sido transmitidos para o host.

(Há também extensões para o Mozilla Firefox, mas em geral eles apenas retardar o navegador sem fornecer muito benefício.)

Leia também o que eu tenho postado em para auto preencher uma área de texto usando php onda como poderia ajudá-lo com a sua realização em PHP.

A propósito, você está enviando o parâmetro "padId" via GET e POST. Isso não é necessário. Confira o que o Etherpad-forma usa e vara realmente com ele.

Meu palpite é que você está perdendo os cookies e / ou a referência. Pode-se verificar a referência para garantir que as pessoas não estão criando almofadas sem confirmação.

Wireshark vai ajudar, mas acrescentar que a sua onda e ver se funciona.

Para criar um arquivo diretamente do HTML ou texto

Use o setText ou endpoint API setHTML. http://etherpad.org/doc/v1.5.0/#index_sethtml_padid_html

Para fazer facilmente esta utilização do Etherpad PHP Cliente https://github.com/TomNomNom/etherpad -Lite-cliente

Para postar a partir de um arquivo

Este recurso é fornecido por um plugin Etherpad. Para habilitá-lo ...

Instale o Etherpad ep_post_data plug-in por npm install ep_post_data digitação em sua instância Etherpad.

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

  1. Substitua yourfile.here com o seu arquivo
  2. Substitua a url com a instância Etherpad quer trabalhar para.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top