Создайте новый etherpad, используя PHP и CURL

Я пытаюсь написать простой 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 не создает мой блокнот. Любые подсказки, что происходит?


person Kyle Mathews    schedule 09.11.2009    source источник
comment
хорошо, я никогда раньше не видел etherpad, отличное приложение, спасибо за информацию.   -  person Jakub    schedule 09.11.2009


Ответы (4)


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

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

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

$ nc -l -p 3333

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

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

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

Кстати, вы отправляете параметр «padId» через GET и POST. В этом нет необходимости. Проверьте, что на самом деле использует форма Etherpad, и придерживайтесь этого.

person user206268    schedule 09.11.2009
comment
Ах, я забыл упомянуть, что многие веб-сайты проверяют пользовательский агент. К сожалению, вы не можете использовать мой Netcat-подход, чтобы найти его, но Wireshark обязательно его отобразит. Обычно я устанавливаю пользовательский агент на http://‹host›/. Если это не сработает в вашем конкретном случае, лучше всего понюхать правильное значение. - person user206268; 09.11.2009

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

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

person Sundeep    schedule 09.11.2009
comment
Да, вот чем это закончилось — они проверяли файл cookie. Смотрите мой ответ. - person Kyle Mathews; 03.01.2010

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

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

Вот скрипт, который обходит ограничение. Просто вставьте желаемый $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);
person Kyle Mathews    schedule 03.01.2010

Чтобы создать файл непосредственно из 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/

person John McLear    schedule 03.01.2015