B7ackAnge7z Posted January 15, 2013 Report Posted January 15, 2013 Î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?iiPentru î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.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-uluiDup? 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?iiAcum, 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”.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?.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 lucruDeschidem 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.icomain.pymain.pycDeschidem 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/appconfigversion: 1runtime: python27threadsafe: falseapi_version: 1handlers:# 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.htmlDup? 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 APICre?m fi?ierul ip.py în care copiem urm?torul cod:#!/usr/bin/env python# -*- coding: utf-8 -*-# Includem bibliotecile necesareimport webapp2, json, urllib2, reclass 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 Falseapp = webapp2.WSGIApplication([('/ip.js', InitApp)], debug=True)Pasul 6. Înc?rcarea aplica?iei pe serverDup? 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. FinalPentru 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.zipEnjoy! 2 Quote
sandabot Posted January 15, 2013 Report Posted January 15, 2013 (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 January 15, 2013 by sandabot Quote
B7ackAnge7z Posted January 15, 2013 Author Report Posted January 15, 2013 (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 January 15, 2013 by B7ackAnge7z Quote
MDGFULL Posted February 1, 2013 Report Posted February 1, 2013 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... Quote
M2G Posted February 1, 2013 Report Posted February 1, 2013 Iti arata asa pentru ca ai IPv6. Ala e formatul pentru IPV6IPV4 este exprimat pe 32 biti.IPV6 este exprimat pe 128 biti. De aici lungimea mai mare. Quote