27 abr. 2013

Descubriendo trending topics de twitter con python-twitter.

Recuerdo la presentación de Efrain en el PyDay en Mérida, donde hablo de la librería tweepy (acá artículo de Efrain sobre el tema) que permite acceder a una cuenta de twitter, actualizar estado entre otras cosas.

Con el auge de twitter como red social en el país me dispuse a probar otra librería de python para twitter llamada python-twitter, la documentación de la librería se puede acceder desde acá. Existe una serie de ejemplos de como usar la librería python-twitter en  github.

Instalar la librería de twitter:
Se usará el comando easy_install o pip como root:
easy_install twitter
ó
pip install twitter

El código que se muestra a continuación lista el ID de los Países, el número ID de cada País. El código original lo pueden ver en el siguiente enlace:
Se ejecuta python:

(python2.7)ernesto@jewel:~/prueba$ python

Python 2.7.3 (default, Jan  2 2013, 16:53:07) 

[GCC 4.7.2] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>>

Se importa el módulo python-twitter:
>>> import twitter


Se instancia la clase Twitter pasando el dominio (el url de la api de twitter) y la versión del api que en este caso es la versión 1:
>>> twitter_api = twitter.Twitter(domain="api.twitter.com", api_version='1')

Se captura los trends disponibles:
>>> trends1 = twitter_api.trends.available()

Se lista los ID de los Países:
>>> for location in trends1:
...     name = location["name"].encode('ascii', 'replace')
...     print "(%d) %s" % (location["woeid"], name)
... 
(1) Worldwide
(2972) Winnipeg
(3369) Ottawa
(3444) Quebec
(3534) Montreal
(4118) Toronto
(8676) Edmonton
(8775) Calgary
(9807) Vancouver
(12723) Birmingham
(13911) Brighton
(13963) Bristol
(15127) Cardiff
(19344) Edinburgh
(21125) Glasgow
(26042) Leeds
(26062) Leicester
(26734) Liverpool
(28218) Manchester
(30079) Newcastle
(30720) Nottingham
(32452) Portsmouth
(34503) Sheffield
(44418) London
(44544) Belfast
(76456) Santo Domingo
(116545) Mexico City
(124162) Guadalajara
(131068) Le?n
(134047) Monterrey
(137612) Puebla
(149361) Tijuana
(332471) Mendoza
(349859) Santiago
(349860) Concepcion
(349861) Valparaiso
(368148) Bogot?
(395269) Caracas
(395270) Maracaibo
(395272) Valencia
(418440) Lima
(455819) Bras?lia
(455820) Bel?m
(455821) Belo Horizonte
(455822) Curitiba
(455823) Porto Alegre
(455824) Recife
(455825) Rio de Janeiro
(455826) Salvador
(455827) S?o Paulo
(455828) Campinas
(455830) Fortaleza
(455831) Goi?nia
(455833) Manaus
(455834) S?o Lu?s
(455867) Guarulhos
(466861) C?rdoba
(466862) Rosario
(468382) Barquisimeto
(468739) Buenos Aires
(560743) Dublin
(580778) Bordeaux
(608105) Lille
(609125) Lyon
(610264) Marseille
(612977) Montpellier
(613858) Nantes
(615702) Paris
(619163) Rennes
(627791) Strasbourg
(628886) Toulouse
(638242) Berlin
(641142) Bremen
(645458) Dortmund
(645686) Dresden
(646099) Dusseldorf
(648820) Essen
(650272) Frankfurt
(656958) Hamburg
(667931) Cologne
(671072) Leipzig
(676757) Munich
(698064) Stuttgart
(718345) Milan
(719258) Naples
(721943) Rome
(725003) Turin
(726874) Den Haag
(727232) Amsterdam
(733075) Rotterdam
(753692) Barcelona
(766273) Madrid
(766356) Malaga
(774508) Seville
(776688) Valencia
(779063) Zaragoza
(906057) Stockholm
(1030077) Bekasi
(1044316) Surabaya
(1047180) Bandung
(1047378) Jakarta
(1062617) Singapore
(1098081) Perth
(1099805) Adelaide
(1100661) Brisbane
(1100968) Canberra
(1101597) Darwin
(1103816) Melbourne
(1105779) Sydney
(1110809) Kitakyushu
(1117034) Chiba
(1117099) Fukuoka
(1117227) Hiroshima
(1117502) Kawasaki
(1117545) Kobe
(1117817) Nagoya
(1118108) Sapporo
(1118129) Sendai
(1118285) Takamatsu
(1118370) Tokyo
(1118550) Yokohama
(1132447) Busan
(1132466) Daegu
(1132481) Gwangju
(1132496) Incheon
(1132567) Suwon
(1132578) Ulsan
(1132599) Seoul
(1154726) Klang
(1154781) Kuala Lumpur
(1167715) Calocan
(1199136) Davao City
(1199477) Manila
(1199682) Quezon City
(1398823) Lagos
(1582504) Johannesburg
(2077746) Samara
(2112237) Yekaterinburg
(2122265) Moscow
(2122471) Nizhny Novgorod
(2122541) Novosibirsk
(2122641) Omsk
(2123260) Saint Petersburg
(2282863) Nagpur
(2295377) Lucknow
(2295378) Kanpur
(2295386) Kolkata
(2295388) Amritsar
(2295401) Jaipur
(2295402) Ahmedabad
(2295408) Indore
(2295411) Mumbai
(2295412) Pune
(2295414) Hyderabad
(2295420) Bangalore
(2295424) Chennai
(2343678) Adana
(2343732) Ankara
(2343843) Bursa
(2344116) Istanbul
(2344117) Izmir
(2345896) Okinawa
(2345975) Daejeon
(2357024) Atlanta
(2357536) Austin
(2358820) Baltimore
(2359991) Baton Rouge
(2364559) Birmingham
(2367105) Boston
(2378426) Charlotte
(2379574) Chicago
(2380358) Cincinnati
(2381475) Cleveland
(2383660) Columbus
(2388929) Dallas-Ft. Worth
(2391279) Denver
(2391585) Detroit
(2414469) Greensboro
(2418046) Harrisburg
(2424766) Houston
(2427032) Indianapolis
(2428184) Jackson
(2436704) Las Vegas
(2442047) Los Angeles
(2449323) Memphis
(2450022) Miami
(2451822) Milwaukee
(2452078) Minneapolis
(2457170) Nashville
(2458410) New Haven
(2458833) New Orleans
(2459115) New York
(2460389) Norfolk
(2466256) Orlando
(2471217) Philadelphia
(2471390) Phoenix
(2473224) Pittsburgh
(2475687) Portland
(2477058) Providence
(2478307) Raleigh
(2480894) Richmond
(2486340) Sacramento
(2486982) St. Louis
(2487610) Salt Lake City
(2487796) San Antonio
(2487889) San Diego
(2487956) San Francisco
(2490383) Seattle
(2503713) Tallahassee
(2503863) Tampa
(2514815) Washington
(15015370) Osaka
(15015372) Kyoto
(20070458) Delhi
(23424738) United Arab Emirates
(23424747) Argentina
(23424748) Australia
(23424768) Brazil
(23424775) Canada
(23424782) Chile
(23424787) Colombia
(23424800) Dominican Republic
(23424801) Ecuador
(23424803) Ireland
(23424819) France
(23424829) Germany
(23424834) Guatemala
(23424846) Indonesia
(23424848) India
(23424853) Italy
(23424856) Japan
(23424868) Korea
(23424900) Mexico
(23424901) Malaysia
(23424908) Nigeria
(23424909) Netherlands
(23424916) New Zealand
(23424919) Peru
(23424922) Pakistan
(23424934) Philippines
(23424936) Russia
(23424942) South Africa
(23424948) Singapore
(23424950) Spain
(23424954) Sweden
(23424969) Turkey
(23424975) United Kingdom
(23424977) United States
(23424982) Venezuela
(56013632) Petaling
(56013645) Hulu Langat


