Página 1 de 1

Hilos y peticiones HTTP

NotaPublicado: 2014-10-03 14:28 @644
por jimr1984
Buenas tardes, comunidad. Tengo el siguiente script para solucionar un problema. Si pueden ayudarme, por favor.

Problemática: es un sistema de votación. Ejemplo: ¿Está de acuerdo en que Perl es un lenguaje potente? "sí", "no".

El cual tiene dos opciones ("sí","no") Este sistema permite realizar dieciséis votos, es decir, ocho síes y ocho noes para una IP. Luego de realizar los dieciséis votos u ocho votos de su elección, la dirección IP es bloqueada por un por tiempo de quince minutos.
Recién se habilita para volver a votar.

Solución planteada: para el tema de el bloqueo por IP se optó por recurrir a listas de proxies. De esta manera, mientras más proxies válidos se tengan, más cantidades de votos se podrán realizar de forma automatizada.

Si tengo cien proxies, por ocho votos "sí" o "no", salen ochocientos votos reflejados en cualquiera de las opciones.

Después de varias consultas y otros mensajes en el foro, se procedió armar el script, pero aún tengo el problema.

A considerar:
  • NO importa con cuántos hilos se trabajen; pueden ser dos, tres, cuatro, cinco o seis hilos; eso es a elegir
  • se debe comprobar que el proxy seleccionado es válido, con un timeout u otro medio
  • se debe restringir que el mismo proxy no se utilice en otros hilos
  • cada hilo debe realizar ocho votos; así, si tenemos cinco hilos sería cuarenta votos.
Otra posible solución: trabajar con dos hilos.

Que el primer hilo verifique un proxy válido; luego, que el segundo hilo realice ocho votos con el proxy elegido... en un ciclo.

Favor, si pueden revisar mi código y ayudarme a corregirlo

MUCHAS GRACIAS...

