Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - remiotore

#1
Python / Re:Contador de Palabras
Mayo 18, 2018, 05:44:00 AM
Ya sé que no son comparables pero era por comentar grupos más o menos conocidos para aquellas personas que tienen cierto interés en política jeje Aunque al decir esto no digo que no sean conocidos Hasel y demás, simplemente no me vinieron a la cabeza a la hora de realizar la prueba.
De todas formas, todo esto me pareció algo curioso xD
Desde mi punto de vista, donde esté un libro clásico de política que se quiten todos estos vendedores de humo, o mejor vendedores de ideas ;D
#2
Python / Contador de Palabras
Mayo 15, 2018, 11:12:48 AM
El otro día me encontraba en un concierto "político" al que me invitaron. Estando allí vi que la gente se animaba cada vez que decían la palabra X o la palabra Y, y en cada canción las repetían como 2 o 3 veces. Yo ya llegué a pensar "¡Pero si este grupito está haciendo negocio porque les siguen por decir justo lo que quieren escuchar!".
Decidí entonces descargarme todas sus letras, meterlas en un fichero de texto y empezar a filtrar palabra por palabra sus canciones.

El resultado fue bastante curioso. Aquí tienen el código:
Código: php
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from collections import defaultdict
import urllib, re, operator
try:
from termcolor import colored
except:
print "Instala TERMCOLOR!\n\tpip install termcolor"

d = defaultdict(int)
aa = []
ae = []
ai = []
ao = []
au = []
aa2 = []
ae2 = []
ai2 = []
ao2 = []
au2 = []

LONGITUD = int(raw_input("Caracteres mínimos de la palabra? "))
MIN = int(raw_input("Minimo repeticiones: "))
MAX = int(raw_input("Maximo repeticiones: "))

BANNED = ("a","ante","bajo","cabe","con","contra","de","desde","en","entre","hacia","hasta","para","por","segun","sin","so","sobre","tras","durante","mediante","excepto","salvo","incluso","mas","menos","cerca","lado","alrededor","antes","arreglo","debajo","dentro","detras","encima","cuanto","enfrente","fuera","gracias","lejos")
REPLACEMENT = {"á":"a","é":"e","í":"i","ó":"o","ú":"u","ñ":"nn",".":"",",":"","?":"","¿":"","!":"","¡":"","(":"",")":"","`":"",":":"",";":"","'":""}

with open("", 'r') as file:
for line in file:
for w in line.split():
w = w.lower()
for key, value in REPLACEMENT.items():
w = w.replace(key, value)
if w not in BANNED:
if len(w) >= LONGITUD:
d[w] += 1

o = sorted(d.items(), key=operator.itemgetter(1))

print colored("Listado por Número de Repeticiones","red")


while(MIN <= MAX):
print "###########################"
for i in o:
if( i[1] == MIN ):
fila = "#\t" + i[0] + " " + str(i[1])
print fila + " " * (20 - len(fila)) + "#"
MIN += 1

for i in o:
word = i[0]
if(word[-1] in ("a","e","i","o","u")):
if(word[-1] == "a"):
aa.append(word)
elif(word[-1] == "e"):
ae.append(word)
elif(word[-1] == "i"):
ai.append(word)
elif(word[-1] == "o"):
ao.append(word)
elif(word[-1] == "u"):
au.append(word)
else:
if(word[-2] in ("a","e","i","o","u")):
if(word[-2] == "a"):
aa2.append(word)
elif(word[-2] == "e"):
ae2.append(word)
elif(word[-2] == "i"):
ai2.append(word)
elif(word[-2] == "o"):
ao2.append(word)
elif(word[-2] == "u"):
au2.append(word)


print colored("#" + "A" + "#","green")

print colored("\tPrincipales  con A","red")
for i in sorted(aa):
print i,
print ""
print colored("\tRimadas con  A","red")
for i in sorted(aa2):
print i,
print ""


print colored("#" + "E" + "#","green")

print colored("\tPrincipales  con E","red")
for i in sorted(ae):
print i,
print ""
print colored("\tRimadas con  E","red")
for i in sorted(ae2):
print i,
print ""


print colored("#" + "I" + "#","green")

print colored("\tPrincipales  con I","red")
for i in sorted(ai):
print i,
print ""
print colored("\tRimadas con  I","red")
for i in sorted(ai2):
print i,
print ""


