|
0×00 Taustaa
Millaisia punaiset kirjekuoret ovat? Hänen veljensä poika Huer sanoi: "Raha on lähes verrattavissa. Veli ja tytär Dao Yun sanoivat: "Se ei ole yhtä hyvä kuin tätini tuulen takia." "Kaikki ymmärtävät taustan, on uusi vuosi, ja se on päivä, jolloin punaiset kirjekuoret lentelevät taivaalla. Sattumalta opin Pythonin kaksi päivää sitten, ja olin innostuneempi, joten tutkin ja tutkin Weibon punaisten kirjekuorien ryömimistä, miksi Weibon punaiset kirjekuoret Alipayn punaisten kirjekuorien sijaan, koska ymmärrän vain verkkoa, ja jos minulla on energiaa, saatan myös opiskella whack-a-mole-algoritmia tulevaisuudessa. Koska olen aloittelija Pythonissa, tämä ohjelma on myös kolmas ohjelma, jonka kirjoitin Pythonin oppimisen jälkeen, joten älä tökkää henkilökohtaisesti, jos koodissa on kuoppaa, keskitytään ideaan, no, jos ideassa on kuilua, älä tökkää sitä kasvotusten, näetkö, IE:llä on mahdollisuus asettaa itsensä oletusselaimeksi, ja kirjoitan roskapohjainen artikkeli on myös hyväksyttävä...... Käytän Python 2.7:ää, ja sanotaan, että Python 2:n ja Python 3:n välillä on suuri ero.
0×01 ideoita Olin liian laiska kuvaamaan sitä sanoin, joten piirsin luonnoksen, ja kaikkien pitäisi ymmärtää se.
Ensinnäkin, vanha sääntö: esittele ensin kirjasto, jonka käyttö ei ole sinulle hyödyllistä, mutta jota et voi luopua: [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] Ilmoita sitten joitakin muita muuttujia, joita sinun täytyy käyttää myöhemmin:
[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Tässä käytetään RSA-kirjastoa, joka ei ole oletuksena Pythonissa. Täytyy asentaa :https://pypi.python.org/pypi/rsa/
Lataamisen jälkeen suorita setpy.py asennus, niin voimme aloittaa kehitysvaiheet.
0×02 Weibo-kirjautuminen Punaisten kirjekuorien kerääminen täytyy suorittaa kirjautumisen jälkeen, joten kirjautumistoiminto on oltava olemassa, kirjautuminen ei ole avain, avain on evästeiden säilyttäminen, tässä tarvitaan cookielibin yhteistyötä. [mw_shl_code=java,true]cj = cookielib. CookieJar()opener = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(opener)[/mw_shl_code] Näin kaikki verkkotoiminnot, jotka käyttävät avaajaa, käsittelevät evästeiden tilan, vaikka en tiedä siitä paljoa, mutta se tuntuu mahtavalta. Seuraavaksi meidän täytyy kapseloida kaksi moduulia, toinen on tiedonkeruumoduuli, jota käytetään yksinkertaisesti datan GET-vastaanottamiseen, ja toinen datan POST-käyttöön. [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') palauttaa teksti paitsi Exception, e: print u' pyydä poikkeus, 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() palauttaa teksti paitsi Exception, e: print u'Request exception, url: '+url[/mw_shl_code] Näillä kahdella moduulilla voimme SAADA ja POSTATA dataa, joista yksi syy siihen, miksi getData dekoodataan ja sitten koodataan, on se, että Win7:ssä olen aina sekoittanut tuloksen virheenkorjauksessa, joten lisäsin koodausprosessointia, nämä eivät ole pointti, alla oleva kirjautumisfunktio on Weibo-kirjautumisen ydin. [mw_shl_code=java,true]def login(nick, pwd): tulosta 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 (yhteensopiva; 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"--------- Kirjautuminen onnistui! ------- "print" ----------......---------- "paitsi Poikkeus, e: print u" --------- kirjautuminen epäonnistui! -------" tulosta "----------......----------" exit(0)[/mw_shl_code]Tämän parametrit ja salausalgoritmit on kopioitu internetistä, en ymmärrä kovin hyvin, luultavasti se on ensin aikaleiman ja julkisen avaimen pyytäminen, sitten RSA-salaus ja lopuksi käsittely ja lähetetään se Sina-kirjautumisrajapintaan, kun Sinasta on onnistuneesti kirjautunut, se palauttaa Weibo-osoitteen, sinun täytyy pyytää se, jotta kirjautumistila voi aktivoitua kokonaan, Onnistuneen kirjautumisen jälkeen seuraavat pyynnöt kantavat nykyisen käyttäjän evästeen.
0×03 Nimetty punainen kirjekuoripiirros Kun kirjauduin onnistuneesti Weiboon, en malta odottaa, että löydän punaisen kirjekuoren kokeillakseni sitä ensin, tietenkin ensin selaimessa. Lopulta löysin sivun, jossa oli punainen kirjekuoripainike, F12 kutsui debuggerin nähdäkseen, mitä datapaketti pyysi.
Näet, että pyynnön osoite on http://huodong.weibo.com/aj_hongbao/getlucky, siinä on kaksi pääparametria: toinen on ouid, eli punainen envelope-id, joka näkyy URL-osoitteessa, toinen share-parametri määrää, jaetaanko se Weiboon, ja on _t en tiedä mihin se on tarkoitettu. Nyt teoriassa voit suorittaa punaisten kirjekuorien poimimisen lähettämällä kolme parametria tähän URL-osoitteeseen, mutta kun lähetät parametrit, huomaat, että palvelin palauttaa sinulle taianomaisesti tällaisen merkkijonon: [mw_shl_code=java, totta] {"code":303403,"msg":"Valitettavasti teillä ei ole lupaa päästä tälle sivulle","data":[]}[/mw_shl_code] Älä panikoi nyt, monien vuosien web-kehityskokemukseni mukaan toisen osapuolen ohjelmoijan pitäisi arvioida suosittelijaa, hyvin yksinkertaista, kopioi kaikki aiemman pyynnön otsikot. [mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- draw red envelope from:"+str(id)+"---" print "----------......----------" if checkValue(id)==False: #不符合条件, tämä on funktio, joka palautetaan myöhemmin 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, kuten Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(luckyUrl,param, otsikossa)[/mw_shl_code] Tässä tapauksessa teoriassa ei ole ongelmaa, mutta todellisuudessa ongelmaa ei ole. Kun arpajaistoiminto on suoritettu, meidän täytyy arvioida tilanne, ja palautettu resoluutio on json-merkkijono, jossa koodi on 100000 on onnistunut, ja jos se on 90114, se on tämän päivän arpajaisten yläraja, ja muutkin arvot epäonnistuvat, joten: [mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- on saavuttanut ylärajan---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='100000':#成功 print u"---------Toivotan sinulle hyvinvointia---------" 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], jossa lokki on myös toiminto, jonka muokkaan ja jota käytetään lokien tallentamiseen: [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]
|