Создайте новый etherpad, используя PHP и CURL - PullRequest
2 голосов
/ 09 ноября 2009

Я пытаюсь написать простой PHP-скрипт, который автоматически устанавливает новые Etherpad (см. http://etherpad.com/).

У них нет API (пока) для создания новых пэдов, поэтому я пытаюсь понять, могу ли я сделать что-то по-другому.

Поэкспериментировав, я обнаружил, что если вы добавите случайную строку в etherpad.com к еще не созданному пэду, он вернется с формой с вопросом, хотите ли вы создать новый etherpad по этому адресу , Если вы отправите эту форму, по этому URL будет создан новый планшет.

Тогда я подумал, что мог бы просто создать скрипт PHP с использованием CURL, который продублировал бы эту форму и обманул etherpad в создании нового планшета по любому URL, который я ему дал. Я написал сценарий, но пока не могу заставить его работать. Может кто-нибудь сказать мне, что я делаю не так?

Во-первых, вот HTML-форма на странице создания 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"/>

`

Тогда вот мой код, который пытается отправить форму, используя 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);

Когда я запускаю скрипт, PHP сообщает, что все выполнено правильно, но etherpad не создает мой пэд. Любые подсказки, что происходит?

Ответы [ 4 ]

2 голосов
/ 09 ноября 2009

Полагаю, вам не хватает файлов cookie и / или реферера. Возможно, проверяется рекомендатель, чтобы убедиться, что люди не создают планшеты без подтверждения.

Wireshark поможет, но добавьте это к вашему завитку и посмотрите, работает ли он.

2 голосов
/ 09 ноября 2009

Я не исследовал этот конкретный сайт, но думаю, что некоторые важные заголовки отсутствуют. Вот очень общий подход, который применим практически к любому веб-сайту:

Используйте сетевой сниффер, такой как Wireshark, для захвата всех подключений. Затем сравните отправленные поля POST с вашими.

Еще более простой способ - использовать Netcat. Просто сохраните страницу на диск, измените URL-адрес формы на http://localhost:3333/ и запустите

$ nc -l -p 3333

Теперь откройте локальный HTML-файл и заполните соответствующие поля. Сразу вы увидите все заголовки, которые были бы переданы на хост.

(Существуют также расширения для Mozilla Firefox, но в целом они просто замедляют работу браузера без особой выгоды.)

Также прочитайте то, что я написал на Для автоматического заполнения текстовой области, используя php curl , так как это может помочь вам в вашей реализации на PHP.

Кстати, вы отправляете параметр "padId" через GET и POST. Это не обязательно. Проверьте, что на самом деле использует Etherpad-форма, и придерживайтесь ее.

1 голос
/ 03 января 2010

Вот ответ, который мой друг помог мне придумать:

Они, очевидно, делают печенье проверка, поэтому ваш сценарий не работает Вы можете узнать это загрузив приглашение создания нового пэда страница, очистив ваши куки, а затем перезагрузка страницы. Это не сработает. Хитрый, но эффективный для большинства случайных ботов.

Вот сценарий, который обходит ограничение. Просто введите желаемое $ padId и все готово.

<?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);
0 голосов
/ 04 января 2015

Для создания файла непосредственно из HTML или TEXT

Используйте конечную точку API setText или setHTML. http://etherpad.org/doc/v1.5.0/#index_sethtml_padid_html

Для этого просто используйте PHP-клиент Etherpad https://github.com/TomNomNom/etherpad-lite-client

Для публикации из файла

Эта функция предоставляется подключаемым модулем Etherpad. Чтобы включить его ...

Установите плагин Etherpad ep_post_data, набрав npm install ep_post_data на своем экземпляре Etherpad.

На вашем клиентском компьютере тип CLI: curl -X POST -d @yourfile.here http://youretherpad/post

  1. Замените yourfile.here вашим файлом
  2. Замените URL-адрес экземпляром Etherpad, с которым вы хотите работать.

Источник: http://blog.etherpad.org/2014/12/17/post-to-etherpad-with-this-simple-plugin/

...