print colored("#" + "O" + "#","green")

print colored("\tPrincipales  con O","red")
for i in sorted(ao):
print i,
print ""
print colored("\tRimadas con  O","red")
for i in sorted(ao2):
print i,
print ""


print colored("#" + "U" + "#","green")

print colored("\tPrincipales  con U","red")
for i in sorted(au):
print i,
print ""
print colored("\tRimadas con  U","red")
for i in sorted(au2):
print i,
print ""


Como podéis ver, eliminamos todas las preposiciones, tildes y otros signos como puntos y comas.
Tras eso, el programa comienza a buscar las palabras que tienen una longitud mayor o igual a la que hemos introducido.
Luego muestra las palabras ordenadas según el número de repeticiones entre el mínimo y el máximo que especificamos.
Más tarde muestra las filtra por la vocal y muestra las que terminan en una determinada vocal o las que riman con esa vocal.



¿Qué podemos hacer con esto? ¡NUESTRO PROPIO GRUPO DE RAP O DE LO QUE SEAAA! ¡WUUUUHHH!  ;D

#3
Hacking / IP Grabber PHP
Mayo 08, 2018, 08:54:05 PM
Buenas noches, compañerxs de Underc0de.
Hace unos días leí un articulo en el que se planteaba la manera de averiguar la IP de un usuario de Whatsapp. En este se ofrecía un código muy sencillo y algo "aburrido" así que decidí modificarlo y este fue el resultado:

index.php
Código: php

<?php

if (!empty($_POST)){
echo '<h1>Bienvenidx, ' . htmlspecialchars($_POST["client"]) . '!</h1>';
echo '<br>La víctima será redirigida a <b>'. htmlspecialchars($_POST["url"]) . '</b>!<br><br>';
$VLINK = "/grabber.php?url=" . htmlspecialchars($_POST["url"]);
echo "<a href='" . $VLINK . "'>¡Enlace para la víctima! No lo clickes... ಠ╭╮ಠ</a>";


echo "<h3>Más resultados para " . htmlspecialchars($_POST["url"]) . "</h3>";
echo "<table border='1'>";
echo "<thead>";
echo "<tr>";
echo "<th>IP Víctima</th>";
echo "<th>Fecha</th>";
echo "<th>Requested URI</th>";
echo "<th>Method</th>";
echo "<th>User-Agent</th>";
echo "</tr>";
echo "</thead>";
echo "<tbody>";

foreach(file('log') as $line) {
if (strpos($line, htmlspecialchars($_POST["url"])) !== false) {
echo $line . "\n";
}
}

echo "</tbody>";
echo "</table>";
echo "<br />";
echo "<center> <input type='button' value='ReLoad' onclick='window.location.reload()' > </center>";


}else{
echo "<h1>URL REDIRECTER!</h1>";

echo "<h2>¡Bienvenidx a nuestra página web!</h2><br>";
echo "Introduce el enlace a cualquier web que desee que la víctima sea redirigidx.<br>";
echo "La víctima acederá a esa dirección y obtendremos información acerca de su dispositivo <b>(IP, Browser, etc)</b>.<br>";
echo "Recargando la página será capaz de ver qué IP's han accedido a ese enlace según la fecha.<br><br>";

echo '<form action="' . htmlspecialchars($_SERVER["PHP_SELF"]) . '"" method="post">
URL: <input type="text" name="url">
<input type="hidden" name="client" value="' . htmlspecialchars($_SERVER["REMOTE_ADDR"]) . '" >
<input type="submit">
</form>';
}

?>


grabber.php
Código: php

<?php

if (getenv('HTTP_CLIENT_IP'))
    $VICTIM = getenv('HTTP_CLIENT_IP');
else if(getenv('HTTP_X_FORWARDED_FOR'))
    $VICTIM = getenv('HTTP_X_FORWARDED_FOR');
else if(getenv('HTTP_X_FORWARDED'))
    $VICTIM = getenv('HTTP_X_FORWARDED');
else if(getenv('HTTP_FORWARDED_FOR'))
    $VICTIM = getenv('HTTP_FORWARDED_FOR');
else if(getenv('HTTP_FORWARDED'))
   $VICTIM = getenv('HTTP_FORWARDED');
else if(getenv('REMOTE_ADDR'))
    $VICTIM = getenv('REMOTE_ADDR');
else
    $VICTIM = 'UNKNOWN';

if (isset($_GET['url'])){
$URL = $_GET['url'];
if(substr( $URL, 0, 4 ) !== 'http'){
$URL = 'http://' . $URL;
}
}else{
$URL = 'https://www.google.com';
}

$FILE="log";

$BANNED_IP="127.0.0.1";

$NOW = date_format(new DateTime(), 'd/m/Y H:i:s');

//if ($VICTIM !== $BANNED_IP){
$txt =  "<tr>" .
"<th>" . $VICTIM . "</th>" .
"<th>" . $NOW . "</th>" .
"<th>" . $_SERVER['REQUEST_URI'] . "</th>" .
"<th>" . $_SERVER['REQUEST_METHOD'] . "</th>" .
"<th>" . $_SERVER['HTTP_USER_AGENT'] . "</th>" .
"</tr>";

    $myfile = file_put_contents($FILE, $txt.PHP_EOL , FILE_APPEND);
//}

header('Location: ' . $URL);
exit;

?>



Modo de Empleo:

Si somos los atacantes, accedemos al índice y se nos mostrará la siguiente pantalla:



En ella introducimos la URL a la que queremos que acceda la víctima. En este caso, la web debe ser alguna que pueda interesarle a la víctima, sino, como es lógico, no servirá de nada porque probablemente no abra el enlace.
Utilizaremos No tienes permitido ver los links. Registrarse o Entrar a mi cuenta como prueba.

Veremos la siguiente pantalla:



Como podemos ver en ella hay un enlace. NO DEBEMOS ABRIRLO ya que si lo hiciéramos, nuestra IP quedaría registrada y ese no es el objetivo.
Tras enviárselo a nuestra víctima, refrescamos la página pulsando el botón que hay.

El resultado será este:



Si nos fijamos un poco más veremos que el enlace generado es "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Podríamos modificarlo manualmente y reenviarlo a distintas personas añadiendo el link al final de "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta" .

Post-Script:
Es posible que haya problemas a la hora de guardar los resultados en el fichero de salida llamado en este ejemplo "log".
Eso puede deberse a los permisos de las carpetas y de los usuarios. Probado en un Linux Mint, no hubo problema alguno tras crear el fichero (touch log) y cambiarle el propietario (chown www-data:www-data log) dentro de la carpeta raiz de la web(/var/www/html/).
En XAMPP no tuve problemas y en una web de hosting gratuita cuyo nombre he olvidado tampoco.

Cosas a recordar:

  • El enlace queda tal que así "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta" y es algo sospechoso. Lo apropiado sería ocultarlo con algún URL Shortener de esos que hay por ahí. O acortarlo vosotrxs mismxs.
  • No es la mejor herramienta del mundo pero puede ser interesante para averiguar qué sistema, versión y navegador, además de la IP, está usando la persona que lo ha abierto. Esto puede ser determinante en futuras fases de un ataque.

Podéis probarlo en el siguiente link:
Editado
Muchas gracias por vuestra atención! Un saludo!

#4
Python / Simple DirBuster
Marzo 14, 2018, 05:11:41 PM
Buenos días, tardes o noches, compañerxs!
Hacía ya un tiempo que no escribía ningún post en el foro por culpa de los estudios. Pero es lo que toca jeje
Hoy os traigo un script que permite encontrar directorios interesantes de una web. Sólo se necesitan dos cosas, el script y un diccionario.

Código: php
#!/usr/bin/python

import os, sys
try:
    import requests
except:
    print "[!]Requests module not found. Try to (re)install it.\n[!]pip install requests"
try:
    from termcolor import colored
except:
    print "[!]Termcolor module not found. Try to (re)install it.\n[!]pip install termcolor"

oks = []

print("EASY DIRBUSTER!")

def parser():
    #URL
    flag = False
    while ( flag == False ):
        url = raw_input("Insert an URL (with HTTP:// or HTTPS://)\n\tURL: ")
        if (url.startswith("http://")):
            flag = True
        elif (url.startswith("https://")):
            flag = True
        else:
            pass
    #PATH
    flag = False
    while ( flag == False ):
        path = raw_input("Insert path to File (ex: /root/wordlists/list.txt)\n\tPATH: ")
        if (os.path.isfile(path)):
            flag = True
        else:
            pass
    return url, path

