Вопрос

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

Это было полезно?

Решение 3

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

Они, по-видимому, выполняют какие-то 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);

Другие советы

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

Используйте сетевой анализатор, такой как Wireshark, для захвата всех подключений.Затем сравните поля отправленной ПОЧТЫ с вашими.

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

$ nc -l -p 3333

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

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

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

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

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

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

Чтобы создать файл непосредственно из HTML или текста

Используйте конечную точку setText или setHTML API. 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. Замените ваш файл.здесь вашим файлом
  2. Замените URL-адрес экземпляром Etherpad, с которым вы хотите работать.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top