EL ID 1 es para listar los trending topics  mundial, para Venezuela se tiene el ID 23424982, se resalta en negrita los IDs de las ciudades de Venezuela. 

Ahora se va a desplegar la lista de trending topic global(1): 
Se define el valor 1 a WOE_ID para capturar el trending topic global, se instancia la clase Twitter con el dominio api.twitter.com y se define la versión del api como la versión 1. A continuación se captura los trending topic, se muestra los 10 tópicos del mundo.
>>>WORLD_WOE_ID = 1
>>> twitter_api = twitter.Twitter(domain="api.twitter.com", api_version='1')
>>> world_trends = twitter_api.trends._(WORLD_WOE_ID)
>>> trends = world_trends()
>>> for i in range(10):
...     print trends[0]['trends'][i][u'name']
... 
#ILoveCheese
#CaprilesVenezuelayELMUNDOestácontigo
#MiMamáDice
#VamosMaravilla
#AJuicioCaprilesAsesino
Sara McMann
Rene de Calle 13
Sheila Gaff
RDMA
Rene

Al cambiar el valor de la variable WORLD_WOE_ID a la de Venezuela (23424982) se tiene:
>>> WORLD_WOE_ID = 23424982
>>> twitter_api = twitter.Twitter(domain="api.twitter.com", api_version='1')
>>> world_trends = twitter_api.trends._(WORLD_WOE_ID)
>>> trends = world_trends()
>>> for i in range(10):
...     print trends[0]['trends'][i][u'name']
... 
#CaprilesVenezuelayELMUNDOestácontigo
#AJuicioCaprilesAsesino
#MiMamáDice
#MeArrechoCuando
#QueVivan
Feliz Día del Diseñador Gráfico
Estuvimos 5
Dayana Mendoza
Omar Borkan Al Gala
Antonio Rivero


