PHP と CURL を使用して新しい etherpad を作成する
質問
新しいイーサパッドを自動的にセットアップする単純な PHP スクリプトを作成しようとしています (「 http://etherpad.com/).
新しいパッドを作成するための API が(まだ)ないので、別の方法で何かできないか考えています。
いくつか試してみたところ、etherpad.com というランダムな文字列をまだ作成されていないパッドに追加すると、そのアドレスに新しい etherpad を作成するかどうかを尋ねるフォームが返されることがわかりました。そのフォームを送信すると、その URL に新しいパッドが作成されます。
そこで私が考えたのは、CURL を使用してそのフォームを複製し、指定した URL に新しいパッドを作成するように etherpad を騙す PHP スクリプトを作成すればいいということでした。スクリプトを書きましたが、今のところ動作させることができません。誰かが私が間違っていることを教えてもらえますか?
まず、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 はパッドを作成しません。何が起こっているのか手がかりはありますか?
解決 3
ここで友人は私が思い付く助けた答えです
彼らは明らかにいくつかのクッキーをやっています 検証は、それがなぜあなたのスクリプトです 機能していません。あなたはこれを見つけることができます 新しいパッドの作成プロンプトをロードすることにより、 ページ、あなたのクッキーをクリアした後、 ページをリロードします。それは動作しません。 トリッキー、ほとんどのカジュアルための効果的な ボットます。
ここで周りを取得するスクリプトがあります 制限。ちょうどあなたの希望を挿入 $ 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);
他のヒント
私は、この特定のサイトを調査していないが、私は不足しているいくつかの重要なヘッダがあると思います。ここでは、ほぼすべてのWebサイトに適用され非常に一般的なアプローチがあります:
すべてのconnectonsをキャプチャするなどのWiresharkなどのネットワークスニファを使用してください。そして、あなたに送られたPOSTフィールドを比較します。
さらに簡単な方法は、Netcatをを使用することです。ただ、でhttpフォームURLを変更、ディスクにページを保存:// localhostを:3333 / と実行
$ nc -l -p 3333
これでローカルのHTMLファイルを開いて、適切なフィールドに入力します。すぐにあなたがホストに送信されていたすべてのヘッダが表示されます。
(ありもMozilla Firefox用の拡張機能ですが、一般的に彼らは多くの利点を提供することなく、ブラウザが遅くなります。)
また、私はに掲載されているものを読みますそれはPHPであなたの実現のお手伝いをする可能性があるとして、自動ためにPHPカールするを使用してテキスト領域を塗りつぶします。
GET およびのPOSTを介した方法で、あなたはパラメータ "padId" を送信していることで。それは必要ありません。 EtherPadでは、フォームが実際に使用するものをチェックして、それに固執ます。
私の推測では、クッキーおよび/またはリファラを逃しているということです。人々は確認せずにパッドを作成していないことを確認するためにリファラをチェックすることができる。
Wiresharkのは助けるが、あなたのカールにそれを追加し、それが動作するかどうかを確認します。
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 をインストールする ep_post_data
入力してプラグイン npm install ep_post_data
Etherpad インスタンス上で。
クライアント マシンの CLI で次のように入力します。 curl -X POST -d @yourfile.here http://youretherpad/post
- yourfile.here を実際のファイルに置き換えます
- URL を、作業対象の Etherpad インスタンスに置き換えます。
ソース: http://blog.etherpad.org/2014/12/17/post-to-etherpad-with-this-simple-plugin/