|
0×00 Pozadí
Jaké jsou ty červené obálky? Syn jeho bratra, Huer, řekl: "Peníze jsou téměř srovnatelné. Bratr a dcera Dao Yun řekli: "Není to tak dobré jako u mé tety kvůli větru." "Všichni chápou pozadí, je Nový rok a je den, kdy červené obálky létají po celé obloze. Náhodou jsem se před dvěma dny naučil Python a byl jsem nadšenější, takže jsem studoval a studoval prolézání červených obálek na Weibo, proč červené obálky na Weibo místo červených z Alipay, protože rozumím jen webu, a pokud budu mít energii, možná se v budoucnu začnu učit i algoritmus "vráť krtka". Protože jsem začátečník v Pythonu, je to také třetí program, který jsem napsal po naučení Pythonu, takže prosím neptejte se osobně, pokud je v kódu nějaká chyba, důraz je na samotný nápad, ale pokud je v tom nějaká vada, prosím, nezkoušejte to osobně, vidíte, IE má tu tvář, že se nastaví jako výchozí prohlížeč, a když napíšu článek o špíně, je to také přijatelné...... Používám Python 2.7 a říká se, že mezi Pythonem 2 a Pythonem 3 je velký rozdíl.
0×01 Nápady Byl jsem příliš líný to popsat slovy, tak jsem nakreslil skicu a všichni by to měli být schopni pochopit.
Za prvé, staré pravidlo: nejprve představte knihovnu, o které nevíte, že je užitečná, ale bez ní se nemůžete obejít – [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] Pak deklarujte další proměnné, které budete později potřebovat:
[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Zde se používá knihovna rsa, která není ve výchozím nastavení v Pythonu. Musím to nainstalovat :https://pypi.python.org/pypi/rsa/
Po stažení ho spustíme setpy.py nainstalujeme a pak můžeme začít s vývojem.
0×02 Přihlášení na Weibo Akce uchopení červených obálek musí být provedena po přihlášení, takže musí existovat funkce přihlašování, přihlášení není klíč, klíčem je uchovávání cookies, zde je vyžadována spolupráce 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 způsobem všechny síťové operace pomocí openeru zvládnou stav cookies, i když o tom moc nevím, ale je to úžasný pocit. Dále musíme zapouzdřit dva moduly, jeden je modul pro sběr dat, který slouží jednoduše k získání dat, a druhý pro POST 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",'ignore') vrátit text kromě výjimky, 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() vrať text kromě výjimky, e: print u'Request exception, url: '+url[/mw_shl_code] S těmito dvěma moduly můžeme GET a POST data, přičemž důvod, proč getData dekóduje a pak kóduje, je ten, že ve Win7 jsem při ladění vždy zkresloval výstup, takže jsem přidal nějaké zpracování kódování, ale to není podstatné, funkce přihlášení níže je jádrem Weibo přihlášení. [mw_shl_code=java,true]def login(nick, pwd): tisknout u"----------login----------" tisknout "----------......----------" 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) zprá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"--------- Přihlášení úspěšné! ------- "tisknout" ----------......---------- "kromě výjimky, e: vytisknout u" --------- přihlášení selhalo! -------" vytisknout "----------......----------" exit(0)[/mw_shl_code] Parametry a šifrovací algoritmy v tomto jsou zkopírované z internetu, moc tomu nerozumím, pravděpodobně je potřeba nejprve požádat o časové razítko a veřejný klíč, pak o RSA šifrování a nakonec zpracovat zpracování a odesílat do přihlašovacího rozhraní Sina, po úspěšném přihlášení ze Sina se vrátí Weibo adresa, kterou musíte požádat, aby se stav přihlášení plně uplatnil, Po úspěšném přihlášení budou další požadavky obsahovat cookie aktuálního uživatele.
0×03 Označený červený obrázek obálky Po úspěšném přihlášení na Weibo se nemůžu dočkat, až najdu červenou obálku, kterou si to zkusím jako první, samozřejmě nejdřív v prohlížeči. Nakonec jsem našel stránku s červeným tlačítkem obálky, F12 vyvolal debugger, aby zjistil, co datový paket požaduje.
Vidíte, že adresa požadavku je http://huodong.weibo.com/aj_hongbao/getlucky, jsou tam dva hlavní parametry, jeden je ouid, tedy červené ID obálky, které je vidět v URL, druhý parametr share určuje, zda ho sdílet s Weibo, a je tu _t, ke kterému nevím, k čemu slouží. Dobře, teoreticky můžete extrakci červených obálek dokončit zadáním tří parametrů do této URL, ale když parametry skutečně odešlete, zjistíte, že server vám zázračně vrátí takový řetězec: [mw_shl_code=java, pravda] {"code":303403,"msg":"Omlouváme se, nemáte povolení k přístupu na tuto stránku","data":[]}[/mw_shl_code] Nepanikařte, podle mých mnohaletých zkušeností s webovým vývojem by měl programátor druhé strany posoudit referer, velmi jednoduše – zkopírovat všechny hlavičky předchozího požadavku. [mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- draw red envelope from:"+str(id)+"---" print "----------......----------" if checkValue(id)==False: #不符合条件, toto je funkce return později 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, podobně jako 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 případě teoreticky problém neexistuje, ale ve skutečnosti žádný problém není. Po dokončení loterijní akce musíme posoudit stav a vrácená res je řetězec json, kde kód je 100000 je úspěšný, a pokud je to 90114, je to horní limit dnešní loterie, a ostatní hodnoty jsou také nesplněny, takže: [mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- dosáhl horní hranice---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='1000000':#成功 print u"---------Přeji vám prosperitu---------" print "----------......----------" log('success',str(id)+'---'+res) exit(0) if hbRes["data"] a hbRes["data"]["title"]: tisk hbRes["data"]["title"] tisk "----------......----------" 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 také funkce, kterou si přizpůsobuji a která slouží k zaznamenávání 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]
|