|
0×00 Ozadje
Kakšne so rdeče kuverte? Bratov sin Huer je dejal: "Denar je skoraj primerljiv. Brat in hči Dao Yun sta rekla: "Ni tako dobro kot moja teta zaradi vetra." "Vsi razumejo ozadje, novo leto je in dan, ko rdeče kuverte letijo po nebu. Ravno zgodilo se je, da sem se pred dvema dnevoma naučil Python in bil bolj navdušen, zato sem preučeval in preučeval plazenje po rdečih kuvertah Weibo, zakaj rdeče kuverte Weibo namesto rdečih Alipay, ker razumem samo splet, in če bom imel energijo, bom morda v prihodnosti študiral tudi algoritem 'udari krtko'. Ker sem začetnik v Pythonu, je ta program tudi tretji program, ki sem ga napisal po učenju Pythona, zato prosim, ne sprašujte se osebno, če je v kodi kakšna praznina, poudarek je na ideji, no, če je v ideji kakšna pomanjkljivost, prosim, ne izzivajte je osebno, vidite, IE ima obraz, da se sam postavi kot privzeti brskalnik, tudi če napišem 'scum article', je sprejemljivo...... Uporabljam Python 2.7 in pravijo, da je velika razlika med Pythonom 2 in Pythonom 3.
0×01 Ideje Bil sem prelen, da bi to opisal z besedami, zato sem narisal skico, in vsi bi jo morali razumeti.
Najprej, staro pravilo, najprej uvedi knjižnico, za katero ne veš, da je uporabna, a je ne moreš brez nje: [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] Nato deklarirajte še nekaj drugih spremenljivk, ki jih boste morali uporabiti kasneje:
[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Tukaj se uporablja rsa knjižnica, ki pa privzeto ni vključena v Python. Moram jo namestiti :https://pypi.python.org/pypi/rsa/
Po prenosu zaženimo setpy.py namestimo in nato začnemo razvojne korake.
0×02 Weibo prijava Dejanje prijema rdečih kuvert mora biti izvedeno po prijavi, zato mora obstajati funkcija prijave, prijava ni ključ, ključ je ohranjanje piškotkov, tukaj je potrebna sodelovanje cookielib. [mw_shl_code=java,true]cj = cookielib. CookieJar()opener = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(opener)[/mw_shl_code] Na ta način bodo vse omrežne operacije z openerjem upravljale stanje piškotkov, čeprav o tem ne vem veliko, a občutek je neverjeten. Nato moramo zapakirati dva modula, eden je modul za zajem podatkov, ki se uporablja zgolj za PRIDOBIVANJE podatkov, drugi pa za POSTANJE podatkov. [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') vrni besedilo razen Exception, 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() vrni besedilo razen Exception, e: print u'Request exception, url: '+url[/mw_shl_code] S tema dvema moduloma lahko GET in POST podatke, med katerimi je razlog, zakaj getData dekodira in nato kodira, ta, da sem pod Win7 vedno pomešal izhod med razhroščevanjem, zato sem dodal nekaj kodiranja, a to ni bistvo, funkcija prijave spodaj je jedro Weibo prijave. [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) key = rsa. PublicKey(rsaPublickey,65537) message = str(servertime) +'\t' + str(nonce) + '\n' + str(pwd) sp = binascii.b2a_hex(rsa.encrypt(message,key)) glava = {'User-Agent' : 'Mozilla/5.0 (združljivo; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)'} param = { 'entry': 'weibo', 'gateway': '1', 'from': ''savestate': '7', 'userticket': '1', 'ssosimple login': '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"--------- Prijava uspešna! ------- "print" ----------......---------- "razen Exception, e: print u" --------- prijava ni uspela! -------" print "----------......----------" exit(0)[/mw_shl_code] Parametri in algoritmi šifriranja v tem so kopirani z interneta, ne razumem dobro, verjetno je treba najprej zahtevati časovni žig in javni ključ, nato RSA šifriranje in na koncu obdelati obdelavo in to poslati v Sina prijavni vmesnik, po uspešni prijavi iz Sina bo vrnil Weibo naslov, ki ga morate zahtevati, da se status prijave popolnoma uveljavi. Po uspešni prijavi bodo nadaljnje zahteve vsebovale piškotek trenutnega uporabnika.
0×03 Označena rdeča ovojnica Po uspešni prijavi na Weibo komaj čakam, da najdem rdečo kuverto, da jo najprej preizkusim, seveda najprej v brskalniku. Končno sem našel stran z rdečim gumbom za ovojnico, F12 je priklical razhroščevalnik, da bi videl, kaj podatkovni paket zahteva.
Lahko vidite, da je naslov zahteve http://huodong.weibo.com/aj_hongbao/getlucky, obstajata dva glavna parametra, eden je ouid, torej rdeči ID ovojnice, ki je viden v URL-ju, drugi parameter share določa, ali ga deliti z Weibo, in obstaja _t, za katerega ne vem, za kaj je. V redu, teoretično lahko zaključite izvleček rdečih kuvert tako, da na ta URL pošljete tri parametre, vendar ko dejansko oddate parametre, boste ugotovili, da vam strežnik čudežno vrne tak niz: [mw_shl_code=java, res] {"code":303403,"msg":"Oprostite, nimate dovoljenja za dostop do te strani","data":[]}[/mw_shl_code] Ne paničarite zdaj, glede na moje dolgoletne izkušnje spletnega razvoja bi moral programer druge strani oceniti referer, zelo preprosto, kopirati vse glave pretekle zahteve. [mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- nariši rdečo ovojnico iz:"+str(id)+"---" print "----------......----------" if checkValue(id)==False: #不符合条件, to je funkcija return kasneje luckyUrl="http://huodong.weibo.com/aj_hongbao/getlucky" param={ 'ouid':id, 'share':0, '_t':0 } glava= { '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, kot Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(luckyUrl,param, glava)[/mw_shl_code] V tem primeru teoretično ni problema, v resnici pa ga ni. Ko je loterijska akcija zaključena, moramo oceniti status, in vrnjena res je json niz, kjer je koda 100000 uspešna, in če je 90114, je to zgornja meja današnje loterije, ostale vrednosti pa so prav tako neuspešne, torej: [mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- je dosegel zgornjo mejo---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='1000000':#成功 print u"---------Želimo ti blaginjo---------" print "----------......----------" log('uspeh',str(id)+'---'+res) izhod(0) če hbRes["data"] in hbRes["data"]["title"]: natisni hbRes["data"]["title"] natisni "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"])else: print u"---------Request error---------" print "----------......----------" log('lucky', str(id)+'---'+res)[/mw_shl_code], kjer je log tudi funkcija, ki jo prilagodim in se uporablja za beleženje dnevnikov: [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]
|