Advertisement
cmiN

sec

Jun 28th, 2018
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.19 KB | None | 0 0
  1. #! /usr/bin/env python
  2. # Deasupra e o linie care transforma scriptul in executabil.
  3.  
  4.  
  5. # Importam module standard pt. expresii regulate si parsat URLuri.
  6. import json
  7. import re
  8. import urllib
  9. import urlparse
  10.  
  11. # Importam module terte pt. citire URL si parsare continut HTML.
  12. import requests
  13. from bs4 import BeautifulSoup as BS
  14.  
  15.  
  16. def get_myip():
  17.     # Adresa de la care scoatem IP-ul nostru din continutul paginii.
  18.     url = "http://ipv4.icanhazip.com"
  19.     resp = requests.get(url)
  20.     ip = resp.text.strip()
  21.     return ip
  22.  
  23.  
  24. def get_ip_details(ip):
  25.     # Extragem si afisam niste detalii interesante despre IP-ul dat ca parametru.
  26.     url = "https://ip-info.org/?language=en&info=91.202.90.119"
  27.    
  28.     # Se vede clar cum adresa de mai sus poate fi templetizata mai greoi, asa ca
  29.     # avem mai jos o metoda mult mai generica pt. orice fel de modificare pe adrese
  30.     # ce iti vor putea fi utile in cazul in care manipulezi URL-uri (cu urlparse)
  31.    
  32.     # Sparge url-ul, oricare ar fi el, in bucati bine cunoscute.
  33.     split = list(urlparse.urlsplit(url))
  34.     print("Inainte: {}".format(split))    # afisare pt. a vedea cum arata si la ce e buna treaba asta
  35.     # Iei query-ul (adica parametrii aia dupa semnul "?") si-l faci un dictionar.
  36.     new_query = dict(urlparse.parse_qsl(split[3]))
  37.     # Acum hai sa inlocuim ip-ul ala de mai sus cu cel dat ca parametru.
  38.     new_query.update({
  39.         "info": ip
  40.     })
  41.     # Fa din dictionarul abia actualizat un string query la loc (cum era si inainte,
  42.     # numai ca acum contine IP-ul modificat).
  43.     split[3] = urllib.urlencode(new_query)
  44.     # Transforma noul split actualizat (cu noul query cu IP modificat) inapoi intr-un URL
  45.     # in acelasi format ca si inainte.
  46.     url = urlparse.urlunsplit(split)
  47.     print("Dupa: " + url)
  48.     # De asemenea, se pot modifica si alte campuri din `split`.
  49.  
  50.     # Acum ca avem un URL cu ip-ul nostru, cere informatii despre el.
  51.     resp = requests.get(url)
  52.     resp.raise_for_status()    # nu e nevoie, insa asta verifica daca nu da eroare
  53.     data = resp.text    # si aici avem continutul HTML
  54.  
  55.     # Aici e partea interesanta: vom parsa cu BS continutul si vom extrage niste detalii
  56.     # de interes.
  57.     soup = BS(data, "html5lib")
  58.     # Selectam tabelul de interes (ca primul rezultat care urmeaza regula de mai jos).
  59.     table = soup.find(
  60.         "table",
  61.         style="border-style: solid;border-width: 1px;"
  62.     )
  63.     print("Tabel: \n{}".format(table))
  64.     # Si acum din acel tabel scoatem niste informatii faine cu expresii regulate.
  65.     # (poti folosi: https://regexr.com ca sa le verifici la mana).
  66.     matches = re.findall(r"<td[^>]*?>([^<]*?)</td>", str(table))
  67.     indexes = {
  68.         "isp": 7,
  69.         "host": 10,
  70.     }
  71.     details = {}
  72.     for key, idx in indexes.items():
  73.         details[key] = matches[idx]
  74.     return details
  75.  
  76.  
  77. # Functia principala care face mai multe lucruri.
  78. def main():
  79.     # 1. Scoatem si afisam IP-ul curent.
  80.     ip = get_myip()
  81.     print("IP: {}".format(ip))
  82.  
  83.     # 2. Bagam acel IP intr-un serviciu de identificare si le afisam ordonat.
  84.     details = get_ip_details(ip)
  85.     print(json.dumps(details, indent=4))
  86.  
  87.  
  88. if __name__ == "__main__":
  89.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement