|
|
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-uppladdningNästa:memcache dll-tillägg nedladdning för PHP5.2, 5.3, 5.4, 5.5
|