我正在尝试写一个简单的PHP脚本,它可以自动设置新的以太网板(参见http://etherpad.com/)。
他们还没有用于创建新pads的API,所以我正在尝试是否可以用另一种方式来做事情。
在尝试了一些方法后,我发现如果您将一个随机字符串附加到尚未创建的pad的etherpad.com中,它会返回一个表单,询问您是否要在该地址创建一个新的etherpad。如果您提交该表单,将在该URL处创建一个新的pad。
我当时的想法是,我可以使用CURL创建一个PHP脚本,它将复制该表单,并欺骗etherpad在我提供的任何URL处创建一个新的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"/>`
下面是我的代码,它尝试使用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没有创建我的pad。有什么线索吗?
发布于 2010-01-03 08:44:08
这是一个朋友帮我想出的答案:
他们显然在做一些cookie验证,这就是为什么你的脚本不能工作的原因。您可以通过加载新的pad创建提示页面,清除您的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);发布于 2009-11-10 02:58:57
我没有调查过这个特定的站点,但我猜有一些重要的标题丢失了。这是一个非常通用的方法,几乎适用于任何网站:
使用网络嗅探器(如Wireshark )捕获所有连接。然后将发送的帖子字段与您的字段进行比较。
一种更简单的方法是使用Netcat。只需将页面保存到磁盘,将form-URL更改为http://localhost:3333/,然后运行
$ nc -l -p 3333现在打开本地HTML文件并相应地填写字段。您将立即看到本应传输到主机的所有报头。
( Mozilla Firefox也有一些扩展,但一般来说,这些扩展只会降低浏览器的运行速度,而不会带来太多好处。)
另外,请阅读我在To auto fill a text area using php curl上发布的内容,因为它可能会帮助您在PHP语言中实现。
顺便说一下,您将通过GET和POST发送参数"padId“。这是不必要的。检查Etherpad-form实际使用了什么,并坚持使用它。
发布于 2009-11-10 03:24:05
我猜你错过了曲奇和/或推荐人。它可能会检查推荐人,以确保人们在没有确认的情况下不会创建pads。
Wireshark会有所帮助,但把它加到你的卷发上,看看它是否有效。
https://stackoverflow.com/questions/1702637
复制相似问题