首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PHP和CURL创建新的etherpad

使用PHP和CURL创建新的etherpad
EN

Stack Overflow用户
提问于 2009-11-10 01:50:05
回答 4查看 2.6K关注 0票数 2

我正在尝试写一个简单的PHP脚本,它可以自动设置新的以太网板(参见http://etherpad.com/)。

他们还没有用于创建新pads的API,所以我正在尝试是否可以用另一种方式来做事情。

在尝试了一些方法后,我发现如果您将一个随机字符串附加到尚未创建的pad的etherpad.com中,它会返回一个表单,询问您是否要在该地址创建一个新的etherpad。如果您提交该表单,将在该URL处创建一个新的pad。

我当时的想法是,我可以使用CURL创建一个PHP脚本,它将复制该表单,并欺骗etherpad在我提供的任何URL处创建一个新的pad。脚本是我写的,但到目前为止我还不能让它工作。谁能告诉我我哪里做错了?

首先,下面是etherpad创建页面上的HTML表单:

`

代码语言:javascript
复制
<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提交表单

代码语言:javascript
复制
$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。有什么线索吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-03 08:44:08

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

他们显然在做一些cookie验证,这就是为什么你的脚本不能工作的原因。您可以通过加载新的pad创建提示页面,清除您的cookie,然后重新加载页面来找出这一点。恐怕行不通。这很棘手,但对大多数休闲机器人来说很有效。

这里有一个脚本可以绕过这个限制。只要插入你想要的$padId就可以了。

代码语言:javascript
复制
<?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);
票数 1
EN

Stack Overflow用户

发布于 2009-11-10 02:58:57

我没有调查过这个特定的站点,但我猜有一些重要的标题丢失了。这是一个非常通用的方法,几乎适用于任何网站:

使用网络嗅探器(如Wireshark )捕获所有连接。然后将发送的帖子字段与您的字段进行比较。

一种更简单的方法是使用Netcat。只需将页面保存到磁盘,将form-URL更改为http://localhost:3333/,然后运行

代码语言:javascript
复制
$ nc -l -p 3333

现在打开本地HTML文件并相应地填写字段。您将立即看到本应传输到主机的所有报头。

( Mozilla Firefox也有一些扩展,但一般来说,这些扩展只会降低浏览器的运行速度,而不会带来太多好处。)

另外,请阅读我在To auto fill a text area using php curl上发布的内容,因为它可能会帮助您在PHP语言中实现。

顺便说一下,您将通过GET和POST发送参数"padId“。这是不必要的。检查Etherpad-form实际使用了什么,并坚持使用它。

票数 2
EN

Stack Overflow用户

发布于 2009-11-10 03:24:05

我猜你错过了曲奇和/或推荐人。它可能会检查推荐人,以确保人们在没有确认的情况下不会创建pads。

Wireshark会有所帮助,但把它加到你的卷发上,看看它是否有效。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1702637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档