2009-11-09 80 views
2

我正在尝试编写一个自动设置新的etherpad的简单PHP脚本(请参阅http://etherpad.com/)。使用PHP和CURL创建新的etherpad

他们没有API(尚未)创建新的垫,所以我想弄清楚我是否可以用另一种方式做事。

在玩过一些游戏后,我发现如果你将一个随机字符串附加到etherpad.com到一个尚未创建的pad中,它会返回一个表单,询问你是否想要创建一个新的etherpad地址。如果您提交该表单,则会在该网址上创建新的便笺本。

我的想法是,我可以使用CURL创建一个PHP脚本,该脚本将复制该表单,并在任何给它的URL处欺骗etherpad以创建新的pad。我写了脚本,但到目前为止我无法使它工作。有人能告诉我我做错了什么吗?

首先,这里的EtherPad的创建页面上的HTML表单:

`

<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"/> 

`

然后这里是我的代码,试图利用提交表单卷曲

$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不创建我的垫。任何线索发生了什么?

+0

不错,我从来没有见过EtherPad的面前,伟大的应用程序,感谢信息。 – Jakub 2009-11-09 19:37:48

回答

1

这里的答案一个朋友帮我想出了:

他们显然做了一些饼干 验证,这就是为什么你的脚本 不能正常工作。您可以通过加载新的填充板创建提示 页面,清除您的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); 
2

我还没有调查这个具体的网站,但我想有一些重要的标题丢失。这是一个非常普遍的方法,几乎​​适用于任何网站:

使用网络嗅探器(如Wireshark)来捕获所有连接。然后比较发送的POST字段和你的。

更简单的方法是使用Netcat。刚刚页面保存到磁盘,改变形式,网址http://localhost:3333/和运行

$ nc -l -p 3333 

现在打开本地HTML文件,并在适当的字段填写。您将立即看到所有可能已传输到主机的标题。

(也有Mozilla Firefox的扩展,但一般来说,他们只是减慢浏览器没有提供多少好处。)

又读了什么我已经To auto fill a text area using php curl发布,因为它可以帮助您与您的实现在PHP。

顺便说一句,您通过GET POST发送参数“padId”。这没有必要。检查Etherpad表单实际使用的内容并坚持使用。

+0

啊,我忘了提到很多网站检查用户代理。不幸的是,你不能用我的Netcat方法找到它,但Wireshark肯定会显示它。一般来说,我将用户代理设置为http:// /。如果这在你的特殊情况下不起作用,最好嗅探适当的价值。 – user206268 2009-11-09 19:03:47

2

我的猜测是你错过了cookies和/或referrer。它可能正在检查推荐人,以确保人们不会在未经确认的情况下创建便笺簿。

Wireshark会提供帮助,但将它添加到卷曲中,看看它是否有效。

+0

是的 - 这就是它最终成为的 - 他们正在检查一个cookie。看到我的答案。 – 2010-01-03 00:44:50

0

要直接从HTML或TEXT

使用创建文件的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实例上键入npm install ep_post_data来安装Etherpad ep_post_data插件。

在您的客户机CLI类型:curl -X POST -d @yourfile.here http://youretherpad/post

  1. 替换yourfile.here与您的文件
  2. 你想工作到EtherPad的情况下更换网址。

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