|
|
Geplaatst op 13-02-2015 22:44:10
|
|
|
|

|
0×00 Achtergrond
Hoe zijn de rode enveloppen? De zoon van zijn broer, Huer, zei: "Het geld is bijna vergelijkbaar. De broer en dochter Dao Yun zeiden: "Het is niet zo goed als mijn tante vanwege de wind." "Iedereen begrijpt de achtergrond, het is het nieuwe jaar, en het is de dag waarop rode enveloppen overal aan de hemel vliegen. Het toeval wilde dat ik twee dagen geleden Python heb geleerd, en ik was enthousiaster, dus heb ik het kruipen van Weibo rode enveloppen bestudeerd, waarom Weibo rode enveloppen in plaats van Alipay rode enveloppen, omdat ik alleen het web begrijp, en als ik de energie heb, misschien ook het whack-a-mole algoritme in de toekomst bestudeer. Omdat ik een beginner ben in Python, is dit ook het derde programma dat ik schreef nadat ik Python had geleerd, dus grap alsjeblieft niet persoonlijk of er een put in de code zit, de focus ligt op het idee, nou, als er een put in zit, prikje er dan niet persoonlijk in, je ziet dat IE zichzelf als standaardbrowser kan instellen, ik schrijf een slecht artikel is ook acceptabel...... Ik gebruik Python 2.7, en er wordt gezegd dat er een groot verschil is tussen Python 2 en Python 3.
0×01 Ideeën Ik was te lui om het in woorden te beschrijven, dus maakte ik een schets, en iedereen zou het moeten begrijpen.
Allereerst de oude regel: introduceer eerst een bibliotheek waarvan je niet weet dat die nuttig is, maar waar je niet zonder kunt: [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] Verklaar vervolgens nog wat andere variabelen die je later moet gebruiken:
[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Hier wordt een rsa-bibliotheek gebruikt, die standaard niet in Python is opgenomen. Moet het installeren :https://pypi.python.org/pypi/rsa/
Na het downloaden setpy.py installatie uitvoeren en dan kunnen we beginnen met de ontwikkelprocessen.
0×02 Weibo-login De handeling van het pakken van rode enveloppen moet na het inloggen worden uitgevoerd, dus er moet een inlogfunctie zijn; inloggen is niet de sleutel, de sleutel is het bewaren van cookies, hier is de medewerking van cookielib vereist. [mw_shl_code=Java,True]CJ = cookielib. CookieJar()opener = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(opener)[/mw_shl_code] Op deze manier zullen alle netwerkoperaties met opener de status van cookies afhandelen, hoewel ik er niet veel van weet, maar het voelt geweldig. Vervolgens moeten we twee modules inkapselen: één is de data-acquisitiemodule, die simpelweg wordt gebruikt om data te VERKRIJGEN, en de andere om data te POSTEN. [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",'negeer') retour tekst behalve uitzondering, 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() retour tekst behalve uitzondering, e: print u'Request exception, url: '+url[/mw_shl_code] Met deze twee modules kunnen we data KRIJGEN en POSTEN, waarvan de reden waarom getData decodeert en vervolgens codeert is omdat ik onder Win7 altijd de output verwar bij het debuggen, dus heb ik wat coderingsverwerking toegevoegd, maar dat is niet het punt, de inlogfunctie hieronder is de kern van Weibo-login. [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 (compatibel; 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"--------- Login geslaagd! ------- "print" ----------......---------- "behalve uitzondering, bijv: print u" --------- login mislukt! -------" print "----------......----------" exit(0)[/mw_shl_code] De parameters en encryptie-algoritmen hierin zijn gekopieerd van het internet, ik begrijp het niet zo goed, waarschijnlijk is het om eerst een tijdstempel en publieke sleutel aan te vragen, dan rsa-encryptie en uiteindelijk de verwerking te verwerken en deze in te dienen bij de Sina logininterface, na succesvol inloggen vanuit Sina geeft het een Weibo-adres terug, je moet het aanvragen zodat de loginstatus volledig van kracht kan worden, Na succesvolle login zullen volgende verzoeken de cookie van de huidige gebruiker bevatten.
0×03 Aangewezen rode enveloppetekening Na succesvol in te loggen op Weibo, kan ik niet wachten om eerst een rode envelop te vinden om het eerst te proberen, natuurlijk eerst in de browser. Uiteindelijk vond ik een pagina met een rode envelopknop, F12 riep de debugger op om te zien wat het datapakket opvroeg.
Je kunt zien dat het adres van het verzoek http://huodong.weibo.com/aj_hongbao/getlucky is, er zijn twee hoofdparameters: één is ouid, dat wil zeggen het rode envelope id, dat is te zien in de URL, de andere share-parameter bepaalt of het gedeeld moet worden naar Weibo, en er is een _t waar ik niet weet waar het voor is. Oké, theoretisch kun je de extractie van rode enveloppen voltooien door drie parameters aan deze URL te geven, maar wanneer je de parameters daadwerkelijk invoert, zul je merken dat de server op magische wijze zo'n string voor je teruggeeft: [mw_shl_code=Java, waar] {"code":303403,"msg":"Sorry, je hebt geen toestemming om deze pagina te openen","data":[]}[/mw_shl_code] Raak nu niet in paniek, volgens mijn jarenlange ervaring in webontwikkeling zou de programmeur van de andere partij de referer moeten beoordelen, heel simpel, kopieer alle headers van het vorige verzoek. [mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- teken rode envelop van:"+str(id)+"---" print "----------......----------" als checkValue(id)==False: #不符合条件, dit is de functie 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, zoals Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(luckyUrl,param, header)[/mw_shl_code] In dit geval is er in theorie geen probleem, maar in feite is er geen probleem. Nadat de loterijactie is voltooid, moeten we de status beoordelen, en de teruggegeven res is een json-string, waarbij de code 100000 succesvol is, en als het 90114 is, is dit de bovengrens van de huidige loterij, en de andere waarden zijn ook mislukt, dus: [mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- heeft de bovengrens bereikt---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='100000':#成功 print u"---------Wishing you prosperity---------" print "----------......----------" log('succes',str(id)+'---'+res) exit(0) if hbRes["data"] en hbRes["data"]["title"]: print hbRes["data"]["title"] print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"])anders: print u"---------Request error---------" print "----------......----------" log('lucky', str(id)+'---'+res)[/mw_shl_code], waarbij log ook een functie is die ik aanpas, en die wordt gebruikt om logs vast te leggen: [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]
|
Vorig:Notities over PHP-uploadlimietenVolgend:memcache dll-extensie download voor PHP5.2, 5.3, 5.4, 5.5
|