|
0×00 Pozadie
Aké sú tie červené obálky? Syn jeho brata, Huer, povedal: "Peniaze sú takmer porovnateľné. Brat a dcéra Dao Yun povedali: "Nie je to také dobré ako u mojej tety kvôli vetru." "Všetci chápu pozadie, je Nový rok a je deň, keď červené obálky lietajú po celej oblohe. Práve sa stalo, že som sa pred dvoma dňami naučil Python a bol som viac nadšený, tak som študoval a študoval prehľadávanie Weibo červených obálok, prečo Weibo červené obálky namiesto Alipay červených, pretože rozumiem len webu, a ak budem mať energiu, možno sa v budúcnosti venujem aj algoritmu whack-a-mole. Keďže som začiatočník v Pythone, tento program je tiež tretí program, ktorý som napísal po tom, čo som sa naučil Python, takže prosím, nepýtajte sa osobne, ak je v kóde nejaká chyba, zameranie je na samotnú myšlienku, no, ak je v nápade nejaká chyba, prosím, nerobte to osobne, vidíte, IE má tvár na to, aby sa nastavil ako predvolený prehliadač, a ak napíšem nekvalitný článok, je to tiež v poriadku...... Používam Python 2.7 a hovorí sa, že medzi Pythonom 2 a Pythonom 3 je veľký rozdiel.
0×01 Nápady Bol som príliš lenivý to opísať slovami, tak som nakreslil skicu a každý by to mal vedieť pochopiť.
V prvom rade staré pravidlo, najprv predstavte knižnicu, o ktorej neviete, že je užitočná, ale bez nej sa nemôžete zaobísť: [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] Potom deklarujte ďalšie premenné, ktoré budete musieť neskôr použiť:
[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Tu sa používa knižnica rsa, ktorá nie je v Pythone štandardne zahrnutá. Musím to nainštalovať :https://pypi.python.org/pypi/rsa/
Po stiahnutí spustiť setpy.py nainštalovať a potom môžeme začať vývojové kroky.
Prihlásenie na Weibo 0×02 Akcia uchopenia červených obálok musí byť vykonaná po prihlásení, takže musí existovať prihlasovacia funkcia, prihlásenie nie je kľúč, kľúčom je uchovávanie cookies, tu je potrebná spolupráca cookielib. [mw_shl_code=java,true]cj = cookielib. CookieJar()opener = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(opener)[/mw_shl_code] Týmto spôsobom všetky sieťové operácie pomocou otvárača spracujú stav cookies, hoci o tom veľa neviem, ale je to úžasný pocit. Ďalej musíme zapuzdriť dva moduly, jeden je modul na získavanie dát, ktorý slúži len na získavanie dát, a druhý na POST dát. [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') vráť text okrem výnimky, 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) výsledok = opener.open(req) text = result.read() vráť text okrem výnimky, e: print u'Request exception, url: '+url[/mw_shl_code] S týmito dvoma modulmi môžeme GET a POST dáta GET, pričom dôvod, prečo getData dekóduje a potom kóduje, je ten, že pod Win7 som pri ladení vždy skreslil výstup, tak som pridal nejaké spracovanie kódovania, ale to nie je podstatné, funkcia prihlásenia nižšie je jadrom Weibo prihlásenia. [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) správa = str(servertime) +'\t' + str(nonce) + '\n' + str(pwd) sp = binascii.b2a_hex(rsa.encrypt(message,key)) hlavička = {'User-Agent' : 'Mozilla/5.0 (kompatibilné; 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"--------- Prihlásenie úspešné! ------- "print" ----------......---------- "okrem výnimky, e: print u" --------- prihlásenie zlyhalo! -------" vytlačiť "----------......----------" exit(0)[/mw_shl_code] Parametre a šifrovacie algoritmy v tomto sú skopírované z internetu, veľmi tomu nerozumiem, pravdepodobne ide najprv o požiadanie o časovú pečiatku a verejný kľúč, potom o RSA šifrovanie a nakoniec spracovanie a odoslanie do prihlasovacieho rozhrania Sina, po úspešnom prihlásení zo Sina vráti Weibo adresu, ktorú musíte požiadať, aby sa stav prihlásenia mohol úplne uplatniť, Po úspešnom prihlásení budú ďalšie požiadavky obsahovať cookies aktuálneho používateľa.
0×03 Označený červený obálkový výkres Po úspešnom prihlásení na Weibo sa už neviem dočkať, kedy nájdem červenú obálku, ktorú si môžem najskôr vyskúšať, samozrejme najprv v prehliadači. Nakoniec som našiel stránku s červeným tlačidlom obálky, F12 vyvolal debugger, aby zistil, čo dátový paket požaduje.
Vidíte, že adresa požiadavky je http://huodong.weibo.com/aj_hongbao/getlucky, sú tam dva hlavné parametre, jeden je ouid, teda červené ID obálky, ktoré je viditeľné v URL, druhý parameter share určuje, či ho zdieľať na Weibo, a je tu _t neviem, na čo slúži. Dobre, teoreticky môžete extrakciu červených obálok dokončiť zadaním troch parametrov do tejto URL, ale keď parametre skutočne odáte, server vám zázračne vráti takýto reťazec: [mw_shl_code=java, pravda] {"code":303403,"msg":"Prepáčte, nemáte povolenie na prístup na túto stránku","data":[]}[/mw_shl_code] Nepanikárte teraz, podľa mojich mnohých skúseností s webovým vývojom by mal programátor druhej strany posúdiť referer, veľmi jednoducho, skopírovať všetky hlavičky predchádzajúcej požiadavky. [mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- draw red envelope from:"+str(id)+"---" print "----------......----------" if checkValue(id)==False: #不符合条件, toto je funkcia return neskôr 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, podobne ako Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(luckyUrl,param, hlavička)[/mw_shl_code] V tomto prípade teoreticky nie je problém, ale v skutočnosti žiadny problém neexistuje. Po dokončení lotériovej akcie musíme posúdiť stav a vrátený res je json reťazec, kde kód je 100000 je úspešný, a ak je to 90114, je to horná hranica dnešnej lotérie a ostatné hodnoty sú tiež neúspešné, takže: [mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- dosiahol hornú hranicu---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='100000':#成功 print u"---------Prajeme ti šťastie---------" print "----------......----------" log('success',str(id)+'---'+res) exit(0) if hbRes["data"] a 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], kde log je tiež funkcia, ktorú prispôsobujem a ktorá sa používa na zaznamenávanie logov: [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]
|