|
|
Paskelbta 2015-02-13 22:44:10
|
|
|
|

|
0×00 Pagrindiniai faktai
Kokie yra raudoni vokai? Jo brolio sūnus Hueris sakė: "Pinigai yra beveik palyginami. Brolis ir dukra Dao Yun pasakė: "Tai nėra taip gerai, kaip mano teta dėl vėjo". "Visi supranta foną, tai Naujieji metai ir diena, kai raudoni vokai skraido visame danguje. Taip atsitiko, kad prieš dvi dienas išmokau Python ir buvau labiau susijaudinęs, todėl studijavau ir tyrinėjau "Weibo" raudonų vokų nuskaitymą, kodėl "Weibo" raudoni vokai vietoj "Alipay" raudonų vokų, nes aš suprantu tik žiniatinklį, o jei turėsiu energijos, ateityje taip pat galiu studijuoti "whack-a-mole" algoritmą. Kadangi aš esu pradedantysis Python, ši programa taip pat yra trečioji programa, kurią parašiau po mokymosi Python, todėl prašome ne kišti asmeniškai, jei yra kokia duobė kodas, dėmesys yra idėja, gerai, jei yra kokia nors duobė idėja, prašome ne kišti jį asmeniškai, matote IE turi veidą nustatyti save kaip numatytąją naršyklę, aš rašau šlamšto straipsnis taip pat priimtinas...... Aš naudoju Python 2.7 ir sakoma, kad yra didelis skirtumas tarp Python 2 ir Python 3.
0×01 Idėjos Buvau per daug tingus apibūdinti žodžiais, todėl nupiešiau eskizą, ir visi turėtų sugebėti jį suprasti.
Visų pirma, senoji taisyklė, pirmiausia pristatykite biblioteką, kuri, jūsų manymu, yra naudinga, bet be kurios neapsieisite: [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] Tada deklaruokite keletą kitų kintamųjų, kuriuos turėsite naudoti vėliau:
[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Čia naudojama RSA biblioteka, kuri pagal numatytuosius nustatymus nėra įtraukta į Python. Reikia jį įdiegti :https://pypi.python.org/pypi/rsa/
Atsisiuntę paleiskite setpy.py įdiekite ir galėsime pradėti kūrimo veiksmus.
0×02 Weibo prisijungimas Raudonų vokų griebimo veiksmas turi būti atliekamas prisijungus, todėl turi būti prisijungimo funkcija, prisijungimas nėra raktas, raktas yra slapukų išsaugojimas, čia reikalingas slapukų bendradarbiavimas. [mw_shl_code=java,true]cj = cookielib. CookieJar()opener = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(opener)[/mw_shl_code] Tokiu būdu visos tinklo operacijos, naudojančios atidarytuvą, tvarkys slapukų būseną, nors apie tai daug nežinau, bet tai jaučiasi nuostabiai. Tada turime sukapsuliuoti du modulius: vienas yra duomenų gavimo modulis, kuris naudojamas tiesiog duomenims gauti, o kitas naudojamas duomenims POST. [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') grąžinti tekstą, išskyrus 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() grąžinti tekstą, išskyrus Exception, e: print u'Request exception, url: '+url[/mw_shl_code] Su šiais dviem moduliais galime GAUTI ir POST duomenis, tarp kurių priežastis, kodėl getData dekoduoja ir tada koduoja, yra ta, kad pagal Win7 derindamas visada iškraipydavau išvestį, todėl pridėjau šiek tiek kodavimo apdorojimo, tai nėra esmė, žemiau esanti prisijungimo funkcija yra "Weibo" prisijungimo pagrindas. [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) raktas = rsa. PublicKey(rsaPublickey,65537) message = str(servertime) +'\t' + str(nonce) + '\n' + str(pwd) sp = binascii.b2a_hex(rsa.encrypt(message,key)) header = {'User-Agent' : 'Mozilla/5.0 (suderinamas; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)'} param = { 'entry': 'weibo', 'gateway': '1', 'from': '', 'savestate': '7', 'userticket': '1', 'ssosimplelogin': '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"--------- Prisijungimas sėkmingas! ------- "spausdinti" ----------......---------- "išskyrus išimtį, e: spausdinti u" --------- prisijungti nepavyko! -------" print "----------......----------" exit(0)[/mw_shl_code]Parametrai ir šifravimo algoritmai yra nukopijuoti iš interneto, aš nelabai suprantu, tikriausiai pirmiausia reikia paprašyti laiko žymos ir viešojo rakto, tada rsa šifravimo ir galiausiai apdoroti apdorojimą ir pateikti jį į Sina prisijungimo sąsają, sėkmingai prisijungus iš Sina, jis grąžins Weibo adresą, turite jo paprašyti, kad prisijungimo būsena galėtų visiškai įsigalioti, Sėkmingai prisijungus, vėlesnėse užklausose bus pateiktas dabartinio vartotojo slapukas.
0×03 Pažymėtas raudono voko piešinys Sėkmingai prisijungęs prie "Weibo", nekantrauju rasti raudoną voką, kad pirmiausia išbandyčiau, žinoma, pirmiausia naršyklėje. Galiausiai radau puslapį su raudonu voko mygtuku, F12 iškvietė derintuvą, kad pamatytų, ko prašo duomenų paketas.
Matote, kad užklausos adresas yra http://huodong.weibo.com/aj_hongbao/getlucky, yra du pagrindiniai parametrai, vienas yra ouid, tai yra raudonas voko ID, kurį galima pamatyti URL, kitas bendrinimo parametras nustato, ar juo dalytis su Weibo, ir yra _t nežinau, kam jis skirtas. Gerai, dabar teoriškai galite užbaigti raudonų vokų ištraukimą pateikdami tris parametrus į šį URL, tačiau kai iš tikrųjų pateiksite parametrus, pamatysite, kad serveris stebuklingai grąžins jums tokią eilutę: [mw_shl_code=java,true] {"code":303403,"msg":"Atsiprašome, jūs neturite leidimo prieiti prie šio puslapio","data":[]}[/mw_shl_code] Šiuo metu nepanikuokite, pagal mano ilgametę žiniatinklio kūrimo patirtį, kitos šalies programuotojas turėtų spręsti apie nuorodą, labai paprasta, nukopijuokite visas ankstesnės užklausos antraštes. [mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- nupiešti raudoną voką iš:"+str(id)+"---" print "----------......----------" if checkValue(id)==False: #不符合条件, tai funkcija grįžti vėliau luckyUrl="http://huodong.weibo.com/aj_hongbao/getlucky" param={ 'ouid':id, 'share':0, '_t':0 } header= { '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, kaip Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(luckyUrl,param, antraštė)[/mw_shl_code] Šiuo atveju teoriškai problemos nėra, bet iš tikrųjų problemos nėra. Baigę loterijos veiksmą, turime įvertinti būseną, o grąžinta rezoliucija yra json eilutė, kur kodas yra 100000 yra sėkmingas, o jei jis yra 90114, tai yra viršutinė šiandienos loterijos riba, o kitos reikšmės taip pat nepavyksta, taigi: [mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- pasiekė viršutinę ribą---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='100000':#成功 print u"---------Linkiu jums klestėjimo---------" print "----------......----------" log('success',str(id)+'---'+res) exit(0) if hbRes["data"] and 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], kur log taip pat yra funkcija, kurią tinkinu, kuri naudojama žurnalams įrašyti: [mw_shl_code=java,true]def log(tipas,tekstas): fp = open(tipas+'.txt','a') fp.write(tekstas) fp.write('\r\n') fp.close()[/mw_shl_code]
|
Ankstesnis:Pastabos dėl PHP įkėlimo maksimalių limitųKitą:memcache dll plėtinio atsisiuntimas, skirtas PHP5.2, 5.3, 5.4, 5.5
|