2

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

他们还没有用于创建新垫的 API,所以我想知道我是否可以用另一种方式做事。

在玩了一些之后,我发现如果您将随机字符串附加到 etherpad.com 到尚未创建的 pad 上,它会返回一个表单,询问您是否要在该地址创建一个新的 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。有什么线索吗?

4

4 回答 4

2

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

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

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

$ nc -l -p 3333

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

(也有 Mozilla Firefox 的扩展,但一般来说它们只会减慢浏览器的速度,并没有提供太多好处。)

另请阅读我在使用 php curl 自动填充文本区域上发布的内容,因为它可能会帮助您在 PHP 中实现。

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

于 2009-11-09T18:58:56.500 回答
2

我的猜测是您缺少 cookie 和/或推荐人。它可能会检查推荐人以确保人们在没有确认的情况下不会创建垫子。

Wireshark 会有所帮助,但将其添加到您的 curl 中,看看它是否有效。

于 2009-11-09T19:24:04.567 回答
1

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

他们显然在做一些 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);
于 2010-01-03T00:44:08.033 回答
0

直接从 HTML 或 TEXT 创建文件

使用 setText 或 setHTML API 端点。 http://etherpad.org/doc/v1.5.0/#index_sethtml_padid_html

要轻松做到这一点,请使用 Etherpad PHP 客户端https://github.com/TomNomNom/etherpad-lite-client

从文件发布

此功能由 Etherpad 插件提供。要启用它...

通过在您的 Etherpad 实例上键入来安装 Etherpadep_post_data插件。npm install ep_post_data

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

  1. 将 yourfile.here 替换为您的文件
  2. 将 url 替换为您要使用的 Etherpad 实例。

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

于 2015-01-03T21:27:16.103 回答