|
0×00 Taust
Millised on need punased ümbrikud? Tema venna poeg Huer ütles: "Raha on peaaegu võrreldav. Vend ja tütar Dao Yun ütlesid: "See pole tuule tõttu nii hea kui mu tädil." "Kõik mõistavad tausta, on uus aasta ja see on päev, mil punased ümbrikud lendavad üle taeva. Juhtus nii, et ma õppisin Pythonit kaks päeva tagasi ja olin rohkem elevil, nii et uurisin ja uurisin Weibo punaste ümbrikute roomamist, miks Weibo punased ümbrikud Alipay punaste ümbrikute asemel, sest ma mõistan ainult veebi, ja kui mul on energiat, võin tulevikus uurida ka whack-a-mole'i algoritmi. Kuna olen Pythonis algaja, on see programm ka kolmas programm, mille kirjutasin pärast Python'i õppimist, nii et palun ärge torkige isiklikult, kui koodis on auk, fookus on ideel, noh, kui idees on mingit aukku, siis palun ärge uurige seda isiklikult, IE-l on võimalus end vaikimisi brauseriks seada, ma kirjutan ka rämpsuartikli, mis sobib samuti...... Kasutan Python 2.7 versiooni ja öeldakse, et Python 2 ja Python 3 vahel on suur.
0×01 ideed Ma olin liiga laisk, et seda sõnadesse panna, nii et joonistasin visandi ja kõik peaksid sellest aru saama.
Esiteks, vana reegel: esmalt tutvusta raamatukogu, mille jaoks sa ei tea, et see on kasulik, kuid ilma selleta ei saa: [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] Seejärel deklareeri mõned teised muutujad, mida hiljem kasutama pead:
[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Siin kasutatakse rsa teeki, mis vaikimisi Pythonis ei ole. Pean selle paigaldama :https://pypi.python.org/pypi/rsa/
Pärast allalaadimist käivita setpy.py installi ning siis saame alustada arendustappidega.
0×02 Weibo sisselogimine Punaste ümbrike haaramine tuleb teha pärast sisselogimist, seega peab olema sisselogimisfunktsioon, sisselogimine ei ole võti, võti on küpsiste säilitamine, siin on vajalik cookielibi koostöö. [mw_shl_code=java,true]cj = cookielib. CookieJar()avaja = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(avaja)[/mw_shl_code] Nii haldavad kõik võrgutoimingud avajaga küpsiste olekut, kuigi ma ei tea sellest palju, aga see tundub imeline. Järgmisena peame kapseldama kaks moodulit: üks on andmete kogumise moodul, mida kasutatakse lihtsalt andmete SAAMISEKS, ja teine andmete postitamiseks. [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') tagastab teksti peale Erandi, 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) tulemus = opener.open(req) text = result.read() tagastab teksti välja arvatud Exception, e: print u'Request exception, url: '+url[/mw_shl_code] Nende kahe mooduliga saame andmeid SAADA ja POSTITADA, millest üks põhjus, miks getData dekodeeritakse ja siis kodeeritakse, on see, et Win7 puhul segasin silumisel väljundit, seega lisasin ka kodeerimisprotsessi, need pole oluline, allpool olev sisselogimisfunktsioon on Weibo sisselogimise tuum. [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)) header = {'User-Agent' : 'Mozilla/5.0 (ühilduv; 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"--------- Sisselogimine õnnestus! ------- "print" ----------......---------- "except Exception, e: print u" --------- sisselogimine ebaõnnestus! -------" print "----------......----------" exit(0)[/mw_shl_code]Selle parameetrid ja krüpteerimisalgoritmid on kopeeritud internetist, ma ei saa sellest hästi aru, ilmselt tuleb esmalt taotleda ajatemplit ja avalikku võtit, siis RSA krüpteerida ja lõpuks töödelda protsess ning esitada see Sina sisselogimisliidesesse, pärast edukat sisselogimist Sinast tagastatakse Weibo aadress, pead selle taotlema, et sisselogimise staatus saaks täielikult kehtida, Pärast edukat sisselogimist kannavad järgnevad päringud praeguse kasutaja küpsise.
0×03 Määratud punase ümbriku joonistus Pärast edukat sisselogimist Weibosse ei jõua ära oodata, et leida punane ümbrik, et seda esmalt brauseris proovida. Lõpuks leidsin lehe, millel oli punane ümbriku nupp, F12 kutsus siluri, et näha, mida andmepakett soovib.
Näed, et päringu aadress on http://huodong.weibo.com/aj_hongbao/getlucky, on kaks peamist parameetrit: üks on ouid, ehk punane ümbriku id, mis on näha URL-is, teine jagamisparameeter määrab, kas seda Weibole jagada, ja on _t, milleks see on. Teoreetiliselt saad punaste ümbriste väljavõtmise lõpetada, saates sellele URL-ile kolm parameetrit, kuid kui parameetrid tegelikult esitad, siis server tagastab sulle imekombel sellise stringi: [mw_shl_code=java, tõeline] {"code":303403,"msg":"Vabandust, sul pole luba sellele lehele ligi pääseda","data":[]}[/mw_shl_code] Ära praegu paanitse, minu paljude aastate veebiarenduse kogemuse põhjal peaks teise osapoole programmeerija hindama viitajat, väga lihtne, kopeeri kõik varasema päringu päised. [mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- draw punane ümbrik aadressilt:"+str(id)+"---" print "----------......----------" if checkValue(id)==False: #不符合条件, see on funktsioon hiljem tagastatud 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, nagu Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(luckyUrl,param, header)[/mw_shl_code] Selles olukorras pole teoorias probleemi, kuid tegelikult probleemi pole. Pärast loteriitegevuse lõpetamist peame hindama staatust ja tagastatud resolutsioon on json-string, kus kood on 100000 on edukas, ja kui see on 90114, on see tänase loterii ülemine piir ning ka teised väärtused on ebaõnnestunud, seega: [mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- on jõudnud ülemise piirini---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='100000':#成功 print u"---------Soovides sulle edu---------" print "----------......----------" log('success',str(id)+'---'+res) exit(0) if hbRes["data"] ja 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], kus logi on samuti funktsioon, mida kohandan ja mida kasutatakse logide salvestamiseks: [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]
|