Para el caso de Valencia (395272):
>>> WORLD_WOE_ID = 395272
>>> twitter_api = twitter.Twitter(domain="api.twitter.com", api_version='1')
>>> world_trends = twitter_api.trends._(WORLD_WOE_ID)
>>> trends = world_trends()
>>> for i in range(10):
...     print trends[0]['trends'][i][u'name']
... 
#CaprilesVenezuelayELMUNDOestácontigo
#AJuicioCaprilesAsesino
#MeArrechoCuando
#MiMamáDice
Omar Borkan Al Gala
#TROPA
Feliz Día del Diseñador Gráfico
Estuvimos 5
Dayana Mendoza
Antonio Rivero

De esta forma se puede listar los 10 tópicos  según el País o ciudad utilizando Python. 

22 abr. 2013

Descubrir equipos en una Red Local con Python (ipcalc y scapy).

Si se tiene una red con asignación abierta de IPs, la administración se hace algo complicada, así que se necesita tener un registro de la asignación de IPs a los equipos de la red local.

Una amiga administradora hizo un registro con una herramienta propietaria en Windows. Recordé la librería de python ipcalc que facilita el cálculo de direcciones IP y redes (un artículo de su uso acá).

Además existe la librería o herramienta scapy, el cual permite capturar y modificar paquetes de red (la documentación se puede revisar en el siguiente enlace).

Una alternativa es usar los comandos ping y arp por medio de python con el módulo commands; es preferible usar scapy que permite descubrir la dirección MAC de los equipos que tienen asignado las IPs.

Así que por un lado se usa ipcalc para definir el rango de la red según la mascara y luego con scapy se descubre las direcciones MAC.

A continuación el código que devuelve la dirección MAC de cada IP utilizada en la red:

#!/usr/bin/env python



#Se importa los modulos necesarios.

from ipcalc import IP, Network

from scapy.all import srp,Ether,ARP,conf



#Se desactiva el verbose de la captura y envio de paquetes.



conf.verb=0

#Se genera un ciclo con el rango de IPs dando la RED y la mascara

for ip in Network('192.168.12.128/25'):

    #Se realiza un broadcast de MAC pasando cada IP el cual devuelve la 

    #direccion MAC de la IP consultada.

    ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=str(ip)),timeout=2)

    for snd,rcv in ans:

        #Se muestra en pantalla la direccion MAC y la direccion IP

        print rcv.sprintf(r"%Ether.src% y %ARP.psrc%")





Al ejecutar el programa se tiene lo siguiente:

ernesto@jewel:~/bin/python$ sudo ./descubrir.py

WARNING: No route found for IPv6 destination :: (no default route?)

00:26:35:c6:93:0d y 192.168.12.130

00:2e:0b:c5:70:3c y 192.168.12.132

00:2e:90:c2:ec:51 y 192.168.12.134

00:50:ca:c1:71:8a y 192.168.12.136

00:32:57:ce:81:e7 y 192.168.12.138

00:2e:90:c4:58:7c y 192.168.12.139

00:2c:25:ce:ae:be y 192.168.12.140

d0:37:88:c4:11:ed y 192.168.12.141

00:2e:90:cc:f5:16 y 192.168.12.142

00:2c:c4:c4:26:28 y 192.168.12.148

40:7a:ab:ce:11:c0 y 192.168.12.150

3c:53:8e:cc:4d:89 y 192.168.12.161

1c:5b:d6:c9:6d:a9 y 192.168.12.169

00:2e:7f:c4:8d:d7 y 192.168.12.170

00:24:c2:c8:23:8d y 192.168.12.172

68:19:ed:c75:44:31 y 192.168.12.174

74:3f:68:c2:91:d6 y 192.168.12.196

00:30:aa:c2:6d:3c y 192.168.12.201

c8:3c:dc:c8:a9:53 y 192.168.12.208

00:34:f2:c5:2f:21 y 192.168.12.211

00:34:f2:cc:2e:d0 y 192.168.12.212

00:34:f2:c5:35:70 y 192.168.12.214

00:34:f2:c3:1a:ee y 192.168.12.215

00:34:f2:c3:1b:4c y 192.168.12.216

00:34:f2:c5:33:49 y 192.168.12.224

00:3c:02:c6:b5:3f y 192.168.12.225

00:3e:90:c8:bb:d6 y 192.168.12.251

Así pues desde Linux y con Python se puede capturar la información de las direcciones MAC de las IPs asignadas con pocas líneas de código.