Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 13448|Răspunde: 5

Cum să obții plicuri roșii științific: La sfârșitul anului, poți deveni bogat și poți scrie un program pentru a obține plicuri roșii

[Copiază linkul]
Postat pe 13.02.2015 22:44:10 | | | |
0×00 Context

Cum sunt plicurile roșii? Fiul fratelui său, Huer, a spus: "Banii sunt aproape comparabili. Fratele și fiica Dao Yun au spus: "Nu e la fel de bun ca mătușa mea din cauza vântului." "Toată lumea înțelege fundalul, e Anul Nou și e ziua când plicurile roșii zboară peste tot pe cer. S-a întâmplat să învăț Python acum două zile și am fost mai entuziasmat, așa că am studiat și studiat crawling în plicurile roșii Weibo, de ce plicurile roșii Weibo în loc de plicurile roșii Alipay, pentru că înțeleg doar Web-ul, iar dacă am energie, poate voi studia și algoritmul whack-a-mole în viitor.
Pentru că sunt începător în Python, acest program este și al treilea pe care l-am scris după ce am învățat Python, așa că vă rog să nu vă băgați personal dacă există vreo groapă în cod, accentul este pe idee, ei bine, dacă există vreo groapă în idee, vă rog să nu o puneți în persoană, vedeți IE are fața să se seteze ca browser implicit, scrierea unui articol slab este de asemenea acceptabil......
Eu folosesc Python 2.7 și se spune că există o diferență mare între Python 2 și Python 3.
0×01 Idei
Am fost prea leneș să o descriu în cuvinte, așa că am desenat o schiță, iar toată lumea ar trebui să o poată înțelege.
În primul rând, vechea regulă: introdu mai întâi o bibliotecă pentru care nu știi că este utilă, dar nu te poți lipsi de ea:
[mw_shl_code=java,true]import re import urllib import urllib2 import cookielib import base64 import binascii import OS import json import sys import cPickle as p import rsa[/mw_shl_code] Apoi declară și alte variabile pe care va trebui să le folosești mai târziu:

[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Aici se folosește o bibliotecă rsa, care nu este inclusă implicit în Python. Trebuie să-l instalez :https://pypi.python.org/pypi/rsa/

După ce îl descarcăm, rulăm setpy.py instalarea și apoi putem începe pașii de dezvoltare.
0×02 Autentificare Weibo
Acțiunea de a lua plicurile roșii trebuie realizată după autentificare, deci trebuie să existe o funcție de autentificare, autentificarea nu este cheia, cheia este păstrarea cookie-urilor, aici este necesară cooperarea cookielib.
[mw_shl_code=java,true]cj = cookielib. CookieJar()opener = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(opener)[/mw_shl_code] Astfel, toate operațiunile de rețea care folosesc opener-ul vor gestiona starea cookie-urilor, deși nu știu prea multe despre asta, dar se simte uimitor.
Apoi, trebuie să încapsulăm două module, unul este modulul de achiziție a datelor, care este folosit pur și simplu pentru a obține date, iar celălalt este folosit pentru a POST date.
[mw_shl_code=java,true]def getData(url) : try: req = urllib2. Request(url) result = opener.open(req) text = result.read() text=text.decode("utf-8").encode("gbk",'ignore') returnează text cu excepția excepției, e:                print u' request exception, url: '+url print e def postData(url,data,header) : try: data = urllib.urlencode(data) req = urllib2. Request(url,data,header) result = opener.open(req) text = result.read() returnează text cu excepția Exception, e: print u'Request exception, url: '+url[/mw_shl_code] Cu aceste două module, putem GET și POST date, printre care motivul pentru care getData decodează și apoi encodează este că în Win7 am distorsionat mereu ieșirea la depanare, așa că am adăugat niște procesări de codificare, acestea nu sunt scopul, funcția de autentificare de mai jos este nucleul login-ului pe Weibo.
[mw_shl_code=java,true]def login(nick, pwd): print u"----------login----------" print "----------......----------" prelogin_url= 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.15)&_= 1400822309846' % nick preLogin = getData(prelogin_url) servertime = re.findall('"servertime":(.+?),' , preLogin)[0] pubkey = re.findall('"pubkey":"(.+?)",' , preLogin)[0] rsakv = re.findall('"rsakv":"(.+?)",' , preLogin)[0] nonce = re.findall('"nonce":"(.+?)",' , preLogin)[0] #print bytearray('xxxx','utf-8') su = base64.b64encode(urllib.quote(nick))        rsaPublickey= int(pubkey,16) cheie = rsa. PublicKey(rsaPublickey,65537) mesaj = str(servertime) +'\t' + str(nonce) + '\n' + str(pwd) sp = binascii.b2a_hex(rsa.encrypt(message,key)) antet = {'User-Agent' : 'Mozilla/5.0 (compatibil; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)'} param = { 'intrare': 'weibo', 'gateway': '1', 'from': '', 'savestate': '7', 'userticket': '1',                'ssosimpleloging': '1', 'vsnf': '1', 'vsnval': '', 'su': su, 'service': 'miniblog', 'servertime': servertime, 'nonce': nonce, 'pwencode': 'rsa2', 'sp': sp, 'encoding': 'UTF-8', 'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack', 'returntype': 'META', 'rsakv' : rsakv, } s = postData('http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)',param,header) try: urll = re.findall("locatio remove n.replace\(\'(.+?) \'\); " , s)[0] login=getData(urll) print u"--------- Autentificare reușită! ------- "print" ----------......---------- "except Exception, e: print u" --------- logarea a eșuat! -------" print "----------......----------" exit(0)[/mw_shl_code]Parametrii și algoritmii de criptare din acest sistem sunt copiați de pe Internet, nu înțeleg prea bine, probabil este să ceri mai întâi un timestamp și o cheie publică, apoi criptarea RSA și în final procesarea procesării și trimiterea către interfața de autentificare Sina, după ce te-ai autentificat cu succes din Sina, va returna o adresă Weibo, trebuie să o soliciti, astfel încât starea de autentificare să poată avea efect complet, După autentificarea reușită, cererile ulterioare vor purta cookie-ul utilizatorului actual.
0×03 Desenul desemnat pentru plic roșu
După ce m-am logat cu succes pe Weibo, abia aștept să găsesc un plic roșu pentru a încerca mai întâi, desigur, mai întâi în browser. În cele din urmă, am găsit o pagină cu un buton roșu de plic, F12 a chemat depanorul să vadă ce solicită pachetul de date.

