|
|
Publisert på 13.02.2015 22:44:10
|
|
|
|

|
0×00 Bakgrunn
Hvordan er de røde konvoluttene? Brorens sønn, Huer, sa: «Pengene er nesten sammenlignbare. Broren og datteren Dao Yun sa: «Det er ikke like bra som tanten min på grunn av vinden.» "Alle forstår bakgrunnen, det er nyttår, og det er dagen da røde konvolutter flyr over himmelen. Det skjedde at jeg lærte Python for to dager siden, og jeg ble mer begeistret, så jeg studerte og studerte krypingen av Weibo røde konvolutter, hvorfor Weibo røde konvolutter i stedet for Alipay røde konvolutter, fordi jeg bare forstår nettet, og hvis jeg har energi, kan jeg også studere whack-a-mole-algoritmen i fremtiden. Siden jeg er nybegynner i Python, er dette også det tredje programmet jeg skrev etter å ha lært Python, så vær så snill, ikke prøv personlig om det er en grop i koden, fokuset er på ideen, vel, hvis det er en grop i ideen, vær så snill å ikke pirke på det personlig, du skjønner at IE har ansiktet til å sette seg selv som standardnettleser, jeg skriver at en skitne artikkel også er akseptabelt...... Jeg bruker Python 2.7, og det sies at det er stor forskjell mellom Python 2 og Python 3.
0×01 Ideer Jeg var for lat til å beskrive det med ord, så jeg tegnet en skisse, og alle burde kunne forstå det.
Først og fremst, den gamle regelen: introduser først et bibliotek du ikke vet er nyttig for, men som du ikke kan klare deg uten: [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 deretter noen andre variabler som du må bruke senere:
[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Et rsa-bibliotek brukes her, som ikke er inkludert i Python som standard. Må installere det :https://pypi.python.org/pypi/rsa/
Etter å ha lastet det ned, kjør setpy.py installasjonen, og så kan vi starte utviklingsprosessen.
0×02 Weibo-innlogging Handlingen med å hente røde konvolutter må utføres etter innlogging, så det må finnes en innloggingsfunksjon, innlogging er ikke nøkkelen, nøkkelen er bevaring av informasjonskapsler, her kreves samarbeid 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åten vil alle nettverksoperasjoner som bruker opener håndtere tilstanden til informasjonskapsler, selv om jeg ikke vet så mye om det, men det føles fantastisk. Deretter må vi kapsle inn to moduler, den ene er datainnsamlingsmodulen, som brukes til å HENTE data, og den andre brukes til å 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 unntatt Unntak, 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() returner tekst unntatt Unntak, f.eks: print u'Request exception, url: '+url[/mw_shl_code] Med disse to modulene kan vi FÅ og POST-data, hvorav grunnen til at getData dekoder og deretter koder er fordi jeg under Win7 alltid forvrengte utdataene under feilsøking, så jeg la til noe kodingsprosessering, men dette er ikke poenget, innloggingsfunksjonen under er kjernen i Weibo-innlogging. [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 (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) skriv ut u"--------- Innlogging vellykket! ------- "print" ----------......---------- "bortsett fra unntak, f.eks: print u" --------- innlogging feilet! -------" skriv ut "----------......----------" exit(0)[/mw_shl_code]Parameterne og krypteringsalgoritmene i dette er kopiert fra Internett, jeg forstår det ikke så godt, sannsynligvis er det for å be om tidsstempel og offentlig nøkkel først, deretter RSA-kryptering og til slutt behandle behandlingen og sende det til Sina innloggingsgrensesnittet, etter vellykket innlogging fra Sina vil det returnere en Weibo-adresse, du må be om det, slik at innloggingsstatusen kan tre i kraft fullt ut, Etter vellykket innlogging vil påfølgende forespørsler bære den nåværende brukerens informasjonskapsel.
0×03 Utpekt rød konvolutttegning Etter å ha logget inn på Weibo, gleder jeg meg til å finne en rød konvolutt å prøve først, selvfølgelig først i nettleseren. Til slutt fant jeg en side med en rød konvoluttknapp, F12 tilkalte debuggeren for å se hva datapakken ba om.
Du kan se at adressen til forespørselen er http://huodong.weibo.com/aj_hongbao/getlucky, det er to hovedparametere, en er ouid, altså den røde envelope-id-en, som kan sees i URL-en, den andre share-parameteren avgjør om den skal deles til Weibo, og det er en _t jeg ikke vet hva den er til. Ok, teoretisk sett kan du fullføre uttrekkingen av røde konvolutter ved å sende tre parametere til denne URL-en, men når du faktisk sender inn parameterne, vil du oppdage at serveren magisk returnerer en slik streng til deg: [mw_shl_code=java, sant] {"code":303403,"msg":"Beklager, du har ikke tillatelse til å få tilgang til denne siden","data":[]}[/mw_shl_code] Ikke få panikk nå, ifølge mine mange års erfaring med webutvikling bør den andre partens programmerer vurdere refereren, veldig enkelt, kopier alle headerne fra forrige forespørsel. [mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- trekk rød konvolutt fra:"+str(id)+"---" skriv ut "----------......----------" hvis checkValue(id)==False: #不符合条件, dette er funksjonen 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, som 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 tilfellet er det ikke noe problem i teorien, men faktisk er det ikke noe problem. Etter at lotterihandlingen er fullført, må vi vurdere statusen, og den returnerte resen er en json-streng, hvor koden er 100000 er vellykket, og hvis den er 90114, er det øvre grense for dagens lotteri, og de andre verdiene feiler også, altså: [mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- har nådd øvre grense---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='100000':#成功 skriv ut u"---------Ønsker deg vellykke---------" skriv ut "----------......----------" log('suksess',str(id)+'---'+res) exit(0) if hbRes["data"] og hbRes["data"]["title"]: print hbRes["data"]["title"] print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["kode"])+'---'+hbRes["data"]["title"])ellers: print u"---------Request error---------" print "----------......----------" log('lucky', str(id)+'---'+res)[/mw_shl_code], hvor log også er en funksjon jeg tilpasser, som brukes til å registrere logger: [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]
|
Foregående:Notater om maksimale PHP-opplastingsgrenserNeste:memcache dll-utvidelse nedlasting for PHP5.2, 5.3, 5.4, 5.5
|