Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 13448|Svar: 5

Hur man vetenskapligt tar tag i röda kuvert: I slutet av året kan du bli rik och skriva ett program för att få tag på röda kuvert

[Kopiera länk]
Publicerad på 2015-02-13 22:44:10 | | | |
0×00 Bakgrund

Hur ser de röda kuverten ut? Hans brors son, Huer, sade: "Pengarna är nästan jämförbara. Brodern och dottern Dao Yun sa: "Det är inte lika bra som min faster på grund av vinden." "Alla förstår bakgrunden, det är nyår och det är dagen då röda kuvert flyger över hela himlen. Det råkade bara vara så att jag lärde mig Python för två dagar sedan, och jag blev mer exalterad, så jag studerade och studerade krypandet av Weibo röda kuvert, varför Weibo röda kuvert istället för Alipay röda kuvert, för jag förstår bara webben, och om jag har energin kanske jag också studerar whack-a-mole-algoritmen i framtiden.
Eftersom jag är nybörjare i Python är detta också det tredje programmet jag skrev efter att ha lärt mig Python, så snälla, peta inte i person om det finns någon grop i koden, fokus ligger på idén, men om det finns någon grop i idén, snälla peta inte på den personligen, du ser att IE har en funktion att sätta sig själv som standardwebbläsare, jag skriver en skräpartikel är också acceptabelt......
Jag använder Python 2.7, och det sägs att det är stor skillnad mellan Python 2 och Python 3.
0×01 Idéer
Jag var för lat för att beskriva det med ord, så jag ritade en skiss, och alla borde kunna förstå den.
Först och främst, den gamla regeln: introducera först ett bibliotek som du inte vet är användbart för men som du inte kan klara dig utan:
[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] Deklarera sedan några andra variabler som du behöver använda senare:

[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Ett rsa-bibliotek används här, vilket inte ingår i Python som standard. Behöver installera det :https://pypi.python.org/pypi/rsa/

Efter att ha laddat ner det, kör setpy.py installation och sedan kan vi börja våra utvecklingssteg.
0×02 Weibo-inloggning
Handlingen att ta röda kuvert måste utföras efter inloggning, så det måste finnas en inloggningsfunktion, inloggning är inte nyckeln, nyckeln är bevarandet av cookies, här krävs samarbete 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å detta sätt hanterar alla nätverksoperationer som använder opener tillståndet för cookies, även om jag inte vet så mycket om det, men det känns fantastiskt.
Därefter behöver vi kapsla in två moduler, en är datainsamlingsmodulen, som används för att helt enkelt HÄMTA data, och den andra används för att POSTA 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",'ignorera') returnera text utom undantag, 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() returnera text utom undantag, e: print u'Request exception, url: '+url[/mw_shl_code] Med dessa två moduler kan vi HÄMTA och POSTA data, vilket bland annat är att getData avkodar och sedan kodar är att jag under Win7 alltid förvrängde utdata vid felsökning, så jag lade till viss kodningsprocess, men det är inte poängen, inloggningsfunktionen nedan är kärnan i Weibo-inloggning.
[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, 'kodning': '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"--------- Inloggning lyckades! ------- "skriv ut" ----------......---------- "förutom undantag, t.ex: skriv ut u" --------- inloggning misslyckades! -------" skriv ut "----------......----------" exit(0)[/mw_shl_code] Parametrarna och krypteringsalgoritmerna i detta är kopierade från internet, jag förstår inte så bra, troligen är det för att begära en tidsstämpel och publik nyckel först, sedan RSA-kryptering och slutligen behandla behandlingen och skicka in den till Sina-inloggningsgränssnittet, efter att ha loggat in från Sina kommer den att returnera en Weibo-adress, du måste begära den så att inloggningsstatusen kan träda i kraft helt, Efter lyckad inloggning kommer efterföljande förfrågningar att bära den nuvarande användarens cookie.
0×03 Utsedd röd kuvertteckning
Efter att ha loggat in på Weibo kan jag knappt vänta på att hitta ett rött kuvert att prova först, förstås först i webbläsaren. Till slut hittade jag en sida med en röd kuvertknapp, F12 kallade på felsökaren för att se vad datapaketet efterfrågade.

Du kan se att adressen till förfrågan är http://huodong.weibo.com/aj_hongbao/getlucky, det finns två huvudparametrar, en är ouid, det vill säga det röda kuvert-id:t, som kan ses i URL:en, den andra share-parametern avgör om den ska delas till Weibo, och det finns en _t jag vet inte vad den är till för.
Okej, teoretiskt sett kan du slutföra extraktionen av röda kuvert genom att skicka tre parametrar till denna URL, men när du faktiskt skickar in parametrarna kommer servern magiskt att returnera en sådan sträng åt dig:
[mw_shl_code=java, sant] {"code":303403,"msg":"Sorry, you doesn' permission to access this page","data":[]}[/mw_shl_code] Bli inte panikslagen just nu, enligt mina många års erfarenhet av webbutveckling bör den andra partens programmerare bedöma refereren, väldigt enkelt, kopiera alla headers från den tidigare förfrågan.
[mw_shl_code=java,true]def getLucky(id): #抽奖程序 skriv ut u"--- rita rött kuvert från:"+str(id)+"---" skriv ut "----------......----------" om checkValue(id)==False: #不符合条件, detta är 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, 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 det här fallet finns det inget problem i teorin, men faktiskt finns det inget problem. När lotteriåtgärden är klar måste vi bedöma statusen, och den returnerade res är en json-sträng, där koden är 100000 är framgångsrik, och om den är 90114 är det den övre gränsen för dagens lotteri, och de andra värdena misslyckas också, så:
[mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- har nått övre gränsen---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='100000':#成功 skriv ut u"---------Önskar dig välstånd---------" skriv ut "----------......----------"        log('success',str(id)+'---'+res) exit(0) if hbRes["data"] och hbRes["data"]["title"]: print hbRes["data"]["title"] print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"])annars: print u"---------Request error---------" print "----------......----------" log('lucky', str(id)+'---'+res)[/mw_shl_code], där logg också är en funktion jag anpassar, som används för att registrera loggar:
[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]





Föregående:Anteckningar om maximala gränser för PHP-uppladdning
Nästa:memcache dll-tillägg nedladdning för PHP5.2, 5.3, 5.4, 5.5
 Hyresvärd| Publicerad på 2015-02-13 22:46:37 |
0×04 Kryp igenom listan över röda kuvert
Efter ett lyckat test av en enda röd kuvertsamlingsåtgärd är det programmets kärnmodul för stora flytt – genom att genomsöka den röda kuvertlistan borde det finnas många metoder och ingångar för att genomsöka den röda kuvertlistan, såsom olika Weibo-sökord och så vidare, men jag använder den enklaste metoden här: att krypa den röda kuvertlistan.
På startsidan (http://huodong.weibo.com/hongbao av aktiviteten med det röda kuvertet, genom olika punkter kan allt observeras, även om listan är mycket kopplad kan den sammanfattas i två kategorier (förutom den rikaste röda kuvertlistan): tema och topplista.
Fortsätt att kalla på F12, analysera formatet på båda sidorna, med början i en lista över ämnesformer, såsom: http://huodong.weibo.com/hongbao/special_quyu
Du kan se att informationen om det röda kuvertet finns i en div som heter info_wrap, så vi behöver bara aktivera källkoden för denna sida, sedan ta alla infowraps och sedan helt enkelt bearbeta det för att få den röda kuvertlistan för denna sida, här behöver vi använda några 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">(.+?) <spänn klass="rob_txt">',</span> re. DOTALL) #h Hämta info_wrap den vanliga pInfo=re.compile(r'.+<em class="num">(.+)</em>.+<em class="num">(.+)</em>.+<em class="num">(.+).</em>.+href="(.+)" klass="btn"',re. DOTALL) #获取红包信息 List=pWrap.findall(html,re. DOTALL) n=len(List) om n==0: returnera för i i intervall(n): #traverse alla 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')) #礼品价值 förutom Exception, e:                        info[1]=float(info[1].replace('\xd2\xda','000000000')) #礼品价值 info[2]=float(info[2].replace('\xcd\xf2','0000')) #已发送 if info[2]==0: info[2]=1 #防止除数为0 om info[1]==0: info[1]=1 #防止除数为0 info.append(info[0]/(info[2]+info[1])) #红包价值, kontanter/(antal anspråkstagare + prisvärde) # om info[0]/(info[2]+info[1])>100:                # print url luckyList.append(info) om 'class="page"' i html:#存在下一页 p=p+1 getThemeList(url,p) #递归调用自己爬取下一页[/mw_shl_code]Det är så svårt att säga att det är så svårt, och det tog lång tid att skriva dessa två meningar. Det finns också en information i infon här bifogad [4], som är min algoritm för att grovt bedöma värdet på röda kuvert, varför göra det, eftersom det finns många röda kuvert men vi kan bara dra fyra gånger, i det enorma havet av väskor måste vi hitta de mest värdefulla röda kuverten och sedan dra dem, här är tre data som referens: kontantvärde, presentvärde och antal mottagare, uppenbarligen om pengarna är små och antalet personer som får många eller värdet på priset är superhögt (vissa är till och med galna i enheter av hundratals miljoner), Då är det inte värt att ta den, så jag höll tillbaka länge och kom till slut på en algoritm för att mäta vikten på röda kuvert: rött kuvertvärde = kontanter / (antal mottagare + prisvärde).
Principen för topplistans sida är densamma: hitta nyckeltaggarna och matcha dem regelbundet.
[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">(.+?) <spänn klassen="list_btn"></span>', re. DOTALL) #h Hämta list_info den vanliga pInfo=re.compile(r'.+<em class="num">(.+)</em>.+<em class="num">(.+)</em>.+<em class="num">(.+).</em>.+href="(.+)" klass="btn rob_btn"',re. DOTALL) #获取红包信息 List=pWrap.findall(html,re. DOTALL) n=len(List) om n==0: returnera för i i inom intervall(n): #Iterate genom alla 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','') #元->'' försök: info[1]=float(info[1].replace('\xcd\xf2','0000')) #礼品价值 förutom undantag, 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')) #已发送                If 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 mottagare + gåvovärde)                # if info[0]/(info[2]+info[1])>100: # skriv ut URL luckyList.append(info) om 'class="page"' i html:#存在下一页 p=p+1                getTopList (url, dagligen, p) #递归调用自己爬取下一页[/mw_shl_code]Okej, nu kan vi framgångsrikt genomsöka listan på de två specialsidorna, och nästa steg är att hämta listan med listor, det vill säga samlingen av alla dessa listadresser, och sedan ta dem en efter en:
[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=', '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'                } för (theme,url) i themeUrl.items(): print "----------"+theme+"----------" print url print "----------......----------"                getThemeList(url,1) för (top,url) i topUrl.items(): print "----------"+top+"----------" print url print "----------......----------"                getTopList(url,0,1) getTopList(url,1,1)[/mw_shl_code]
 Hyresvärd| Publicerad på 2015-02-13 22:47:13 |
0×05 Bedöm tillgången på röda kuvert
Detta är relativt enkelt: sök först efter nyckelord i källkoden för att se om det finns en röd kuvertgriparknapp, och gå sedan till samlingsrankingen för att se vilken post som är högst upptagen, om den högsta bara får några dollar, adjö......
Adressen för att se samlingsposten är http://huodong.weibo.com/aj_hongbao/detailmore?page=1&type=2&_t=0&__rnd=1423744829265&uid=Red Kuvert-ID

[mw_shl_code=java,true]def checkValue(id): infoUrl='http://huodong.weibo.com/hongbao/'+str(id) html=getData(infoUrl) om '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, som 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å alla list_info stamgäster luckyLog=pMoney.findall(html,re. DOTALL) om len(luckyLog)==0: maxMoney=0 annars: maxMoney=float(luckyLog[0]) om maxMoney <lägsta: #记录中最大红包小于设定值 returnera falskt annars: print u"--------- hand saktar ner---------" skriv ut "----------......----------" returnera false        återvänd True[/mw_shl_code]0×06 Färdigställande arbete
Huvudmodulerna är redan på plats, och nu måste alla steg kopplas i 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'):                         försök: f = fil('luckyList.txt') newList = [] newList = p.load(f)                                skriv ut u'--------- laddningslista---------' skriv ut "----------......----------" förutom undantag, e: skriv ut u' misslyckades med att tolka den lokala listan och genomsökte onlinesidan. ' print "----------......----------" gl=True ellers: print u' finns inte lokalt luckyList.txt genomsökning av onlinesidor. ' print "----------......----------" gl=True if gl==True: getList() från operator import itemgetter                newList=sorted(luckyList, key=itemgetter(4),reverse=True) f = file('luckyList.txt', 'w') p.dump(newList, f) #把抓到的列表存到文件里, så du behöver inte fånga f.close() för lucky in nästa gång newList: om inte 'http://huodong.weibo.com' i lucky[3]: #不是红包 fortsätt, skriv lucky[3] id=re.findall(r'(\w*[0-9]+)\w*',lucky[3])                getLucky(id[0])[/mw_shl_code] Eftersom det är mycket besvärligt att genomsöka den röda kuvertlistan upprepade gånger varje gång den testas, lade jag till ett stycke för att lägga in hela listan i filkoden, så att du kan läsa den lokala listan och ta det röda kuvertet i framtiden.
[mw_shl_code=java,true]om __name__ == "__main__": skriv ut u"------------------ Weibo Red Envelope Assistant------------------" skriv ut "---------------------v0.0.1---------------------" skriv ut u"------------- av @***----------------" skriv ut "-------------------------------------------------" försök: uname=raw_input(u"Vänligen ange ditt Weibo-konto: ".decode('utf-8').encode('gbk'))                pwd=raw_input(u"Vänligen ange ditt Weibo-lösenord: ".decode('utf-8').encode('gbk')) low=int(raw_input(u"Röd kuvert för att ta emot maximal kontant större än n: ".decode('utf-8').encode('gbk')))) fromfile=raw_input(u) Om man ska använda den röda kuvertlistan i luckyList.txt: (y/n) ".decode('utf-8').encode('gbk')) förutom undantag, e: print u" parameter error" print "----------......----------" print e                exit(0) skriv ut u"--------- program start---------" skriv ut "----------......----------" start(uname,pwd,low,fromfile) skriv ut u" --------- program end--------- "skriv ut "----------...... ----------" os.system('pause')[/mw_shl_code]
0×07 Nu kör vi!

0×07 Sammanfattning
Det grundläggande crawler-skelettet är i princip färdigt, faktiskt finns det fortfarande mycket utrymme för denna crawler att spela i många detaljer, som att modifiera den för att stödja batchinloggning, som att optimera algoritmen för det röda kuvertvärdet, koden borde också ha många platser att optimera, men med min förmåga uppskattar jag att jag kan få detta.
Till slut såg alla resultatet av programmet, jag skrev hundratals rader kod, tusentals ord artiklar, och allt jag kämpade hårt för att få var bara ett set tvåfärgade bollar, Nima pit dad, hur kan det vara en tvåfärgsboll!! (Berättare: Ju mer författaren pratade, desto mer exalterad blev han, och han grät faktiskt, och människorna runt omkring honom övertalade: Bror, det är inte så, är det inte bara ett Weibo-rött kuvert, igår gjorde mina händer ont, och jag skakade inte ut ett WeChat-rött kuvert.) )

Publicerad på 2015-02-14 07:14:33 |
Hur mycket pengar tog du i Loulou?
Publicerad på 2016-03-02 13:48:27 |
Ser så lång ut
Publicerad på 2016-03-07 12:51:02 |
Jag vet inte om det är allvarligt
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com