def requester(url, fpath):
    if (requests.get(url).status_code != 200):
        return 0
    else:
        with open(fpath) as f:
            for path in f:
                temp = url + "/" + str(path).replace("\n","") + "/"
                r = requests.get(temp)
                if (r.status_code == 200):
                    print colored(("[!] " + str(r.status_code) + " OK!! -> " + temp), 'green')
                    oks.append(str(temp))
                elif (r.status_code == 403):
                    print colored(("[!] " + str(r.status_code) + " Forb -> " + temp), 'yellow')
                else:
                    print colored(("[!] " + str(r.status_code) + " NotF -> " + temp), 'red')
        return 1

url, path = parser()
#print url + path
if (requester(url, path) == 0):
    print "Error. URL not available."
else:
    print "200 OK Requested sites: "
    for ok in oks:
        print "\t" + ok
    print "Finished Successfully!"


PoC:


No es muy complicado pero es bastante útil. Y tampoco creo que sea necesario explicarlo en detalle.
Para más información visitad este enlace No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Pd: El otro día me recomendaron Siddhartha, de Hermann Hesse. Es muy interesante el libro. Os lo recomiendo si tenéis un rato :)
#5
Buenas tardes, compañeros y compañeras de Underc0de!
Trabajando en un script me encontré con un problema que no sé cómo solucionar dada mi falta de experiencia y conocimientos. Estoy iniciandome en el mundo del scripting en linux y me gustaría saber cómo solucionarlo.

Estaba intentando automatizar el escaneo de IP's y mostrar el output tabulando cada linea de tal forma que el resultado quedara como:
IP: 192.168.0.1
       22/tcp open ssh
       80/tcp open http
       443/tcp open ssl/http

Pero en lugar de obtenerlo de esa forma, realiza la tabulación con cada palabra por haber espacios entre ellas, de tal forma que el resultado es:
IP: 192.168.0.1
       22/tcp
       open
       ssh
       80/tcp
       open
       http
       443/tcp
       open
       ssl/http

El script es el siguiente:
Código: php

#!/bin/bash
for ip in $(sudo nmap -sP 192.168.1.0/24 | grep "Nmap scan report" | cut -d " " -f 5 | sort);
        do echo "IP: "$ip; echo "    ";
        for port in $(sudo nmap -sV $ip | grep open);
                do echo -e "\t"$port
        done
done


Pido disculpas por mi evidente falta de conocimientos pero no he logrado encontrar nada que me ayudara respecto a esto.
¡Muchas gracias por vuestra atención!
#6
Python / Re:Subdomining - Subdominios sin bruteforcing
Noviembre 20, 2017, 10:24:54 AM
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Hola No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

¡Está genial!, la verdad me parece una pasada que la comunidad comparta herramientas, eso me encanta. Yo creería que se podría crear un estilo de reposito a estilo de GitHub pero para Underc0de, donde el hecho es centralizar este tipo de tools que para alguien han de ser útiles en algún momento :).

Aparte de eso, lo que andabas buscando de Tweepy, yo tengo la solución, trabajé con ello ya hace varios años pero funciona perfectamente :). Déjame si hoy posteo en el foro y así también aporto.

Un saludo.


Gracias :D Y sí, sería una buena idea ^_^
Te lo agradecería mucho si pudieras compartir la solución!
#7
Python / Subdomining - Subdominios sin bruteforcing
Noviembre 19, 2017, 07:33:16 PM
¡Buenos días a todxs! Hoy os traigo otro script que espero que os sea de utilidad :D
Este script nos permite averiguar los subdominios sin fuerza bruta. Por extensión, hay poca interacción con los servidores ya que los subdominios los obtiene directamente de los motores de búsqueda (Ask, Bing, Yahoo y Google) mediante Dorks. La única interacción se debe a la resolución de la IP con el método "gethostbyname" del módulo Socket.
Lógicamente, al no tratarse de un escaneo con fuerza bruta, no nos devuelve todos los subdominios, pero sí aquellos públicamente localizables a través de los ya mencionados motores de búsqueda.

PoC:
Introduzcamos una web al azar  ;) y el número de páginas que queremos recorrer en los motores de búsqueda.



Esperamos a los resultados:



Y finalmente nos muestra el esquema gráfico de los dominios y las direcciones de cada servicio web.




