2009-11-18 5 views
0

J'essaie de construire une application web gratuite en utilisant ruby ​​/ rails Il devrait être en mesure d'envoyer des sms à travers les formes en ligne de divers opérateurs mobiles. (comme this one (en russe)).Ruby/RoR et de nombreux sous-processus

Alors, je dois

  • attente pour l'utilisateur, qui veut envoyer un sms sur mon site.
  • établir une connexion au site Web de l'opérateur. Probablement, en utilisant Mechanize.
  • récupérer captcha
  • show captcha à l'utilisateur
  • permettent à l'utilisateur d'entrer un message et captcha
  • soumettre le formulaire sur le site Web des opérateurs (avec message, captcha, numéro de téléphone)

La connexion le site de l'opérateur doit être vivant pendant tout ce processus (sinon captcha va changer). Pour autant que je comprenne, j'ai besoin de créer un (sous) processus chaque fois que sms est envoyé. Pourriez-vous s'il vous plaît conseiller quelle est la meilleure façon de gérer cela dans les rails \ ruby?

Je suis encore un peu nouveau dans le développement web ... Dois-je utiliser des threads? fourchettes? Popen? en utilisant PTY? une gemme externe? Comment dois-je communiquer avec mon processus?

Répondre

2

En supposant qu'il n'y a rien de spécial sur le site Web de l'opérateur, non, vous n'avez pas besoin de maintenir une connexion active pendant tout le processus. En règle générale, les formulaires sur les pages Web fonctionnent comme ceci: Vous visitez l'URL, votre navigateur Web télécharge la page avec le formulaire. Dans votre cas, il aura également une balise <img> ou similaire pour afficher le CAPTCHA. Une fois que votre navigateur a téléchargé la page, la connexion est coupée. Après avoir rempli le formulaire et cliqué sur Soumettre, votre navigateur Web ouvre une nouvelle connexion au serveur et envoie les données, et le serveur envoie sa réponse (quelle que soit la page affichée après avoir cliqué sur Soumettre).

Tout ce que votre programme a à faire est d'imiter cette expérience. Donc: 1) Téléchargez la page avec le formulaire. Grattez les champs du formulaire (assurez-vous de ne pas manquer de champs cachés - avec un CAPTCHA il y en aura probablement) et du CAPTCHA. 2) Construire une page pour montrer à votre utilisateur qui comprend le CAPTCHA et un formulaire avec tous les champs dont ils ont besoin de remplir. S'il y avait des champs cachés dans le formulaire d'origine, assurez-vous d'inclure également leurs valeurs (en tant que champs masqués dans votre formulaire), car lorsque l'utilisateur soumettra votre formulaire, vous en aurez besoin. 3) Ensuite, lorsque l'utilisateur soumet votre formulaire, envoyez les données, y compris les valeurs cachées et ce que l'utilisateur a saisi pour le CAPTCHA, à l'opérateur. 4) Enfin, vérifiez si l'opérateur a indiqué le succès et créez une page pour le dire à votre utilisateur.

Si vous faites cela dans Rails, vous aurez probablement deux méthodes dans votre contrôleur: Une appelée par ex. 'show' (étapes 1 et 2 ci-dessus) qui raclera le CAPTCHA et d'autres informations du site de l'opérateur et montrera à l'utilisateur votre vue de formulaire, et une appelée par ex. 'envoyer' (étape 3 et 4 ci-dessus) que le formulaire soumettra à, et qui prendra ses données et l'enverra sur le site Web de l'opérateur, collectera la réponse et indiquera à votre utilisateur s'il a réussi ou non.

Remarque: Vous devez lire les conditions d'utilisation des opérateurs avant de vous en soucier. Je suis à peu près certain que ce genre de chose ira à l'encontre de leurs TOS et s'ils remarquent que votre serveur envoie beaucoup de requêtes à leur façon, ils vont vous bloquer assez rapidement.

+0

Exactement. Vous n'avez pas besoin de garder la connexion ouverte, et même si vous l'avez fait ne ferait aucune différence avec le CAPTCHA. Assurez-vous de soumettre tous les champs cachés avec le formulaire. – mtyaka

+0

OMG! Jordan, mtyaka - merci beaucoup! Évidemment, j'aime trop compliquer les choses ... Jordan - merci pour une si bonne réponse! Je viens de découvrir que je n'ai pas assez de réputation (<15), donc je ne peux pas ajouter mon vote à votre réponse, désolé. (mais je le ferai, une fois que j'aurai 15 rep) Merci encore. – Konstantin

1

Pour répondre à une autre de vos questions, vous pouvez utiliser DRb ou background_job (alias BJ) pour accomplir l'envoi en arrière-plan de sorte qu'après avoir envoyé le captcha, l'utilisateur n'ait pas à attendre la réponse. Ou vous pouvez envelopper dans ajax et avoir le processus DRB/BJ vous informer lorsque l'envoi de sms est arrivé afin que vous puissiez informer l'utilisateur de la réussite ou de tout problème.

Généralement, l'ouverture de threads dans Ruby est quelque chose à éviter car il y a tellement de superbes gemmes qui font ce dont nous avons besoin. Pour ne pas dire que vous ne devriez pas utiliser de threads, juste que pour la plupart, il est probablement déjà fait très bien.

+0

Merci pour vos conseils! Je vais certainement utiliser un de ces plugins. – Konstantin

Questions connexes