Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 13448|Risposta: 5

Come ottenere buste rosse scientificamente: alla fine dell'anno puoi arricchirti e scrivere un programma per ottenere buste rosse

[Copiato link]
Pubblicato su 13/02/2015 22:44:10 | | | |
0×00 Contesto

Com'è le buste rosse? Il figlio di suo fratello, Huer, disse: "I soldi sono quasi paragonabili. Il fratello e la figlia Dao Yun dissero: "Non è buono come mio zio a causa del vento." "Tutti capiscono il contesto, è Capodanno, ed è il giorno in cui buste rosse volano ovunque nel cielo. È successo che ho imparato Python due giorni fa, e mi sono entusiasmato di più, così ho studiato e studiato il crawling delle buste rosse di Weibo, perché le buste rosse di Weibo invece di quelle di Alipay, perché capisco solo il Web, e se avrò l'energia, potrei anche studiare l'algoritmo whack-a-mole in futuro.
Poiché sono un principiante in Python, questo programma è anche il terzo che ho scritto dopo aver imparato Python, quindi per favore non insistere di persona se c'è qualche buco nel codice, l'attenzione è sull'idea, beh, se c'è qualche buco nell'idea, per favore non toccarlo di persona, vedi, IE ha il volto di impostarsi come browser predefinito, scrivere un articolo scadente è accettabile......
Uso Python 2.7, e si dice che ci sia una grande differenza tra Python 2 e Python 3.
0×01 Idee
Ero troppo pigro per descriverlo a parole, così ho fatto uno schizzo, e tutti dovrebbero riuscire a capirlo.
Prima di tutto, la vecchia regola: introdurre prima una libreria per cui non sai se è utile ma che non puoi fare a meno:
[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] Poi dichiara altre variabili che dovrai usare in seguito:

[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Qui viene utilizzata una libreria rsa, che di default non è inclusa in Python. Devo installarlo :https://pypi.python.org/pypi/rsa/

Dopo averlo scaricato, esegui setpy.py installazione e poi possiamo iniziare i passaggi di sviluppo.
0×02 Accesso Weibo
L'azione di prendere le buste rosse deve essere eseguita dopo l'accesso, quindi deve esserci una funzione di login, il login non è la chiave, la chiave è la conservazione dei cookie, qui è richiesta la collaborazione di cookielib.
[mw_shl_code=java,true]cj = cookielib. CookieJar()opener = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(opener)[/mw_shl_code] In questo modo, tutte le operazioni di rete che usano l'opener gestiranno lo stato dei cookie, anche se non ne so molto, ma è una sensazione fantastica.
Successivamente, dobbiamo incapsulare due moduli, uno è il modulo acquisizione dati, che viene usato semplicemente per ottenere dati, e l'altro per POST dati.
[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') restituisci testo tranne 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() return text excepto Exception, e: print u'Request exception, url: '+url[/mw_shl_code] Con questi due moduli possiamo GET e POST dati, tra cui il motivo per cui getData decode e poi encode è che sotto Win7 ho sempre distorto l'output durante il debug, quindi ho aggiunto un po' di elaborazione della codifica, ma non è questo il punto, la funzione di login qui sotto è il nucleo dell'accesso Weibo.
[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) chiave = rsa. PublicKey(rsaPublickey,65537) messaggio = str(servertime) +'\t' + str(nonce) + '\n' + str(pwd) sp = binascii.b2a_hex(rsa.encrypt(message,key)) header = {'User-Agent' : 'Mozilla/5.0 (compatibile; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)'} param = { 'entry': 'weibo', 'gateway': '1', 'from': '', 'salvestate': '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"--------- Accesso riuscito! ------- "stampa" ----------......---------- "eccezione eccezionale, e: print u" --------- accesso fallito! -------" stampa "----------......----------" exit(0)[/mw_shl_code]I parametri e gli algoritmi di crittografia sono copiati da Internet, non capisco molto bene, probabilmente bisogna richiedere prima un timestamp e una chiave pubblica, poi la crittografia RSA e infine elaborare l'elaborazione e inviarla all'interfaccia di login Sina, dopo aver effettuato il login con successo da Sina, restituirà un indirizzo Weibo, devi richiederlo affinché lo stato di accesso possa avere effetto completo, Dopo un accesso riuscito, le richieste successive porteranno il cookie dell'utente attuale.
0×03 Disegno designato della busta rossa
Dopo aver effettuato il login con successo su Weibo, non vedo l'ora di trovare una busta rossa per provare prima, ovviamente, prima nel browser. Finalmente ho trovato una pagina con un pulsante rosso per la busta, F12 ha evocato il debugger per vedere cosa stava richiedendo il pacchetto dati.

Puoi vedere che l'indirizzo della richiesta è http://huodong.weibo.com/aj_hongbao/getlucky, ci sono due parametri principali: uno è ouid, cioè l'id rosso della busta che si vede nell'URL, l'altro parametro di condivisione determina se condividerlo con Weibo, e c'è un _t non so a cosa serva.
Ok, ora teoricamente puoi completare l'estrazione delle buste rosse inviando tre parametri a questo URL, ma quando effettivamente invii i parametri, scoprirai che il server ti restituirà magicamente una stringa di questo tipo:
[mw_shl_code=java,vero] {"code":303403,"msg":"Mi dispiace, non hai il permesso di accedere a questa pagina","data":[]}[/mw_shl_code] Non farti prendere dal panico in questo momento, secondo i miei molti anni di esperienza nello sviluppo web, il programmatore dell'altra parte dovrebbe giudicare chi fa referenza, molto semplice, copia tutte le intestazioni della richiesta precedente.
[mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- disegna invilupupo rosso da:"+str(id)+"---" stampa "----------......----------" if checkValue(id)==False: #不符合条件, questa è la funzione return più tardi        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, come Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(luckyUrl,param, header)[/mw_shl_code] In questo caso, in teoria non c'è problema, ma in realtà non c'è problema. Dopo che l'azione della lotteria è completata, dobbiamo giudicare lo stato, e la re restituita è una stringa json, dove il codice è 100000 è successo, e se è 90114, è il limite superiore della lotteria odierna, e anche gli altri valori vengono falliti, quindi:
[mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- ha raggiunto il limite superiore---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='100000':#成功 print u"---------Ti auguro prosperità---------" print "----------......----------"        log('success',str(id)+'---'+res) exit(0) se hbRes["data"] e 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], dove log è anche una funzione che personalizzo, usata per registrare i log:
[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]





Precedente:Note sui limiti massimi di caricamento di PHP
Prossimo:download dell'estensione dll memcache per PHP5.2, 5.3, 5.4, 5.5
 Padrone di casa| Pubblicato su 13/02/2015 22:46:37 |
0×04 Striscia la lista delle buste rosse
Dopo il test riuscito di una singola azione di raccolta delle buste rosse, è il modulo principale della grande mossa del nostro programma - scansionando la lista delle buste rosse, dovrebbero esserci molti metodi e ingressi per esplorare la lista delle buste rosse, come varie parole chiave di ricerca Weibo e così via, ma qui uso il metodo più semplice: scansionare la lista delle buste rosse.
Nella homepage (http://huodong.weibo.com/hongbao dell'attività della busta rossa, attraverso vari punti in più, si possono osservare tutti, anche se la lista è molto collegata, può essere riassunta in due categorie (tranne la lista più ricca della busta rossa): tema e classifica.
Continuando a evocare F12, analizza il formato di entrambe le pagine, iniziando con un elenco di forme tematiche, come: http://huodong.weibo.com/hongbao/special_quyu
Puoi vedere che le informazioni della busta rossa si trovano in un div chiamato info_wrap, quindi dobbiamo solo attivare il codice sorgente di questa pagina, prendere tutti gli infowrap e processarli semplicemente per ottenere la lista delle buste rosse di questa pagina, qui dobbiamo usare alcuni regolari:
[mw_shl_code=java,true]def getThemeList(url,p):#主题红包 print u"--------- "+str(p)+"page---------" print "----------......----------" html=getData(url+'?p='+str(p)) pWrap= re.compile(r'<div class="info_wrap">(.+?) <span class="rob_txt"></span>',re. DOTALL) #h Get info_wrap la regolare pInfo=re.compile(r'.+<em class="num">(.+)</em>.+<em class="num">(.+)</em>.+<em class="num">(.+).</em>.+href="(.+)" class="btn"',re. DOTALL) #获取红包信息 List=pWrap.findall(html,re. DOTALL) n=len(List) se n==0: return for i in range(n): #traverse all info_wrap div s=pInfo.match(List) #取得红包信息 info=list(s.groups(0))                info[0]=float(info[0].replace('\xcd\xf2','0000')) #现金,ten->0000 try: info[1]=float(info[1].replace('\xcd\xf2','0000')) #礼品价值 eccezione Exception, e:                        info[1]=float(info[1].replace('\xd2\xda','0000000')) #礼品价值 info[2]=float(info[2].replace('\xcd\xf2','0000')) #已发送 if info[2]==0: info[2]=1 #防止除数为0 se info[1]==0: info[1]=1 #防止除数为0 info.append(info[0]/(info[2]+info[1])) #红包价值, contanti/(numero di rivendicati + valore del premio) # se info[0]/(info[2]+info[1])>100:                # print url luckyList.append(info) se 'class="page"' in html:#存在下一页 p=p+1 getThemeList(url,p) #递归调用自己爬取下一页[/mw_shl_code]È così difficile dire che è così difficile, e ci è voluto molto tempo per scrivere queste due frasi. C'è anche un'informazione nell'appendice qui [4], che è il mio algoritmo per giudicare approssimativamente il valore delle buste rosse, perché farlo? Perché ci sono molte buste rosse ma possiamo estrarre solo quattro volte, nel vasto mare di borse dobbiamo trovare le buste rosse più preziose e poi estrarle, ecco tre dati di riferimento: valore in contanti, valore del dono e numero di destinatari, ovviamente se il denaro è piccolo e il numero di persone che ricevono molte persone o il valore del premio è altissimo (alcune sono addirittura folli in unità di centinaia di milioni), Poi non vale la pena prenderla, così ho trattenuto a lungo e alla fine ho ideato un algoritmo per misurare il peso delle buste rosse: valore della busta rossa = denaro / (numero di vincitori + valore del premio).
Il principio della pagina della classifica è lo stesso: trova i tag dei tasti e abbinali regolarmente.
[mw_shl_code=java,true]def getTopList(url,daily,p):#排行榜红包 print u"--------- "+str(p)+"page---------" print "----------......----------" html=getData(url+'?daily='+str(daily)+'& p='+str(p)) pWrap=re.compile(r'<div class="list_info">(.+?) <span class="list_btn"></span>',re. DOTALL) #h Prendi list_info la regolare pInfo=re.compile(r'.+<em class="num">(.+)</em>.+<em class="num">(.+)</em>.+<em class="num">(.+).</em>.+href="(.+)" class="btn rob_btn"',re. DOTALL) #获取红包信息 List=pWrap.findall(html,re. DOTALL) n=len(List) se n==0: restituisci per i nell'intervallo(n): #Iterate attraverso tutte le info_wrap div s=pInfo.match(List) #取得红包信息 topinfo=list(s.groups(0))                info=List(TopInfo) Info[0]=TopInfo[1].Replace('\xd4\xaa','') #元->'' info[0]=float(info[0].replace('\xcd\xf2','0000')) #现金,10,>0000 info[1]=topinfo[2]. replace('\xd4\xaa',') #元->'' try: info[1]=float(info[1].replace('\xcd\xf2','0000')) #礼品价值 eccezione Exception, e:                        info[1]=float(info[1].replace('\xd2\xda','0000000')) #礼品价值 info[2]=topinfo[0].replace('\xb8\xf6','') #个->'' info[2]=float(info[2].replace('\xcd\xf2','0000')) #已发送                if info[2]==0: info[2]=1 #防止除数为0 se info[1]==0: info[1]=1 #防止除数为0 info.append(info[0]/(info[2]+info[1])) #红包价值, contanti/(numero di destinatari + valore del dono)                # if info[0]/(info[2]+info[1])>100: # print url luckyList.append(info) if 'class="page"' in html:#存在下一页 p=p+1                getTopList(url, daily,p) #递归调用自己爬取下一页[/mw_shl_code]Ok, ora possiamo scansionare con successo la lista delle due pagine speciali, e il passo successivo è ottenere la lista delle liste, cioè la raccolta di tutti questi indirizzi di lista, e poi prenderli uno per uno:
[mw_shl_code=java,true]def getList(): print u"---------Find target---------" print "----------......----------" themeUrl={ #主题列表 'theme':'http://huodong.weibo.com/hongbao/theme',                 'pinpai':'http://huodong.weibo.com/hongbao/special_pinpai', 'daka':'http://huodong.weibo.com/hongbao/special_daka', 'youxuan':'http://huodong.weibo. com/hongbao/special_youxuan', 'qiye':'http://huodong.weibo.com/hongbao/special_qiye', 'quyu':'http://huodong.weibo.com/hongbao/special_quyu', 'meiti':'http: huodong.weibo.com/hongbao/special_meiti', 'hezuo':'http://huodong.weibo.com/hongbao/special_hezuo' } topUrl={ #排行榜列表 'mostmoney':'http://huodong.weibo. com/hongbao/top_mostmoney', 'mostsend':'http://huodong.weibo.com/hongbao/top_mostsend', 'mostsenddaka':'http://huodong.weibo.com/hongbao/top_mostsenddaka',                'mostsendpartner':'http://huodong.weibo.com/hongbao/top_mostsendpartner', 'cate':'http://huodong.weibo.com/hongbao/cate?type=', 'vestiti':'http://huodong.weibo.com/ hongbao/cate?type=clothes', 'beauty':'http://huodong.weibo.com/hongbao/cate?type=beauty', 'fast':'http://huodong.weibo.com/hongbao/cate?type=fast', 'life':'http: huodong.weibo.com/hongbao/cate?type=life', 'digital':'http://huodong.weibo.com/hongbao/cate?type=digital', 'other':'http://huodong.weibo.com/hongbao/cate?type=other'                } per (theme,url) in themeUrl.items(): stampa "----------"+tema+"----------" print url stampa "----------......----------"                getThemeList(url,1) per (top,url) in topUrl.items(): stampa "----------"+top+"----------" print url stampa "----------......----------"                getTopList(url,0,1) getTopList(url,1,1)[/mw_shl_code]
 Padrone di casa| Pubblicato su 13/02/2015 22:47:13 |
0×05 Giudica la disponibilità delle buste rosse
È relativamente semplice: prima cerca parole chiave nel codice sorgente per vedere se c'è un pulsante rosso per prendere la busta, poi vai nella classifica della collezione per vedere qual è il record più alto; se il massimo riceve solo pochi dollari, addio......
L'indirizzo per visualizzare il record della collezione è http://huodong.weibo.com/aj_hongbao/detailmore?page=1&type=2&_t=0&__rnd=1423744829265&uid=Red ID della busta

[mw_shl_code=java,true]def checkValue(id): infoUrl='http://huodong.weibo.com/hongbao/'+str(id) html=getData(infoUrl) if 'action-type="lottery"' in html o True: #存在抢红包按钮                logUrl="http://huodong.weibo.com/aj_hongbao/detailmore?page=1&type=2&_t=0&__rnd=1423744829265&uid="+id #查看排行榜数据 param={} header= { 'Cache-Control': 'no-cache', 'Content-Type':'application/x-www-form-urlencoded', 'Pragma':'no-cache', 'Referer':'http://huodong.weibo.com/hongbao/detail? uid='+str(id), 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, come Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(logUrl,param,header) pMoney=re.compile(r'<span class="money">(\d+?. +?) \xd4\xaa</span>', re. DOTALL) #h Fai tutti i list_info abituali luckyLog=pMoney.findall(html,re. DOTALL) se len(luckyLog)==0: maxMoney=0 else: maxMoney=float(luckyLog[0]) se maxMoney <lowerest: #记录中最大红包小于设定值 return False else: print u"--------- hand slows---------" print "----------......----------" return false        ritorna Vero[/mw_shl_code]0×06 Lavori di finitura
I moduli principali sono già in posizione, e ora tutti i passaggi devono essere collegati in serie:
[mw_shl_code=java,true]def start(username,password,low,fromFile): gl=False lowest=low login(username , password) if fromfile=='y': if os.path.exists('luckyList.txt'):                         try: f = file('luckyList.txt') newList = [] newList = p.load(f)                                print u'--------- load list---------' print "----------......----------" tranne Exception, e: print u' non è riuscito a parizzare la lista locale, scansionando la pagina online. ' print "----------......----------" gl=True else: print u' non esiste localmente luckyList.txt scansionando pagine online. ' print "----------......----------" gl=True if gl==True: getList() dall'operatore import itemgetter                newList=sorted(luckyList, key=itemgetter(4),reverse=True) f = file('luckyList.txt', 'w') p.dump(newList, f) #把抓到的列表存到文件里, quindi non devi prendere f.close() per lucky la prossima volta newList: se non 'http://huodong.weibo.com' in lucky[3]: #不是红包 continua stampa lucky[3] id=re.findall(r'(\w*[0-9]+)\w*',lucky[3])                getLucky(id[0])[/mw_shl_code] Poiché è molto complicato scansionare ripetutamente la lista delle buste rosse ogni volta che viene testata, ho aggiunto un paragrafo per inserire l'intera lista nel codice del file, così puoi leggere la lista locale e recuperare la busta rossa in futuro.
[mw_shl_code=java,true]if __name__ == "__main__": print u"------------------ Weibo Red Envelope Assistant------------------" print "---------------------v0.0.1---------------------" print u"------------- di @***----------------" Stampa "-------------------------------------------------" prova: uname=raw_input(u"Inserisci il tuo account Weibo: ".decode('utf-8').encode('GBK'))                pwd=raw_input(u"Si prega di inserire la tua password Weibo: ".decode('utf-8').encode('gbk')) low=int(raw_input(u"Busta rossa per ricevere il massimo denaro maggiore di n: ".decode('utf-8').encode('gbk'))) fromfile=raw_input(u) Se usare la lista delle buste rosse nel luckyList.txt: (y/n) ".decode('utf-8').encode('gbk')) eccetto Exception, e: print u" parameter error" print "----------......----------" print e                exit(0) stampa u"--------- inizia il programma---------" stampa "----------......----------" inizia(uname,pwd,low,fromfile) stampa u" --------- fine programma--------- "stampa "----------...... ----------" os.system('pausa')[/mw_shl_code]
0×07 Andiamo!

Sommario 0×07
Lo scheletro base del crawler è stato praticamente completato, infatti c'è ancora molto spazio per questo crawler per giocare in molti dettagli, come modificarlo per supportare il login batch, come ottimizzare l'algoritmo del valore della busta rossa, il codice stesso dovrebbe avere molti punti da ottimizzare, ma con la mia capacità stimo di poterlo ottenere.
Alla fine, tutti videro il risultato del programma, scrissi centinaia di righe di codice, migliaia di parole di articoli, e tutto quello che ho lavorato duramente per ottenere è stato solo un set di palline bicolori, Nima pit dad, come poteva essere una palla bicolore!! (Narratore: Più l'autore parlava, più si eccitava, e piangeva davvero, e le persone intorno a lui lo convincevano: Fratello, non è così, non è solo una busta rossa Weibo, ieri avevo le mani doloranti, e non ho tirato fuori una busta rossa di WeChat.) )

Pubblicato su 14/02/2015 07:14:33 |
Quanti soldi hai preso a Loulou?
Pubblicato su 02/03/2016 13:48:27 |
Sembra così alto
Pubblicato su 07/03/2016 12:51:02 |
Non so se sia grave
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com