Jump to content
B7ackAnge7z

[RST] Dezvoltăm o interfață API pentru a obține informații despre IP-ul utilizatorulu

Recommended Posts

Posted

În acest tutorial voi descrie pa?ii necesari pentru a crea o interfa?? API, ce va oferi informa?ii despre IP-ul, ?ara, regiunea, ora?ul ?i coordonatele (?ti?i voi: adresa, blocul, etajul, apartamentul) utilizatorului. De asemenea, v-a fi verificat dac? acesta folose?te un proxy sau dac? IP-ul lui nu este un proxy public. ?i pentru ca lista s? fie complet?, se vor ob?ine ?i informa?iile despre versiunea browser-ului, limba setat? ?i referer-ul acestuia.

Pentru cei ner?bd?tori, vreau s? men?ionez c? la final rezultatul returnat de interfa?a API va ar?ta în felul urm?tor, iar un exemplu de aplica?ie ce folose?te acest API poate fi g?sit aici: My IP

Vreau s? men?ionez c? interfa?a va fi dezvoltat? cu ajutorul unei aplica?ii pentru Google App Engine, iar limbajul de programare va fi Python. Dac? nu cunoa?te?i Python, pute?i utiliza Java sau Go (desigur, va trebui s? v? descurca?i singuri).

Pasul 1. Înregistrarea unei noi aplica?ii

Pentru început e nevoie s? înregistr?m o nou? aplica?ie. Acest lucru poate fi f?cut accesând aceast? adres? URL https://appengine.google.com/start/createapp — unde trebuie s? alegem identificatorul unic ?i numele aplica?iei.

EGEUP.png

Pentru op?iunea „Storage Options” bif?m „High Replication” (Master/Slave e considerat? „învechit?” ?i probabil în viitorul apropiat aplica?iile ce utilizeaz? aceast? metod? nu vor mai fi func?ionabile).

Pasul 2. Desc?rcarea ?i instalarea SDK-ului

Dup? ce am înregistrat aplica?ia, desc?rc?m SDK-ul pentru Google App Engine de pe pagina Downloads. Aici alegem SDK-ul pentru limbajul de programare dorit (în cazul meu Python) ?i sistemul de operare (în cazul meu Windows).

Pasul 3. Crearea unei noi aplica?ii

Acum, dup? ce am desc?rcat ?i instalat SDK-ul GAE, cre?m o nou? aplica?ie local?. Pentru aceasta rul?m executabilul Google App Engine Launcher ?i din meniul „File” alegem op?iunea „Create New Application”. În fereastra ce apare, introducem identificatorul ales la pasul 1, loca?ia unde dorim s? salv?m aplica?ia, introducem portul necesar ?i ap?s?m „Create Application”.

bL0Rh.png

Vreau s? men?ionez c? eu am ales portul 8090, astfel pentru exemplele de mai jos voi folosi acest port.

Pasul 4. Testarea aplica?iei

?i acum a venit timpul s? rul?m aplica?ia implicit? pentru a fi siguri c? totul e ok: select?m aplica?ia creat? ?i ap?s?m click pe „Run”. A?tept?m pu?in, ?i dac? a fost indicat calea corect? ?i un port liber — aplica?ia va deveni activ?.

M8Ywg.png

Iar pentru a fi siguri c? totul func?ioneaz? perfect, ap?s?m butonul „Browse” sau acces?m http://localhost:8090/ — dac? browser-ul arat? mesajul „Hello world!” — atunci e ok, ?i putem trece la urm?torul pas.

Pasul 5. Preg?tirea spa?iului de lucru

Deschidem folderul unde am salvat aplica?ia (acest lucru poate fi f?cut ?i cu ajutorul SDK-ului: din meniul „Edit” alegem „Open in Explorer”) ?i ?tergem fi?ierele de care nu mai avem nevoie:

  • favicon.ico
  • main.py
  • main.pyc

Deschidem fi?ierul app.yaml ?i înlocuim con?inutul acestuia cu urm?torul cod:

# Identificatorul aplicatiei (ales la pasul 1)
application: json-api

# Despre chestiile de mai jos (si multe alte lucruri utile) puteti citi accesand URL-ul
# https://developers.google.com/appengine/docs/python/config/appconfig
version: 1
runtime: python27
threadsafe: false
api_version: 1

handlers:
# Indicam ca in folderul /static sunt salvate fisiere statice precum imagini, css, js si altele
- url: /static
static_dir: static

# Daca utilizatorul acceseaza /ip.js atunci executam scriptul ip.py
- url: /ip\.js
script: ip.app

# Pentru celelalte pagini accesate de catre utilizator afisam pagina implicita
- url: /.*
static_files: static/html/index.html
upload: static/html/index.html

Dup? aceasta, cre?m fi?ierul static/html/index.html în care scriem mesajul de întâmpinare (sau folosim sursa paginii de aici http://json-api.appspot.com/). Acces?m http://localhost:8090/ dac? apare mesajul introdus, mergem mai departe. Exact la fel proced?m ?i cu fi?ierul static/html/ip.html (sursa o g?sim aici http://json-api.appspot.com/static/html/ip.html) care va fi folosit pentru a afi?area informa?iei ob?inute de la interfa?a API.

Dat fiind faptul c? cu ajutorul Google App Engine putem ob?ine doar ini?ialele ??rii, cre?m un fi?ier static/js/iso3166_codes.js folosind datele de aici http://json-api.appspot.com/static/js/iso3166_codes.js care vor fi folosite la ob?inerea numelui ??rii. De asemenea, cre?m ?i fi?ierul static/js/ip.js (sursa http://json-api.appspot.com/static/js/ip.js) care va avea rolul de a primi ?i afi?a datele returnate de interfa?a API.

Pasul 5. Crearea interfe?ei API

Cre?m fi?ierul ip.py în care copiem urm?torul cod:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Includem bibliotecile necesare
import webapp2, json, urllib2, re

class InitApp(webapp2.RequestHandler):
def get(self):
req = self.request

# Lista variabililor pe care o va returna interfata API
info = {
'ip' : req.remote_addr,
'country' : req.headers.get('X-AppEngine-Country'),
'region' : req.headers.get('X-AppEngine-Region'),
'city' : req.headers.get('X-AppEngine-City'),
'coordinates' : req.headers.get('X-AppEngine-CityLatLong'),
'browser' : req.headers.get('User-Agent'),
'lang' : self.getLang(),
'referer' : req.referer,
'isproxy' : self.isProxy(),
}

# Verificam daca utilizatorul nu foloseste un proxy "transparent"
if req.headers.get('X-Forwarded-For'):
info['realip'] = req.headers.get('X-Forwarded-For').split(',')[0]

# Obtinem reprezentarea JSON pentru variabilele necesare
result = json.dumps(info)

# Verificam daca utilizatorul a specificat o functie callback. Exemplu:
# Request : http://json-api.appspot.com/ip.js?varname=data
# Rezultat : callback({...});
if req.get('callback'):
result = '{0}({1});'.format(self.getVar('callback'), result)

# Verificam daca utilizatorul a specificat o variabila. Exemplu:
# Request : http://json-api.appspot.com/ip.js?varname=data
# Rezultat : var data = {...};
elif req.get('varname'):
result = 'var {0} = {1};'.format(self.getVar('varname'), result)

# Afisam rezultatul ca fiind plain-text
self.response.headers['Content-Type'] = 'text/javascript; charset=utf-8'
self.response.out.write(result)


# Eliminam caracterele nevalide din numele functiei callback si numele variabilei
def getVar(self, var):
return self.filter(self.request.get(var))


# Obtinem initialele pentru limba folosita
def getLang(self):
lang = self.request.headers.get('Accept-Language')
return self.filter(lang.split(',')[0])


# Eliminam caracterele non-alfanumerice
def filter(self, str):
return re.sub('[^a-z_\.0-9]', '', str, flags=re.IGNORECASE)


# Verificam utilizatorul foloseste un proxy public
def isProxy(self):
# Intrebam pe domnul Google folosind sintaxa inurl:proxy 127.0.0.1
# daca IP-ul nu este un proxy public
q = urllib2.quote('inurl:proxy ' + self.request.remote_addr)
url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=' + q

# Folosim contructia try pentru a ne feri de erorile imprevizibile
try:
# Obtinem un sir JSON returnat de catre serverul Google
str = urllib2.urlopen(url).read()

# Convertim intr-o variabila datele JSON
data = json.loads(str)

# Verificam daca au fost gasite mai mult de 5 rezulate
return (data['responseData']['cursor']['resultCount'] > 5)
except:
pass

# Deja nu mai are importanta - au fost ceva erori sau Google nu a gasit nimic -
# consideram ca IP-ul nu este un proxy
return False

app = webapp2.WSGIApplication([('/ip.js', InitApp)], debug=True)

Pasul 6. Înc?rcarea aplica?iei pe server

Dup? ce am salvat toate fi?ierele ?i am testat aplica?ia accesând URL-ul http://localhost:8090/static/html/ip.html putem înc?rca toate fi?ierele pe serverul appspot cu un simplu click pe butonul „Deploy”. În fereastra ce apare, introducem adresa de email ?i parola pentru contul Google. Dup? înc?rcarea fi?ierelor, putem accesa aplica?ia noastr? folosind adresa http://json-api.appspot.com/ (în loc de json-api folosi?i identificatorul ales la pasul 1).

Pasul 7. Final

Pentru cei un pic mai leno?i, sursa aplica?iei poate fi desc?rcat? accesând adresa URL http://json-api.appspot.com/static/zip/json-api.zip

Enjoy!

  • Upvote 2
Posted (edited)

Frumos doar ca la "coordinates" arata mijlocul orasului meu si nu mai precis .

//@B7ackAnge7z "?i coordonatele (?ti?i voi: adresa, blocul, etajul, apartamentul) utilizatorului."

Edited by sandabot
Posted (edited)
Frumos doar ca la "coordinates" arata mijlocul orasului meu si nu mai precis .

P?i cine a spus c? arat? coordonatele tale? :)

Dac? sincer acum, aplica?ia afi?eaz? datele ISP-ului, ?i nu ale utilizatorului. Dac? ai internet mobil, po?i fi în alt ora?, ?i corespunz?tor, aplica?ia va afi?a date eronate.

ps. Scuze, nu observasem update-ul t?u — citatul acela nu a fost decât o glum? pe seama celor de la Google, c?ci prima dat? când am v?zut c? afi?eaz? coordonatele am crezut (?i nu doar eu) c? merge vorba de coordonatele utilizatorului.

Edited by B7ackAnge7z
Posted

Este foarte ok ideea... Desi am urmarit cu atentie fiecare pas de mai sus,am o oarecare problema... Cand accesez pagina asta nu imi arata ip-ul ci numai : 2a02:2f0d:a07f:ffff::567c:d17f ... Daca folosesc TOR imi arata ip normal. Deci nu inteleg treaba asta... In rest totul e ok...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...