Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 13448|Svar: 5

Sådan griber du røde kuverter videnskabeligt: Ved årets slutning kan du blive rig og skrive et program til at få fat i røde kuverter

[Kopier link]
Opslået på 13/02/2015 22.44.10 | | | |
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]





Tidligere:Noter om maksimale PHP-uploadgrænser
Næste:memcache dll-udvidelse download til PHP5.2, 5.3, 5.4, 5.5
 Udlejer| Opslået på 13/02/2015 22.46.37 |
0×04 Gennemsøg listen over røde kuverter
Efter en vellykket test af en enkelt rød kuvertindsamlingsaktion er det det centrale store move-modul i vores program – crawling på den røde envelope list burde der være mange metoder og indgange til at crawle den røde envelope-liste, såsom forskellige Weibo-søgeord og lignende, men jeg bruger den simpleste metode her: crawling af den røde envelope-liste.
På forsiden (http://huodong.weibo.com/hongbao af den røde kuvertaktivitet, gennem forskellige punkter mere, kan alle observeres, selvom listen ofte er forbundet, kan den opsummeres i to kategorier (undtagen den rigeste røde kuvertliste): tema og rangliste.
Fortsæt med at påkalde F12, analyser formatet på begge sider, begyndende med en liste over tematiske former, såsom: http://huodong.weibo.com/hongbao/special_quyu
Du kan se, at informationen om den røde kuvert er i en div kaldet info_wrap, så vi behøver kun at aktivere kildekoden til denne side, og så hente alle infowraps, og så blot behandle det for at få den røde kuvertliste på denne side, her skal vi bruge nogle regulars:
[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">(.+?) <overklasse="rob_txt">',</span> re. DOTALL) #h Få info_wrap den almindelige pInfo=re.compile(r'.+<em class="num">(.+)</em>.+<em class="num">(.+)</em>.+<em class="num">(.+).</em>.+href="(.+)" klasse="btn"',re. DOTALL) #获取红包信息 List=pWrap.findall(html,re. DOTALL) n=len(Liste) hvis n==0: returner for i i i interval(n): #traverse alle 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')) #礼品价值 undtagen Undtagelse, e:                        info[1]=float(info[1].replace('\xd2\xda','00000000')) #礼品价值 info[2]=float(info[2].replace('\xcd\xf2','0000')) #已发送 if info[2]==0: info[2]=1 #防止除数为0 hvis info[1]==0: info[1]=1 #防止除数为0 info.append(info[0]/(info[2]+info[1])) #红包价值, kontanter/(antal ansøgere + præmieværdi) # hvis info[0]/(info[2]+info[1])>100:                # print url luckyList.append(info) hvis 'class="page"' i html:#存在下一页 p=p+1 getThemeList(url,p) #递归调用自己爬取下一页[/mw_shl_code]Det er så svært at sige, at det er så svært, og det tog lang tid at skrive disse to sætninger. Der er også en info i infoen her vedlæg [4], som er min algoritme til groft at vurdere værdien af røde kuverter, hvorfor gøre det, for der er mange røde kuverter, men vi kan kun trække fire gange, i det enorme hav af poser skal vi finde de mest værdifulde røde kuverter og derefter trække dem, her er tre data til reference: kontantværdi, gaveværdi og antal modtagere, selvfølgelig hvis kontanterne er små, og antallet af modtagere, mange personer, eller præmiens værdi er super høj (nogle er endda vanvittige i enheder på hundreder af millioner), Så er det ikke værd at tage med, så jeg holdt mig tilbage længe og fandt til sidst på en algoritme til at måle vægten af røde kuverter: den røde kuvertværdi = kontanter / (antal modtagere + præmieværdi).
Princippet på leaderboard-siden er det samme: find nøgletags, og match dem regelmæssigt.
[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">(.+?) <overklasse="list_btn">',</span> re. DOTALL) #h Få list_info den almindelige pInfo=re.compile(r'.+<em class="num">(.+)</em>.+<em class="num">(.+)</em>.+<em class="num">(.+).</em>.+href="(.+)" klasse="btn rob_btn"',re. DOTALL) #获取红包信息 List=pWrap.findall(html,re. DOTALL) n=len(Liste) hvis n==0: returner for i i interval(n): #Iterate gennem alle info_wrap div s=pInfo.match(List) #取得红包信息 topinfo=liste(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')) #礼品价值 undtagen Undtagelse, e:                        info[1]=float(info[1].replace('\xd2\xda','00000000')) #礼品价值 info[2]=topinfo[0].replace('\xb8\xf6','') #个->'' info[2]=float(info[2].replace('\xcd\xf2','0000')) #已发送                hvis info[2]==0: info[2]=1 #防止除数为0 if info[1]==0: info[1]=1 #防止除数为0 info.append(info[0]/(info[2]+info[1])) #红包价值, kontanter/(antal modtagere + gaveværdi)                # if info[0]/(info[2]+info[1])>100: # print URL luckyList.append(info) hvis 'class="page"' i html:#存在下一页 p=p+1                getTopList(url,daily,p) #递归调用自己爬取下一页[/mw_shl_code]Okay, nu kan vi med succes crawle listen over de to specielle sider, og næste skridt er at hente listen over lister, altså samlingen af alle disse listeadresser, og derefter hente dem én ad gangen:
[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', 'Qyu':'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=', 'Clothes':'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'                } for (theme,url) i themeUrl.items(): print "----------"+theme+"----------" print URL print "----------......----------"                getThemeList(url,1) for (top,url) i topUrl.items(): print "----------"+top+"----------" print url print "----------......----------"                getTopList(url,0,1) getTopList(url,1,1)[/mw_shl_code]
 Udlejer| Opslået på 13/02/2015 22.47.13 |
0×05 Vurder tilgængeligheden af røde kuverter
Det er relativt enkelt: Søg først efter nøgleord i kildekoden for at se, om der er en rød envelope grab-knap, og gå derefter til samlingsrangeringen for at se, hvad den højeste post er; hvis den højeste kun modtager et par dollars, farvel......
Adressen til at se samlingsposten er http://huodong.weibo.com/aj_hongbao/detailmore?page=1&type=2&_t=0&__rnd=1423744829265&uid=Red Envelope ID

[mw_shl_code=java,true]def checkValue(id): infoUrl='http://huodong.weibo.com/hongbao/'+str(id) html=getData(infoUrl) hvis 'action-type="lottery"' i html eller 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, ligesom 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 Få alle list_info stamkunder luckyLog=pMoney.findall(html,re. DOTALL) hvis len(luckyLog)==0: maxMoney=0 ellers: maxMoney=float(luckyLog[0]) hvis maxMoney <laveste: #记录中最大红包小于设定值 returner falsk ellers: print u"--------- hånden sænker farten---------" print "----------......----------" returner falsk        return True[/mw_shl_code]0×06 Færdiggørelse af arbejde
Hovedmodulerne er allerede på plads, og nu skal alle trin kobles i serie:
[mw_shl_code=java,true]def start(brugernavn,adgangskode,low,fromFile): gl=False lowest=lav login(brugernavn, adgangskode) if fromfile=='y': if os.path.exists('luckyList.txt'):                         try: f = file('luckyList.txt') newList = [] newList = p.load(f)                                print u'--------- load-liste---------' print "----------......----------" undtagen undtagelse, f.eks: print u' mislykkedes i at parse den lokale liste, og crawlede online-siden. ' print "----------......----------" gl=Sandt ellers: print u' eksisterer ikke lokalt luckyList.txt crawling af online-sider. ' print "----------......----------" gl=True if gl==True: getList() from operator import itemgetter                newList=sorted(luckyList, key=itemgetter(4),reverse=True) f = file('luckyList.txt', 'w') p.dump(newList, f) #把抓到的列表存到文件里, så du behøver ikke fange f.close() for lucky in næste gang newList: hvis ikke 'http://huodong.weibo.com' i lucky[3]: #不是红包 fortsætte print lucky[3] id=re.findall(r'(\w*[0-9]+)\w*',lucky[3])                getLucky(id[0])[/mw_shl_code] Fordi det er meget besværligt at crawle den røde kuvertliste gentagne gange hver test, tilføjede jeg et afsnit for at dumpe hele listen ind i filkoden, så du kan læse den lokale liste og hente den røde kuvert i fremtiden.
[mw_shl_code=java,true]hvis __name__ == "__main__": print u"------------------ Weibo Red Envelope Assistant------------------" print "---------------------v0.0.1---------------------" print u"------------- by @***----------------" print "-------------------------------------------------" try: uname=raw_input(u"Indtast venligst din Weibo-konto: ".decode('utf-8').encode('gbk'))                pwd=raw_input(u"Indtast venligst din Weibo-adgangskode: ".decode('utf-8').encode('gbk')) low=int(raw_input(u"Rød kuvert for at modtage maksimale kontanter større end n: ".decode('utf-8').encode('gbk')))))) fromfile=raw_input(u) Om man skal bruge den røde kuvertliste i luckyList.txt: (y/n) ".decode('utf-8').encode('gbk')) undtagen undtagelse, e: print u" parameter error" print "----------......----------" print e                Exit(0) print u"--------- program start---------" print "----------......----------" start(uname,pwd,low,fromfile) print u" --------- program end--------- "print "----------...... ----------" os.system('pause')[/mw_shl_code]
0×07 Lad os gå!

0×07 Resumé
Det grundlæggende crawler-skelet er stort set færdigt, faktisk er der stadig meget plads til, at denne crawler kan spille med mange detaljer, såsom at modificere den til at understøtte batch-login, som optimering af den røde envelope value-algoritme, koden burde også have mange muligheder for optimering, men med min evne vurderer jeg, at jeg kan få dette.
Til sidst så alle resultatet af programmet, jeg skrev hundredvis af linjer kode, tusindvis af ord i artikler, og alt jeg arbejdede hårdt for at få var bare et sæt tofarvede kugler, Nima pit dad, hvordan kunne det være en tofarvet kugle!! (Fortæller: Jo mere forfatteren talte, jo mere begejstret blev han, og han græd faktisk, og folkene omkring ham overbeviste: Bror, det er ikke sådan, er det ikke bare en Weibo rød kuvert, i går gjorde mine hænder ondt, og jeg rystede ikke en WeChat rød kuvert ud.) )

Opslået på 14/02/2015 07.14.33 |
Hvor mange penge tog du i Loulou?
Opslået på 02/03/2016 13.48.27 |
Ser så høj ud
Opslået på 07/03/2016 12.51.02 |
Jeg ved ikke, om det er alvorligt
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com