Aguardo sus comentarios. Saludos...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use threads;
  5. use LWP::UserAgent;
  6. use HTTP::Request;
  7. use threads::shared;
  8.  
  9. my $bloqueo : shared = 0;
  10. my @vector : shared="";
  11. system('cls');
  12.  
  13. my ($URL1,$idvotacion,$min,$max,$id,$hilo);
  14.  
  15. $idvotacion = "5425f16ae4b088456e71e524";
  16. $URL1 = "http://www.mipagina.net/poll?command=getPoll&pollId=".$idvotacion;
  17. $hilo = " Hilo A ";
  18.  
  19.  
  20. print "\n";
  21. print " INICIANDO LOS HILOS  ";
  22. print "FECHA Y HORA ";print scalar(localtime),"\n";
  23. print "\n";
  24.  
  25.  
  26.  
  27. my $h1 = threads->create('Obtener_PollKey',$URL1,1,8,$idvotacion,$hilo); #Cuenta de 1 al 5 #Se crea el thread pero no se guarda la referencia my
  28. my $h2 = threads->create('Obtener_PollKey',$URL1,1,8,$idvotacion,"Hilo B"); #Cuenta de 1 al 5 #Se crea el thread pero no se guarda la referencia my
  29.  
  30. $h1->join();
  31. $h2->join();
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40. print "\n";
  41. print " FIN DE LOS HILOS  ";
  42. print "FECHA Y HORA ";print scalar(localtime),"\n";
  43. print "\n";
  44.  
  45. sub Obtener_PollKey  
  46. {
  47.    my ($url,$min,$max,$id,$hilo) = @_;
  48.  
  49.    for ($min; $min < $max ; $min++ ) {
  50.    my $ua = LWP::UserAgent->new;
  51.  
  52.    $ua->agent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0");
  53.    my $req = HTTP::Request->new(GET => $url);
  54.  
  55.    my $response = $ua->request($req);
  56.    my $content = $response->content();
  57.    my $status  = $response->code();
  58.    if ($content =~ /(\"pollKey\":\")(.+)*$\"\,\"(a)/)
  59.       {
  60.        
  61.        #print $2."\n";
  62.            &Votar($2,$id,$hilo,$min);
  63.                
  64.       }
  65.    
  66.   }
  67.  
  68.  
  69.  
  70. }
  71.  
  72. sub Votar
  73. {
  74.  
  75. my ($idv,$key,$hilo,$i) = @_;
  76. my  @proxy = ("184.168.55.226:80","113.201.63.12:80","194.247.12.11:7920","190.167.243.11:8080","200.47.142.202:8080","202.143.122.66:8080","190.38.77.126:8080","190.38.77.126:8080","125.214.163.2:8080","125.39.66.66:80","41.210.55.157:8080","200.10.67.162:8080","218.203.13.176:80","49.236.205.190:8080","187.113.172.125:8080","187.114.208.43:8080","186.214.248.96:8080","187.63.226.185:8080","202.71.128.253:8080","217.11.225.138:80","217.11.255.66:80","213.8.213.0:80","77.232.75.5:80","202.150.168.178:80","62.119.28.242:80","78.224.128.22:80","60.28.209.8:80","201.229.208.2:80","163.30.32.90:80");
  77. my $aleatorio = int(rand(29));
  78. my $URL3 = "http://www.mipagina.net/poll?multResp=2&pollId=".$key."&pollKey=".$idv."&command=saveResponse";
  79. my $control="";
  80. my $c = 0;
  81.  
  82.  
  83.    while ($control = 200 && $c = 8)  {
  84.    my $ua = LWP::UserAgent->new;
  85.    $ua->proxy('http','http://'.$proxy[$aleatorio]);
  86.    $ua->timeout(20);
  87.    $ua->agent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0");
  88.      
  89.    my $req = HTTP::Request->new(GET => $URL3);
  90.    my $response = $ua->request($req);
  91.    my $content = $response->content();
  92.     my $status  = $response->code();
  93.    
  94.    print "\n";
  95.    print "[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]";
  96.    print "\n";
  97.    print "Hilo : " .$hilo; print "\n";
  98.    print "Número: " .$i; print "\n";
  99.    print "[PROXY SELECCIONADO ] ".$proxy[$aleatorio];print "\n";
  100.    print "[LLAVE ] ".$idv;print "\n";
  101.    print "[URL VOTO ] ".$URL3;print "\n";
  102.    print "[RESULTADO ] ".$content;print "\n";
  103.    print "[codigo respuesta ] ".$status;print "\n";
  104.    
  105.    $control = $status;
  106.    $c = $c + 1;
  107.    }
  108.  
  109.  
  110.  
  111. }
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

Re: Hilos y peticiones HTTP

NotaPublicado: 2014-10-03 19:16 @844
por explorer
Atención a los programadores españoles que estén leyendo este hilo: participar en esta discusión puede acarrearles problemas legales, ya que en España es delito la programación/uso de sistemas de fraude de voto.

En México y Colombia, también.

Re: Hilos y peticiones HTTP

NotaPublicado: 2014-10-04 13:09 @589
por jimr1984
Entiendo que esto pueda ser o parecer un delito o pueda ser visto como tal, pero lo que pido es la ayuda sobre el ejemplo, no sobre un objetivo (no hay una URL, ni objetivo específico).

Si gustan podemos cambiar los parámetros... pero el hilo seguirá manteniendo la misma lógica.
De todas maneras agradezco cualquier ayuda que se pueda brindar.

Saludos.

Re: Hilos y peticiones HTTP

NotaPublicado: 2014-10-05 08:35 @399
por danimera
¡jajaja! Yo no sabía que es mi país Colombia eso fuera ilegal... Pero mejor porque no colocar eso como un sistema de encuestas y ya. Yo no creo que las encuestas estén prohibidas. Y espero no tener problemas legales, jejeje.

:D

Re: Hilos y peticiones HTTP

NotaPublicado: 2014-10-05 09:58 @457
por explorer
No, hacer encuestas no es ilegal.

Rellenarlas de forma automática, si es personal, tampoco, porque se supone entonces que eres tú el que está votando de una forma especial.

Lo que sí es delito es votar de forma masiva, saltando las medidas de seguridad, como en el ejemplo, el límite de votos por IP.

Re: Hilos y peticiones HTTP

NotaPublicado: 2014-12-08 11:53 @537
por jimr1984
Entendido, estimado.

Re: Hilos y peticiones HTTP

NotaPublicado: 2017-06-01 17:40 @777
por jimr1984
Por favor, ¿pueden recomendarme o darme algún ejemplo de hilos con el cual pueda realizar las siguientes acciones?

Proceso:

proceso1 visita URL(ABC) y muestra el response 200 OK
proceso2 visita URL(DEF) y muestra el response 200 OK


y así pueden existir N procesos visitando N URL.

Los procesos NO interactúan entre sí ni intercambian información.

El próximo caso que necesito es:

proceso1 visita URL(ABC) obtiene respuesta (procesa la respuesta) y la envía como entrada del proceso2
proceso2 recibe entrada del proceso1 y visita URL utilizando la información recibida.


Si alguien pueda darme un ejemplo, algo que pueda ayudarme a realizar los ejemplos para comprender, por favor.

Re: Hilos y peticiones HTTP

NotaPublicado: 2017-06-02 16:13 @717
por explorer
Hay módulos para hacer peticiones en paralelo, como el caso de LWP::Parallel (que, por debajo, usa LWP::Parallel::UserAgent y LWP::Parallel::RobotUA).

Para el segundo caso, es mejor usar el comando open(), usando el operador tubería '|', para "entubar" la salida de un proceso con la entrada del siguiente. No sé si es esto lo que quieres hacer. El segundo proceso quedaría parado a la espera de recibir la salida del primero.

En el documento perldoc perlipc, en la sección Using open() for IPC aparecen ejemplos de ese tipo de encadenamiento. También en la sección Safe Pipe Opens. También hay ejemplos en perldoc -f open.

Re: Hilos y peticiones HTTP

NotaPublicado: 2017-06-05 10:55 @496
por jimr1984
Muchas gracias. Voy a leer lo indicado.