2

新しい etherpad を自動的にセットアップする単純な PHP スクリプトを作成しようとしています ( http://etherpad.com/を参照)。

新しいパッドを作成するための API (まだ) がないので、別の方法でできるかどうかを調べています。

いくつか試してみたところ、etherpad.com のランダムな文字列をまだ作成されていないパッドに追加すると、そのアドレスに新しい etherpad を作成するかどうかを尋ねるフォームが表示されることがわかりました。そのフォームを送信すると、その URL に新しいパッドが作成されます。

そこで考えたのは、CURL を使用して PHP スクリプトを作成することで、そのフォームを複製し、etherpad をだまして任意の URL で新しいパッドを作成させることができるということでした。スクリプトを書きましたが、今のところうまくいきません。誰かが私が間違っていることを教えてもらえますか?

まず、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 はパッドを作成しません。何が起こっているのか手がかりはありますか?

4

4 に答える 4

2

私の推測では、Cookie やリファラーが不足していると思われます。リファラーをチェックして、人々が確認なしにパッドを作成していないことを確認している可能性があります。

Wireshark が役立ちますが、それを curl に追加して、動作するかどうかを確認してください。

于 2009-11-09T19:24:04.567 に答える
2

この特定のサイトを調査していませんが、欠落している重要なヘッダーがいくつかあると思います。以下は、ほぼすべての Web サイトに適用できる非常に一般的なアプローチです。

Wireshark などのネットワーク スニファーを使用して、すべての接続をキャプチャします。次に、送信された POST フィールドを自分のものと比較します。

さらに簡単な方法は、Netcat を使用することです。ページをディスクに保存し、フォーム URL をhttp://localhost:3333/に変更して実行するだけです。

$ nc -l -p 3333

ローカルの HTML ファイルを開き、フィールドに適切に入力します。ホストに送信されたはずのすべてのヘッダーがすぐに表示されます。

(Mozilla Firefox 用の拡張機能もありますが、一般的にはブラウザーの速度を低下させるだけで、あまりメリットはありません。)

また、PHP での実現に役立つ可能性があるため、To auto fill a text area using php curl に投稿した内容もお読みください。

ところで、パラメータ「padId」を GETPOST で送信しています。それは必要ありません。Etherpad フォームが実際に使用するものを確認し、それに固執します。

于 2009-11-09T18:58:56.500 に答える
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);
于 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 に答える