|
0×00 Baggrund
Hvordan er de røde kuverter? Hans brors søn, Huer, sagde: "Pengene er næsten sammenlignelige. Broren og datteren Dao Yun sagde: "Det er ikke så godt som min tante på grund af vinden." "Alle forstår baggrunden, det er nytår, og det er dagen, hvor røde kuverter flyver ud over himlen. Det skete tilfældigt, at jeg lærte Python for to dage siden, og jeg var mere begejstret, så jeg studerede og studerede den krybende Weibo-røde kuvert, hvorfor Weibo-røde kuverter i stedet for Alipay-røde kuverter, fordi jeg kun forstår nettet, og hvis jeg har energien, kan jeg også studere whack-a-mole-algoritmen i fremtiden. Fordi jeg er begynder i Python, er dette program også det tredje program, jeg skrev efter at have lært Python, så lad venligst være med at grave personligt, hvis der er et hul i koden, fokus er på idéen, men hvis der er et hul i idéen, så prøv ikke at stikke det personligt, du kan se, IE har mulighed for at sætte sig selv som standardbrowser, jeg skriver en dårlig artikel, det er også acceptabelt...... Jeg bruger Python 2.7, og det siges, at der er stor forskel mellem Python 2 og Python 3.
0×01 Idéer Jeg var for doven til at beskrive det med ord, så jeg tegnede en skitse, og alle burde kunne forstå det.
Først og fremmest den gamle regel: introducer først et bibliotek, som du ikke ved er nyttigt for, men ikke kan undvære: [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] Deklarer derefter nogle andre variable, som du skal bruge senere:
[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Et rsa-bibliotek bruges her, som som standard ikke er inkluderet i Python. Skal installere det :https://pypi.python.org/pypi/rsa/
Efter at have downloadet det, kør setpy.py installation, og så kan vi starte vores udviklingsprocesser.
0×02 Weibo-login Handlingen med at gribe røde kuverter skal udføres efter login, så der skal være en loginfunktion, login er ikke nøglen, nøglen er bevarelse af cookies, her kræves samarbejde med cookielib. [mw_shl_code=Java,True]CJ = cookielib. CookieJar()opener = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(opener)[/mw_shl_code] På denne måde håndterer alle netværksoperationer, der bruger opener, cookies tilstand, selvom jeg ikke ved meget om det, men det føles fantastisk. Dernæst skal vi indkapsle to moduler, det ene er dataindsamlingsmodulet, som bruges til blot at HENTE data, og det andet bruges til at POSTE data. [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",'ignorer') returnerer tekst undtagen Undtagelse, f.eks: 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() returner tekst undtagen Undtagelse, f.eks: print u'Request exception, url: '+url[/mw_shl_code] Med disse to moduler kan vi FÅ og POST-data, hvoraf grunden til, at getData dekoderer og derefter koder, er, at jeg under Win7 altid forvanskede outputtet under fejlfinding, så jeg tilføjede noget kodningsbehandling, men det er ikke pointen, login-funktionen nedenfor er kernen i Weibo-login. [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) besked = str(servertime) +'\t' + str(nonce) + '\n' + str(pwd) sp = binascii.b2a_hex(rsa.encrypt(message,key)) header = {'User-Agent' : 'Mozilla/5.0 (kompatibel; 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"--------- Login lykkedes! ------- "print" ----------......---------- "undtagen undtagelse, f.eks: print u" --------- login mislykkedes! -------" print "----------......----------" exit(0)[/mw_shl_code] Parametrene og krypteringsalgoritmerne i dette er kopieret fra internettet, jeg forstår det ikke så godt, sandsynligvis er det for at anmode om et tidsstempel og offentlig nøgle først, derefter RSA-kryptering og til sidst behandle behandlingen og indsende det til Sina login-interfacet, efter at have logget ind fra Sina, vil det returnere en Weibo-adresse, du skal anmode om det, så login-status kan træde fuldt ud, Efter vellykket login vil efterfølgende anmodninger indeholde den nuværende brugers cookie.
0×03 Udpeget rød kuverttegning Efter at have logget ind på Weibo med succes, kan jeg ikke vente med at finde en rød kuvert for at prøve først, selvfølgelig først i browseren. Endelig fandt jeg en side med en rød kuvertknap, F12 tilkaldte debuggeren for at se, hvad datapakken bad om.
Du kan se, at adressen på anmodningen er http://huodong.weibo.com/aj_hongbao/getlucky, der er to hovedparametre, den ene er ouid, altså den røde envelope-id, som kan ses i URL'en, den anden share-parameter afgør, om den skal deles til Weibo, og der er en _t, jeg ikke ved, hvad den er til. Okay, teoretisk set kan du fuldføre udtrækningen af røde kuverter ved at indsende tre parametre til denne URL, men når du faktisk indsender parametrene, vil serveren magisk returnere en sådan streng til dig: [mw_shl_code=java, sandt] {"code":303403,"msg":"Beklager, du har ikke tilladelse til at få adgang til denne side","data":[]}[/mw_shl_code] Bliv ikke panisk på nuværende tidspunkt, ifølge mine mange års erfaring med webudvikling bør den anden parts programmør vurdere refereren, meget enkelt, kopier alle headers fra den tidligere anmodning. [mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- træk rød kuvert fra:"+str(id)+"---" print "----------......----------" hvis checkValue(id)==False: #不符合条件, dette er funktionen return later 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, ligesom Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(luckyUrl,param, header)[/mw_shl_code] I dette tilfælde er der ikke noget problem i teorien, men faktisk er der heller ikke noget problem. Når lotterihandlingen er afsluttet, skal vi vurdere status, og den returnerede res er en json-streng, hvor koden er 100000 er succesfuld, og hvis det er 90114, er det den øvre grænse for dagens lotteri, og de andre værdier fejler også, så: [mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- har nået øvre grænse---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["kode"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='100000':#成功 print u"---------Ønsker dig vellykke---------" print "----------......----------" log('succes',str(id)+'---'+res) exit(0) if hbRes["data"] og hbRes["data"]["title"]: print hbRes["data"]["title"] print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"])ellers: print u"---------Request error---------" print "----------......----------" log('lucky', str(id)+'---'+res)[/mw_shl_code], hvor log også er en funktion, jeg tilpasser, som bruges til at registrere 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]
|