Poți vedea că adresa cererii este http://huodong.weibo.com/aj_hongbao/getlucky, există doi parametri principali: unul este ouid, adică ID-ul plicului roșu, care poate fi văzut în URL, celălalt parametru de partajare determină dacă să fie partajat pe Weibo, și există un _t nu știu la ce folosește.
Bine, teoretic poți finaliza extragerea plicurilor roșii trimițând trei parametri către acest URL, dar când trimiți efectiv parametrii, vei observa că serverul îți va returna magic un astfel de șir:
[mw_shl_code=java,true] {"code":303403,"msg":"Ne pare rău, nu aveți permisiunea de a accesa această pagină","data":[]}[/mw_shl_code] Nu intrați în panică acum, conform multor ani de experiență în dezvoltare web, programatorul celeilalte părți ar trebui să judece referința, foarte simplu, să copieze toate anteturile cererii anterioare.
[mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- desenează plicul roșu din:"+str(id)+"---" print "----------......----------" if checkValue(id)==False: #不符合条件, aceasta este funcția return mai târziu        luckyUrl="http://huodong.weibo.com/aj_hongbao/getlucky" param={ 'ouid':id, 'share':0, '_t':0 } antet= {                'Cache-Control':'no-cache', 'Content-Type':'application/x-www-form-urlencoded', 'Origin':'http://huodong.weibo.com', 'Pragma':'no-cache', 'Referer': 'http://huodong.weibo.com/hongbao/'+str(id), 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, ca Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(luckyUrl,param, antet)[/mw_shl_code] În acest caz, nu există o problemă teoretică, dar de fapt nu există nicio problemă. După ce acțiunea loteriei este finalizată, trebuie să judecăm statusul, iar res-ul returnat este un șir json, unde codul este 100000 este reușit, iar dacă este 90114, este limita superioară a loteriei actuale, iar celelalte valori sunt de asemenea eșuate, deci:
[mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- a atins limita superioară---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='100000':#成功 print u"---------Îți doresc prosperitate---------" print "----------......----------"        log('success',str(id)+'---'+res) exit(0) dacă hbRes["data"] și hbRes["data"]["title"]: print hbRes["data"]["title"] print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"])else: print u"---------Request error---------" print "----------......----------" log('lucky', str(id)+'---'+res)[/mw_shl_code], unde log este și o funcție pe care o personalizez, folosită pentru a înregistra logs:
[mw_shl_code=java,true]def log(type,text): fp = open(type+'.txt','a') fp.write(text) fp.write('\r\n') fp.close()[/mw_shl_code]





Precedent:Note privind limitele maxime de încărcare în PHP
Următor:descărcare extensii memcache dll pentru PHP5.2, 5.3, 5.4, 5.5
 Proprietarul| Postat pe 13.02.2015 22:46:37 |
0×04 Căutați lista plicurilor roșii
După testarea cu succes a unei singure acțiuni de colectare a plicurilor roșii, aceasta este modulul de bază al programului nostru – căutarea listei plicurilor roșii, ar trebui să existe multe metode și intrări pentru a scana lista plicurilor roșii, cum ar fi diverse cuvinte cheie de căutare Weibo și așa mai departe, dar eu folosesc cea mai simplă metodă aici: scanarea listei roșii de plicuri.
Pe pagina principală (http://huodong.weibo.com/hongbao activității plicului roșu, prin diverse puncte mai mult, toate pot fi observate, deși lista este mult conectată, poate fi rezumată în două categorii (cu excepția celei mai bogate liste cu plicuri roșii): tema și clasamentul.
Continuând să invoci F12, analizează formatul ambelor pagini, începând cu o listă de forme tematice, cum ar fi: http://huodong.weibo.com/hongbao/special_quyu
Puteți vedea că informațiile din plicul roșu se află într-un div numit info_wrap, așa că trebuie doar să activăm codul sursă al acestei pagini, apoi să luăm toate infowrap-urile și să le procesăm pur și simplu pentru a obține lista de plicuri roșii a acestei pagini, aici trebuie să folosim niște plicuri regulate:
[mw_shl_code=java,true]def getThemeList(url,p):#主题红包 print u"--------- "+str(p)+"page---------" print "----------......----------" html=getData(url+'?p='+str(p)) pWrap= re.compile(r'<div class="info_wrap">(.+?) <span class="rob_txt"></span>',re. DOTALL) #h Get info_wrap clasa regulată pInfo=re.compile(r'.+<em class="num">(.+)</em>.+<em class="num">(.+)</em>.+<em class="num">(.+).</em>.+href="(.+)" class="btn"',re. DOTALL) #获取红包信息 List=pWrap.findall(html,re. DOTALL) n=len(List) dacă n==0: returnează pentru i în interval(n): #traverse toate info_wrap div s=pInfo.match(List) #取得红包信息 info=listă(s.grupuri(0))                info[0]=float(info[0].replace('\xcd\xf2','0000')) #现金,zece->0000 încearcă: info[1]=float(info[1].replace('\xcd\xf2','0000')) #礼品价值 cu excepția excepției, e:                        info[1]=float(info[1].replace('\xd2\xda','0000000')) #礼品价值 info[2]=float(info[2].replace('\xcd\xf2','0000')) #已发送 if info[2]==0: info[2]=1 #防止除数为0 dacă info[1]==0: info[1]=1 #防止除数为0 info.append(info[0]/(info[2]+info[1])) #红包价值, bani/(număr de revendicați + valoarea premiului) # dacă info[0]/(info[2]+info[1])>100:                # print url luckyList.append(info) dacă 'class="page"' în html:#存在下一页 p=p+1 getThemeList(url,p) #递归调用自己爬取下一页[/mw_shl_code]Este atât de greu de spus că este atât de dificil și a durat mult să scriu aceste două propoziții. Există și o informație în anexa de aici [4], care este algoritmul meu pentru a judeca aproximativ valoarea plicurilor roșii, de ce să faci asta, pentru că există multe plicuri roșii, dar putem extrage doar de patru ori, în marea vastă de pungi, trebuie să găsim cele mai valoroase plicuri roșii și apoi să le extragem, iată trei date pentru referință: valoarea în numerar, valoarea cadoului și numărul de destinatari, evident dacă banii sunt mici și numărul de persoane care primesc mulți ori valoarea premiului este foarte mare (unele sunt chiar nebunești, în unități de sute de milioane), Atunci nu merită să-l iau, așa că am stat mult timp și în cele din urmă am venit cu un algoritm pentru a măsura greutatea plicurilor roșii: valoarea plicului roșu = bani / (numărul de câștigători + valoarea premiului).
Principiul paginii de clasament este același: găsește etichetele tastelor și potrivește-le regulat.
[mw_shl_code=java,true]def getTopList(url,daily,p):#排行榜红包 print u"--------- "+str(p)+"page---------" print "----------......----------" html=getData(url+'?daily='+str(daily)+'& p='+str(p)) pWrap=re.compile(r'<div class="list_info">(.+?) <span class="list_btn"></span>',re. DOTALL) #h Get list_info clasa obișnuită pInfo=re.compile(r'.+<em class="num">(.+)</em>.+<em class="num">(.+)</em>.+<em class="num">(.+).</em>.+href="(.+)" class="btn rob_btn"',re. DOTALL) #获取红包信息 List=pWrap.findall(html,re. DOTALL) n=len(List) dacă n==0: returnează pentru i în interval(n): #Iterate prin toate info_wrap div s=pInfo.match(List) #取得红包信息 topinfo=list(s.groups(0))                info=listă(topinfo) info[0]=topinfo[1].replace('\xd4\xaa',') #元->'' info[0]=float(info[0].replace('\xcd\xf2','0000')) #现金,10,>0000 info[1]=topinfo[2]. replace('\xd4\xaa',') #元->'' try: info[1]=float(info[1].replace('\xcd\xf2','0000')) #礼品价值 exceptând Exception, e:                        info[1]=float(info[1].replace('\xd2\xda','0000000')) #礼品价值 info[2]=topinfo[0].replace('\xb8\xf6','') #个->'' info[2]=float(info[2].replace('\xcd\xf2','0000')) #已发送                if info[2]==0: info[2]=1 #防止除数为0 if info[1]==0: info[1]=1 #防止除数为0 info.append(info[0]/(info[2]+info[1])) #红包价值, bani/(numărul de destinatari + valoarea cadouului)                # if info[0]/(info[2]+info[1])>100: # print url luckyList.append(info) dacă 'class="page"' în html:#存在下一页 p=p+1                getTopList(url,daily,p) #递归调用自己爬取下一页[/mw_shl_code]Bine, acum putem căuta cu succes lista celor două pagini speciale, iar următorul pas este să obținem lista listelor, adică colecția tuturor acestor adrese de listă, și apoi să le luăm una câte una:
[mw_shl_code=java,true]def getList(): print u"---------Find target---------" print "----------......----------" themeUrl={ #主题列表 'theme':'http://huodong.weibo.com/hongbao/theme',                 'pinpai':'http://huodong.weibo.com/hongbao/special_pinpai', 'daka':'http://huodong.weibo.com/hongbao/special_daka', 'youxuan':'http://huodong.weibo. com/hongbao/special_youxuan', 'qiye':'http://huodong.weibo.com/hongbao/special_qiye', 'quyu':'http://huodong.weibo.com/hongbao/special_quyu', 'meiti':'http: huodong.weibo.com/hongbao/special_meiti', 'hezuo':'http://huodong.weibo.com/hongbao/special_hezuo' } topUrl={ #排行榜列表 'mostmoney':'http://huodong.weibo. com/hongbao/top_mostmoney', 'mostsend':'http://huodong.weibo.com/hongbao/top_mostsend', 'mostsenddaka':'http://huodong.weibo.com/hongbao/top_mostsenddaka',                'mostsendpartner':'http://huodong.weibo.com/hongbao/top_mostsendpartner', 'cate':'http://huodong.weibo.com/hongbao/cate?type=', 'haine':'http://huodong.weibo.com/ hongbao/cate?type=clothes', 'beauty':'http://huodong.weibo.com/hongbao/cate?type=beauty', 'fast':'http://huodong.weibo.com/hongbao/cate?type=fast', 'life':'http: huodong.weibo.com/hongbao/cate?type=life', 'digital':'http://huodong.weibo.com/hongbao/cate?type=digital', 'other':'http://huodong.weibo.com/hongbao/cate?type=other'                } pentru (theme,url) în themeUrl.items(): print "----------"+theme+"----------" print url print "----------......----------"                getThemeList(url,1) pentru (top,url) în topUrl.items(): print "----------"+top+"----------" print url print "----------......----------"                getTopList(url,0,1) getTopList(url,1,1)[/mw_shl_code]
 Proprietarul| Postat pe 13.02.2015 22:47:13 |
0×05 Judecați disponibilitatea plicurilor roșii
Este relativ simplu: mai întâi caută cuvinte-cheie în codul sursă pentru a vedea dacă există un buton roșu de prindere a plicului, apoi mergi la clasamentul colecției pentru a vedea care este cel mai mare record, dacă cel mai mare primește doar câțiva dolari, la revedere......
Adresa pentru a vizualiza înregistrarea colectării este http://huodong.weibo.com/aj_hongbao/detailmore?page=1&type=2&_t=0&__rnd=1423744829265&uid=Red ID-ul plicului

[mw_shl_code=java,true]def checkValue(id): infoUrl='http://huodong.weibo.com/hongbao/'+str(id) html=getData(infoUrl) dacă 'action-type="lotery"' în html sau True: #存在抢红包按钮                logUrl="http://huodong.weibo.com/aj_hongbao/detailmore?page=1&type=2&_t=0&__rnd=1423744829265&uid="+id #查看排行榜数据 param={} header= { 'Cache-Control': 'no-cache', 'Content-Type':'application/x-www-form-urlencoded', 'Pragma':'no-cache', 'Referer':'http://huodong.weibo.com/hongbao/detail? uid='+str(id), 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, ca Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(logUrl,param,header) pMoney=re.compile(r'<span class="money">(\d+?. +?) \xd4\xaa</span>', re. DOTALL) #h Get all list_info regulars luckyLog=pMoney.findall(html,re. DOTALL) dacă len(luckyLog)==0: maxMoney=0 altfel: maxMoney=float(luckyLog[0]) dacă maxMoney <cel mai mic: #记录中最大红包小于设定值 returnează False else: print u"--------- hand slows---------" print "----------......----------" return false        returnează Adevărat[/mw_shl_code]0×06 Lucrări de finalizare
Modulele principale sunt deja instalate, iar acum toți pașii trebuie conectați în serie:
[mw_shl_code=java,true]def start(username,password,low,fromFile): gl=False lowest=low login(username, password) if fromfile=='y': if os.path.exists('luckyList.txt'):                         try: f = fișier('luckyList.txt') newList = [] newList = p.load(f)                                print u'--------- load list---------' print "----------......----------" cu excepția excepției, e: print u' nu a reușit să analizeze lista locală, căutând pagina online. ' print "----------......----------" gl=True else: print u' nu există local luckyList.txt căutarea paginilor online. ' print "----------......----------" gl=True if gl==True: getList() from operator import itemgetter                newList=sorted(luckyList, key=itemgetter(4),reverse=True) f = fișier('luckyList.txt', 'w') p.dump(newList, f) #把抓到的列表存到文件里, deci nu trebuie să prinzi f.close() pentru lucky data viitoare newList: dacă nu 'http://huodong.weibo.com' în lucky[3]: #不是红包 continue print lucky[3] id=re.findall(r'(\w*[0-9]+)\w*',lucky[3])                getLucky(id[0])[/mw_shl_code] Pentru că este foarte dificil să scanezi în mod repetat lista de envelopuri roșii de fiecare dată când este testată, am adăugat un paragraf pentru a pune lista completă în codul fișierului, astfel încât să poți citi lista locală și să iei plicul roșu pe viitor.
[mw_shl_code=java,true]if __name__ == "__main__": print u"------------------ Weibo Red Envelope Assistant------------------" print "---------------------v0.0.1---------------------" print u"------------- de @***----------------" Tipărește "-------------------------------------------------" încearcă: uname=raw_input(u"Te rugăm să introduci contul tău Weibo: ".decode('utf-8').encode('GBK'))                pwd=raw_input(u"Vă rugăm să introduceți parola Weibo: ".decode('utf-8').encode('gbk')) low=int(raw_input(u"Plic roșu pentru a primi numărul maxim de numerar mai mare decât n: ".decode('utf-8').encode('gbk')))) fromfile=raw_input(u) Dacă să folosești lista de plicuri roșii din luckyList.txt: (y/n) ".decode('utf-8').encode('gbk')) cu excepția excepției, de exemplu: print u" parameter error" print "----------......----------" print e                exit(0) print u"--------- program start---------" print "----------......----------" start(uname,pwd,low, fromfile) print u" --------- program end--------- "print "----------...... ----------" os.system('pauză')[/mw_shl_code]
0×07 Hai să mergem!

Rezumatul 0×07
Scheletul de bază al crawler-ului a fost practic finalizat, de fapt, mai este mult spațiu pentru ca acest crawler să se joace în multe detalii, cum ar fi modificarea pentru a suporta autentificarea în batch, cum ar fi optimizarea algoritmului de valoare a envelopei roșii, codul în sine ar trebui să aibă multe locuri de optimizat, dar cu abilitatea mea, estimez că pot face asta.
La final, toată lumea a văzut rezultatul programului, am scris sute de linii de cod, mii de cuvinte de articole, și tot ce am muncit din greu a fost doar un set de bile bicolore, Nima pit tată, cum ar putea fi o bilă cu două culori!! (Narator: Cu cât autorul vorbea mai mult, cu atât devenea mai entuziasmat, și chiar plângea, iar oamenii din jurul lui îl convingeau: Frate, nu e așa, nu e doar un plic roșu Weibo? Ieri mă dureau mâinile și nu am scos un plic roșu de pe WeChat.) )

Postat pe 14.02.2015 07:14:33 |
Câți bani ai strâns în Loulou?
Postat pe 02.03.2016 13:48:27 |
Pare atât de înalt
Postat pe 07.03.2016 12:51:02 |
Nu știu dacă e ceva serios
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com