Создайте новый etherpad с помощью PHP и CURL
Вопрос
Я пытаюсь написать простой 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
- Замените ваш файл.здесь вашим файлом
- Замените URL-адрес экземпляром Etherpad, с которым вы хотите работать.
Источник: http://blog.etherpad.org/2014/12/17/post-to-etherpad-with-this-simple-plugin/