|
0×00 Vispārīga informācija
Kādas ir sarkanās aploksnes? Viņa brāļa dēls Huers teica: "Nauda ir gandrīz salīdzināma. Brālis un meita Dao Yun teica: "Vēja dēļ tas nav tik labi kā mana tante." "Visi saprot fonu, tas ir Jaunais gads, un tā ir diena, kad sarkanas aploksnes lido pa visām debesīm. Tas vienkārši notika, ka es iemācījos Python pirms divām dienām, un es biju vairāk satraukts, tāpēc es pētīju un pētīju Weibo sarkano aplokšņu rāpošanu, kāpēc Weibo sarkanās aploksnes, nevis Alipay sarkanās aploksnes, jo es saprotu tikai tīmekli, un, ja man ir enerģija, es nākotnē varu arī izpētīt whack-a-mole algoritmu. Tā kā es esmu iesācējs Python, šī programma ir arī trešā programma, ko es uzrakstīju pēc Python apguves, tāpēc, lūdzu, neuzspiediet personīgi, ja kodā ir kāda bedre, uzmanība tiek pievērsta idejai, labi, ja idejā ir kāda bedre, lūdzu, neuzspiediet to personīgi, jūs redzat, ka IE ir seja, lai iestatītu sevi kā noklusējuma pārlūkprogrammu, es rakstu arī putu rakstu ir pieņemams...... Es izmantoju Python 2.7, un tiek teikts, ka ir liela atšķirība starp Python 2 un Python 3.
0×01 Idejas Es biju pārāk slinks, lai to aprakstītu vārdos, tāpēc es uzzīmēju skici, un ikvienam vajadzētu to saprast.
Pirmkārt, vecais noteikums, vispirms iepazīstiniet ar bibliotēku, kurai jūs nezināt, ka tā ir noderīga, bet bez kuras nevar iztikt: [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] Pēc tam deklarējiet dažus citus mainīgos, kas jums būs jāizmanto vēlāk:
[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Šeit tiek izmantota RSA bibliotēka, kas pēc noklusējuma nav iekļauta Python. Nepieciešams to instalēt :https://pypi.python.org/pypi/rsa/
Pēc tā lejupielādes palaidiet setpy.py instalējiet un pēc tam mēs varam sākt izstrādes soļus.
0×02 Weibo pieteikšanās Sarkano aplokšņu satveršanas darbība jāveic pēc pieteikšanās, tāpēc ir jābūt pieteikšanās funkcijai, pieteikšanās nav atslēga, atslēga ir sīkdatņu saglabāšana, šeit ir nepieciešama cookielib sadarbība. [mw_shl_code=java,true]cj = cookielib. CookieJar()opener = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(atvērējs)[/mw_shl_code] Tādā veidā visas tīkla operācijas, izmantojot atvērēju, apstrādās sīkdatņu stāvokli, lai gan es par to daudz nezinu, bet tas jūtas pārsteidzoši. Tālāk mums ir jāiekapsulē divi moduļi, viens ir datu iegūšanas modulis, kas tiek izmantots, lai vienkārši iegūtu datus, un otrs tiek izmantots, lai ievietotu datus. [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') atgriezt tekstu, izņemot izņēmumu, e: print u' pieprasījuma izņēmums, 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() return text, izņemot Exception, e: print u'Request exception, url: '+url[/mw_shl_code] Izmantojot šos divus moduļus, mēs varam GET un POST datus, starp kuriem iemesls, kāpēc getData dekodē un pēc tam kodē, ir tāpēc, ka saskaņā ar Win7 es vienmēr izkropļoju izvadi, atkļūdojot, tāpēc es pievienoju kodēšanas apstrādi, tie nav punkts, zemāk esošā pieteikšanās funkcija ir Weibo pieteikšanās kodols. [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) atslēga = 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 (saderīgs; 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"--------- Pieteikšanās veiksmīga! ------- "drukāt" ----------......---------- "izņemot izņēmumu, e: drukāt u" --------- pieteikšanās neizdevās! -------" drukāt "----------......----------" exit(0)[/mw_shl_code]Parametri un šifrēšanas algoritmi šajā tiek kopēti no interneta, es ļoti labi nesaprotu, iespējams, vispirms ir jāpieprasa laika zīmogs un publiskā atslēga, pēc tam rsa šifrēšana un visbeidzot jāapstrādā apstrāde un jāiesniedz Sina pieteikšanās saskarnē, pēc veiksmīgas pieteikšanās no Sina tas atgriezīs Weibo adresi, jums tas ir jāpieprasa, lai pieteikšanās statuss varētu stāties spēkā pilnībā, Pēc veiksmīgas pieteikšanās nākamajos pieprasījumos tiks iekļauta pašreizējā lietotāja sīkdatne.
0×03 Apzīmēts sarkanas aploksnes zīmējums Pēc veiksmīgas pieteikšanās Weibo es nevaru sagaidīt, kad atradīšu sarkanu aploksni, lai vispirms to izmēģinātu, protams, vispirms pārlūkprogrammā. Visbeidzot, es atradu lapu ar sarkanu aploksnes pogu, F12 izsauca atkļūdotāju, lai redzētu, ko datu pakete pieprasa.
Jūs varat redzēt, ka pieprasījuma adrese ir http://huodong.weibo.com/aj_hongbao/getlucky, ir divi galvenie parametri, viens ir ouid, tas ir, sarkanais aploksnes ID, ko var redzēt URL, otrs koplietošanas parametrs nosaka, vai to kopīgot ar Weibo, un ir _t es nezinu, kam tas paredzēts. Labi, tagad teorētiski jūs varat pabeigt sarkano aplokšņu iegūšanu, iesniedzot trīs parametrus šajā URL, bet, faktiski iesniedzot parametrus, jūs atradīsit, ka serveris maģiski atgriezīs šādu virkni: [mw_shl_code=java,true] {"code":303403,"msg":"Atvainojiet, jums nav atļaujas piekļūt šai lapai","data":[]}[/mw_shl_code] Šobrīd nekrītiet panikā, saskaņā ar manu daudzu gadu tīmekļa izstrādes pieredzi, otras puses programmētājam vajadzētu spriest par atsauci, ļoti vienkārši, nokopējiet visas iepriekšējā pieprasījuma galvenes. [mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- zīmēt sarkanu aploksni no:"+str(id)+"---" print "----------......----------" if checkValue(id)==False: #不符合条件, šī ir funkcija atgriezties vēlāk 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, piemēram, Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(luckyUrl,param, galvene)[/mw_shl_code] Šajā gadījumā teorētiski nav problēmu, bet patiesībā problēmas nav. Pēc loterijas darbības pabeigšanas mums ir jāspriež par statusu, un atgrieztā izšķirtspēja ir json virkne, kur kods ir 100000 ir veiksmīgs, un, ja tas ir 90114, tā ir šodienas loterijas augšējā robeža, un arī pārējās vērtības neizdodas, tātad: [mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- ir sasniedzis augšējo robežu---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='100000':#成功 print u"---------Novēlu jums labklājību---------" print "----------......----------" log('success',str(id)+'---'+res) exit(0) if hbRes["data"] un 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], kur log ir arī funkcija, kuru es pielāgoju, kas tiek izmantota žurnālu ierakstīšanai: [mw_shl_code=java,true]def log(tips,teksts): fp = open(tips+'.txt','a') fp.write(teksts) fp.write('\r\n') fp.close()[/mw_shl_code]
|