Código: python

# -*- coding: utf-8 -*-
import re
import socket
import urllib2
import networkx as nx
import matplotlib.pyplot as plt

print ' _______           ______   ______   _______         _______ _________ _       _________ _        _______ '
print '(  ____ \|\     /|(  ___ \ (  __  \ (  ___  )       (       )\__   __/( (    /|\__   __/( (    /|(  ____ \ '
print '| (    \/| )   ( || (   ) )| (  \  )| (   ) |       | () () |   ) (   |  \  ( |   ) (   |  \  ( || (    \/'
print '| (_____ | |   | || (__/ / | |   ) || |   | | _____ | || || |   | |   |   \ | |   | |   |   \ | || |      '
print '(_____  )| |   | ||  __ (  | |   | || |   | |(_____)| |(_)| |   | |   | (\ \) |   | |   | (\ \) || | ____ '
print '      ) || |   | || (  \ \ | |   ) || |   | |       | |   | |   | |   | | \   |   | |   | | \   || | \_  )'
print '/\____) || (___) || )___) )| (__/  )| (___) |       | )   ( |___) (___| )  \  |___) (___| )  \  || (___) |'
print '\_______)(_______)|/ \___/ (______/ (_______)       |/     \|\_______/|/    )_)\_______/|/    )_)(_______)'
                                                                                                         

print 'Introduce un dominio: '
domain =  raw_input('(ej: "cisco.com" y no "www.cisco.com") \n')
pages = int(raw_input('Número de páginas: '))
subdomains = []
finalSubDomains = []

def google(domain, pages):
print "SEARCHING WITH GOOGLE"
counter = 0
for page_no in range(0, pages*10, 10):
google = "https://www.google.es/search?q=site:" + domain + "+-site:www." + domain + "&start=" + str(page_no)
try:
#print google
request = urllib2.build_opener()
request.addheaders = [('User-agent', 'Mozilla/5.0')]
source = request.open(google).read()
urls = re.findall('<cite.*?>(.*?)<\/cite>', source)
for url in urls:
counter += 1
if (url not in subdomains) and (domain in url) and ('.' in url):
url = (url.replace('http://','')).replace('https://','')
url = url.split('/')[0]
subdomains.append(url) #).replace('/','')
except:
pass
print "\t\t" + str(counter) + " resultados."

def yahoo(domain, pages):
print "SEARCHING WITH YAHOO"
counter = 0
for page_no in range(1, pages*10, 10):
yahoo = "https://search.yahoo.com/search?p=site:" + domain + "+-site:www." + domain + "&b=" + str(page_no)
try:
#print yahoo
request = urllib2.build_opener()
request.addheaders = [('User-agent', 'Mozilla/5.0')]
source = request.open(yahoo).read()
urls = re.findall('<span class=" fz-ms fw-m fc-12th wr-bw lh-17">(.*?)/', source)
for url in urls:
counter += 1
if (url not in subdomains) and (domain in url) and ('.' in url):
url = (url.replace('http://','')).replace('https://','')
url = (url.split('/')[0]).replace('/','')
subdomains.append((((url.replace('<b>','')).replace('<','')).replace('http://','')).replace('https://',''))
except:
pass
print "\t\t" + str(counter) + " resultados."

def ask(domain, pages):
print "SEARCHING WITH ASK"
counter = 0
for page_no in range(1, pages+1, 1):
ask = "http://www.ask.com/web?q=site:" + domain + "+-site:www." + domain + "&page=" + str(page_no) + "&o=0&l=dir&qsrc=998&qo=pagination"
try:
#print ask
request = urllib2.build_opener()
request.addheaders = [('User-agent', 'Mozilla/5.0')]
source = request.open(ask).read()
urls = re.findall('"domain":(.*?),"contentDesignation"', source)

for url in urls:
counter += 1
if (url not in subdomains) and (domain in url) and ('.' in url):
subdomains.append((((url.replace('http://','')).replace('https://','')).replace('"','')).replace('/',''))
except:
pass
print "\t\t" + str(counter) + " resultados."

