Créer un nouveau EtherPad en utilisant PHP et CURL
Question
Je suis en train d'écrire un simple script PHP qui configure automatiquement les nouveaux etherpads (voir http://etherpad.com/ ).
Ils ne sont pas une API (encore) pour la création de nouveaux tampons, donc je suis en train de comprendre si je peux faire des choses d'une autre manière.
Après avoir joué un peu, je trouve que si vous ajoutez une chaîne aléatoire à etherpad.com à un tampon non encore créé, il reviendra avec un formulaire demandant si vous voulez créer une nouvelle EtherPad à cette adresse . Si vous soumettez ce formulaire, un nouveau pad sera créé à cette URL.
Ma pensée était alors je pouvais créer un script PHP en utilisant CURL qui ferait double emploi avec cette forme et piègent EtherPad dans la création d'un nouveau pad quel que soit l'URL que je lui donne. J'ai écrit le scénario, mais jusqu'à présent, je ne peux pas le faire fonctionner. Quelqu'un peut-il me dire ce que je fais mal?
Tout d'abord, voici le formulaire HTML sur la page de création de EtherPad:
`
<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"/>
`
Alors voici mon code qui tente d'envoyer le formulaire en utilisant 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);
Quand je lance le script, rapporte PHP arrière que tout exécuté correctement, mais EtherPad ne crée pas mon pad. Tous les indices ce qui se passe?
La solution 3
Voici la réponse un ami m'a aidé à venir avec:
Ils font apparemment certains cookies validation, c'est pourquoi votre script ne fonctionne pas. Vous pouvez trouver cela en chargeant la nouvelle invite de création pad page de compensation vos cookies, puis recharger la page. Il ne fonctionnera pas. Tricky, mais efficace pour la plupart occasionnels bots.
Voici un script qui contourne la limitation. Il suffit d'insérer votre choix $ PadId et vous allez loin.
<?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);
Autres conseils
Je n'ai pas enquêté sur ce site spécifique, mais je suppose qu'il ya des têtes importantes qui manquent. Voici une approche très générale qui est applicable pour presque tout site Web:
Utilisez un renifleur de réseau, tel que Wireshark pour capturer tous les connectons. Ensuite, comparez les champs POST envoyés avec le vôtre.
Une façon encore plus facile est d'utiliser Netcat. Il suffit d'enregistrer la page sur le disque, changer la forme URL http: // localhost: 3333 / et exécuter
$ nc -l -p 3333
Maintenant, ouvrez le fichier HTML local et remplissez les champs de façon appropriée. Immédiatement, vous verrez tous les en-têtes qui aurait été transmis à l'hôte.
(Il existe également des extensions pour Mozilla Firefox, mais en général, ils ralentissent juste en bas du navigateur sans fournir beaucoup d'avantages.)
lire aussi ce que j'ai posté sur pour remplir automatiquement une zone de texte à l'aide gondoler php car il peut vous aider avec votre réalisation en PHP.
Par ailleurs, vous envoyez le paramètre "padId" via GET et POST. Ce n'est pas nécessaire. Vérifier ce que le Etherpad-forme utilise et de s'y tenir en fait avec.
Je pense que vous manquez les cookies et / ou le referrer. Il peut être vérifier le referrer pour assurer que les gens ne créent pas de tampons sans confirmation.
Wireshark aider, mais ajouter à votre boucle et voir si cela fonctionne.
Pour créer un fichier directement à partir de HTML ou texte
Utilisez le setText ou point final API setHTML. http://etherpad.org/doc/v1.5.0/#index_sethtml_padid_html
Pour ce faire facilement cette utilisation https://github.com/TomNomNom/etherpad -lite client
Pour poster à partir d'un fichier
Cette fonctionnalité est fournie par un plug-in Etherpad. Pour lui permettre ...
Installer le plugin ep_post_data
Etherpad en tapant npm install ep_post_data
sur votre instance Etherpad.
A la machine client CLI type: curl -X POST -d @yourfile.here http://youretherpad/post
- Remplacez yourfile.here avec votre fichier
- Remplacez l'URL par l'instance Etherpad vous voulez travailler à.
Source: http: / /blog.etherpad.org/2014/12/17/post-to-etherpad-with-this-simple-plugin/