def bing(domain, pages):
print "SEARCHING WITH BING"
counter = 0
for page_no in range(1, pages+1, 1):
bing = "https://www.bing.com/search?q=site:" + domain + "+-site:www." + domain + "&go=Submit&first=" + str(page_no)
try:
#print bing
request = urllib2.build_opener()
request.addheaders = [('User-agent', 'Mozilla/5.0')]
source = request.open(bing).read()
urls = re.findall('<div class="b_title"><h2><a href="(.*?)" h="ID=SERP', source)
for url in urls:
counter += 1
if (url not in subdomains) and (domain in url) and ('.' in url):
url = (((url.replace('http://','')).replace('https://','')).replace('"',''))
url = url.split('/')[0]
subdomains.append(url)
except:
pass
print "\t\t" + str(counter) + " resultados."

def netcraft(domain):
print "SEARCHING WITH NETCRAFT"
netcraft = "https://searchdns.netcraft.com/?restriction=site+ends+with&host=" + domain
try:
#print netcraft
request = urllib2.build_opener()
request.addheaders = [('User-agent', 'Mozilla/5.0')]
source = request.open(netcraft).read()
except:
pass

def shodan(domain):
print "SEARCHING WITH SHODAN"
shodan = "https://www.shodan.io/search?query=" + domain
try:
#print shodan
request = urllib2.build_opener()
request.addheaders = [('User-agent', 'Mozilla/5.0')]
source = request.open(shodan).read()

except:
pass




google(domain, pages)
yahoo(domain,pages)
ask(domain,pages)
bing(domain,pages)
#netcraft(domain) #PENDIENTE
#shodan(domain) #PENDIENTE

print "Eliminando duplicados..."

for element in subdomains:
if element not in finalSubDomains:
finalSubDomains.append(element)

print "\nDOMINIO BUSCADO:\t" + domain.upper() + "\n"


g = nx.Graph()
color_map = []
g.add_node(domain)

for i in sorted(finalSubDomains):
try:
ip = socket.gethostbyname(i)
except:
ip = "Connection Error"
print i + ' | --------------------- | ' + ip
nodo = str(i) + "\n" + str(ip)
g.add_node(nodo)
g.add_edge(domain, nodo)

print "Configuring node's color..."
for node in g:
        if node == domain:
                color_map.append('red')
        else:
                color_map.append('white')

print "Dibujando el gráfico..."
nx.draw(g, node_color = color_map, with_labels=True, font_size=10)
nx.spring_layout(g,k=0.1,iterations=50)
plt.show()


Espero que, a pesar de ser un neófito, esto pueda ser de alguna utilidad para alguien  ;D
Muchas gracias por vuestra atención :)
#8
Creo que estos tres enlaces pueden ser de utilidad:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Por el momento tengo que investigar un poco más en el tema, pero parece interesante este módulo  :D
#9
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Muy bueno bro!!! Se lo ve excelente!!!
Gran aporte! no teniamos nada de esto en el foro

Saludos,
ANTRAX
¡Muchas gracias! Hace tiempo que visito el foro pero no había posteado nunca nada. Espero seguir posteando de vez en cuando algún pequeño proyecto :)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Si estas limitado por el API, dudo mucho que puedas hacer algo.


Ahora, ¿intentaste simular un navegador, pedir la página y parsear la información?
Tenía a medias un proyecto así (justo pensando en esas posibles limitaciones) antes de entrar a la universidad y lo tuve que dejar tirado. Es lo único que se me ocurre.

Saludos!
Verás, en un principio intenté hacerlo con Instagram pero no logré nada. Y vi que el mecanismo era similar en twitter. Me explico:
Cuando accedes a un perfil en instagram o en twitter, para obtener más resultados debes scrollear hacia abajo. Sé más o menos algo de urllib y requests pero con eso sólo descargo el código de la página para los primeros elementos.
No sé si hay alguna forma de ejecutar javascript mediante esos módulos o de activar ese OnScroll de Javascript.
Y por eso ando algo perdido y recurrí a un módulo específico para esto ;D Pero ya seguiré investigando a ver si hay alguna otra manera  ;)
#10
¡Buenas! Estoy creando un script en Python que genera un gráfico con el módulo NetworkX para ver cómo se relaciona un usuario con la gente que sigue y a su vez, cómo se relacionan esos mismos.
A mitad de este pequeño proyecto me encontré con el problema de que las peticiones que se realizan a Twitter están limitadas y se debe esperar 15 minutos para continuar trabajando. Este problema es el principal ya que retrasa incluso horas los resultados finales. Me gustaría saber si hay alguna forma de evitar esto.

Dejo el script por si alguien más desea utilizarlo o continuar/colaborar con su desarrollo.
Lamento que haya algo de desorden  :-[
Espero que los comentarios adjuntos sean de utilidad por si alguien tiene dudas sobre su funcionamiento :)

Para iniciarlo, debéis introducir el nombre de un usuario con perfil público para comenzar el escaneo.

El resultado es una imagen como la siguiente:


Código: python

# -*- coding: utf-8 -*-
import tweepy
import matplotlib.pyplot as plt
import networkx as nx
from termcolor import colored

print' ######                                           '
print' #     # #   # ######  ####  #    #   ##    ####  '
print' #     #  # #      #  #    # ##  ##  #  #  #      '
print' ######    #      #   #    # # ## # #    #  ####  '
print' #   #     #     #    #    # #    # ######      # '
print' #    #    #    #     #    # #    # #    # #    # '
print' #     #   #   ######  ####  #    # #    #  ####  '
print'                                                  '



print 'Automated tool to generate a TWITTER User\'s Relational Network Graph!'
print colored('*User must have public profile.','yellow')

# Twitter variables
CK = '' # Client Key
CS = '' # Client Secret
AT = '' # Access Token
AS = '' # Access Token Secret
auth = tweepy.OAuthHandler(CK,CS) # Getting Access
auth.set_access_token(AT,AS) # with Tokens
api = tweepy.API(auth, wait_on_rate_limit=True) # Main variable 'api'. Wait on rate limit = True is for the request number's limitation by twitter
alpha = raw_input("Insert an username: ") # Alpha, the first user from where we are looking for
ids = api.friends_ids(alpha) # IDentification number of the whole friends of the user

print "The user has " + str(len(ids)) + " ids located."

# NetworkX & Pyplot variables
g = nx.Graph() # Create the graph
color_map = [] # Void array of colors
g.add_node(alpha) # We add the first node by tagname

# We create the rest of nodes and join them with the first node by edges
for i in range(0 , len(ids), 1):
ids_name = api.get_user(ids[i]).screen_name
g.add_node(ids_name)
g.add_edge(alpha, ids_name)

# We are going to comprovate if the users listed in the array ids follows between themself
# usu = usu1, usu2, usu3
# usu = usu1, usu2, usu3
# usu1 to usu2, usu1 to usu3, usu2 to usu1, usu2 to usu3, usu3 to usu1 AND usu3 to usu2 basically
for id1 in ids:
id1_name = api.get_user(id1).screen_name # User name
print '\n'
print colored('#'*(len(id1_name)+2),'green')
print colored('#'+id1_name.upper()+'#','green')
print colored('#'*(len(id1_name)+2),'green')

for id2 in ids:
id2_name = api.get_user(id2).screen_name # User name
if (id1_name == id2_name): # If the user is equal to himself, pass
pass
else:
a = api.show_friendship(source_screen_name=id1_name, target_screen_name=id2_name) # Get the relationship between this two different users in a list
followed = str(a[1]).split(',')[2].split('=')[1] #Param of the list followed_by=False/True
following = str(a[1]).split(',')[4].split('=')[1] #Param of the list following=False/True
print "\tWith " + colored(id2_name,'cyan')
print colored("\tFollowed? ",'green') + colored(followed,'red') + colored("\tFollowing? ",'green') + colored(following,'red')

if (followed == "True") and (following == "True"): #If them follow and are followed
g.add_edge(id1_name, id2_name,  edge_color="red", style="doted") # Join them with a doted and style of edge
elif (followed == "True"):
g.add_edge(id2_name, id1_name,  edge_color="blue") # Join them with a blue edge
elif (following == "True"):
g.add_edge(id1_name, id2_name,  edge_color="green")
else:
pass

# Give color red to the main node (user we are looking for)
# If its not the main user, paint it white
for node in g:
if node == alpha:
color_map.append('red')
else:
color_map.append('white')

# Draw the graphic
nx.draw(g, node_color = color_map, with_labels=True)
nx.spring_layout(g,k=0.15,iterations=20)
plt.show()


En este mismo foro hay un tutorial muy bueno sobre cómo obtener las claves necesarias cuyo autor es No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Espero que les sea de alguna utilidad. Gracias por visitar mi primer post!  ;)