|
0×00 Hintergrund
Wie sind die roten Umschläge? Der Sohn seines Bruders, Huer, sagte: "Das Geld ist fast vergleichbar. Bruder und Tochter Dao Yun sagten: "Es ist nicht so gut wie meine Tante wegen des Windes." "Jeder versteht den Hintergrund, es ist Neujahr, und es ist der Tag, an dem rote Umschläge am Himmel fliegen. Zufällig habe ich vor zwei Tagen Python gelernt und war begeisterter, also habe ich das Crawlen von Weibo-roten Umschlägen immer wieder studiert, warum Weibo-rote Umschläge statt Alipay-rote Umschläge, weil ich nur das Web verstehe, und wenn ich die Energie habe, könnte ich in Zukunft auch den Whack-a-Mole-Algorithmus studieren. Da ich ein Anfänger in Python bin, ist dieses Programm auch das dritte Programm, das ich nach dem Erlernen von Python geschrieben habe, also fragt bitte nicht persönlich nach, ob es eine Grube im Code gibt, der Fokus liegt auf der Idee. Wenn es eine Grube in der Idee gibt, dann steckt sie bitte nicht persönlich an, ihr seht, IE hat das Gesicht, sich als Standardbrowser selbst einzustellen, ich schreibe einen schlechten Artikel, das ist auch akzeptabel...... Ich benutze Python 2.7, und es wird gesagt, dass es einen großen Unterschied zwischen Python 2 und Python 3 gibt.
0×01 Ideen Ich war zu faul, es in Worte zu fassen, also habe ich eine Skizze gezeichnet, und jeder sollte es verstehen können.
Zunächst einmal die alte Regel: Führe zuerst eine Bibliothek ein, von der du nicht weißt, dass sie nützlich ist, auf die du aber nicht verzichten kannst: [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] Dann deklariere einige weitere Variablen, die du später verwenden musst:
[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Hier wird eine rsa-Bibliothek verwendet, die standardmäßig nicht in Python enthalten ist. Muss es installieren :https://pypi.python.org/pypi/rsa/
Nach dem Herunterladen führen wir setpy.py Installation durch und dann können wir mit den Entwicklungsschritten beginnen.
0×02 Weibo-Login Das Greifen roter Umschläge muss nach dem Einloggen erfolgen, daher muss es eine Login-Funktion geben; der Login ist nicht der Schlüssel, der Schlüssel ist die Aufbewahrung von Cookies, hier ist die Zusammenarbeit mit der Cookielib erforderlich. [mw_shl_code=java,true]cj = cookielib. CookieJar()opener = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(Opener)[/mw_shl_code] Auf diese Weise werden alle Netzwerkoperationen mit Opener den Zustand der Cookies behandelt, auch wenn ich nicht viel darüber weiß, aber es fühlt sich großartig an. Als Nächstes müssen wir zwei Module kapseln, eines ist das Datenerfassungsmodul, das einfach zum HER-Daten verwendet wird, und das andere zum POST-Daten. [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') gibt Text außer Ausnahme zurück, z.B.: 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() zurück Text außer Ausnahme, z.B.: print u'Request exception, URL: '+url[/mw_shl_code] Mit diesen beiden Modulen können wir Daten GET und POSTEN, wobei der Grund, warum getData decodiert und dann kodiert, darin besteht, dass ich unter Win7 beim Debuggen immer die Ausgabe vermasselt habe, also habe ich etwas Codierungsverarbeitung hinzugefügt, das ist nicht der Punkt, die untenstehende Login-Funktion ist der Kern des Weibo-Logins. [mw_shl_code=java,true]Def Login(Nick, PWD): Drucken u"----------login----------" drucken Sie "----------......----------" 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, '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) drucken u"--------- Anmeldung erfolgreich! ------- "drucken" ----------......---------- "außer Ausnahme, z.B.: drucken u" --------- Login fehlgeschlagen! -------" druckt "----------......----------" exit(0)[/mw_shl_code] Die Parameter und Verschlüsselungsalgorithmen sind aus dem Internet kopiert, ich verstehe das nicht so gut, wahrscheinlich geht es darum, zuerst einen Zeitstempel und einen öffentlichen Schlüssel anzufordern, dann eine RSA-Verschlüsselung durchzuführen und schließlich die Verarbeitung zu verarbeiten und an die Sina-Login-Schnittstelle zu senden. Nach erfolgreicher Anmeldung von Sina aus wird eine Weibo-Adresse zurückgegeben, die man anfordern muss, damit der Login-Status vollständig wirksam wird, Nach erfolgreichem Login enthalten nachfolgende Anfragen das Cookie des aktuellen Benutzers.
0×03 Designierte rote Umschlagzeichnung Nachdem ich mich erfolgreich bei Weibo eingeloggt habe, kann ich es kaum erwarten, zuerst einen roten Umschlag zu finden, um es natürlich zuerst im Browser auszuprobieren. Schließlich fand ich eine Seite mit einem roten Umschlag-Button, F12 rief den Debugger herbei, um zu sehen, was das Datenpaket anforderte.
Du siehst, dass die Adresse der Anfrage http://huodong.weibo.com/aj_hongbao/getlucky ist, es gibt zwei Hauptparameter: einer ist Ouid, also die rote Envelope-ID, die in der URL zu sehen ist, der andere Share-Parameter bestimmt, ob man sie an Weibo teilt, und es gibt eine _t Ich weiß nicht, wofür sie ist. Okay, theoretisch können Sie die Extraktion der roten Umschläge abschließen, indem Sie drei Parameter an diese URL eingeben, aber wenn Sie die Parameter tatsächlich eingeben, werden Sie feststellen, dass der Server Ihnen auf magische Weise eine solche Zeichenkette zurückgibt: [mw_shl_code=java, wahr] {"code":303403,"msg":"Entschuldigung, Sie haben keine Berechtigung, auf diese Seite zuzugreifen","data":[]}[/mw_shl_code] Keine Panik, laut meiner vielen Jahre Erfahrung in der Webentwicklung sollte der Programmierer der Gegenseite den Referenten beurteilen, ganz einfach: Kopieren Sie alle Header der vorherigen Anfrage. [mw_shl_code=java,true]def getLucky(id): #抽奖程序 drucke u"--- ziehe roten Umschlag von:"+str(id)+"---" drucke "----------......----------" wenn checkValue(id)==False: #不符合条件, das ist die Funktion 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, wie 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 diesem Fall gibt es theoretisch kein Problem, aber tatsächlich gibt es kein Problem. Nachdem die Lotterieaktion abgeschlossen ist, müssen wir den Status beurteilen, und die zurückgegebene Res ist eine JSON-Zeichenkette, wobei der Code 100000 erfolgreich ist, und wenn es 90114 ist, ist dies das obere Limit der heutigen Lotterie, und die anderen Werte sind ebenfalls fehlgeschlagen, also: [mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 drücke u"--------- hat das obere Limit erreicht---------" drucke "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='100000':#成功 drucken u"---------Ich wünsche dir Wohlstand---------" drucke "----------......----------" log('success',str(id)+'---'+res) exit(0) if hbRes["data"] und 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], wobei das Log ebenfalls eine Funktion ist, die ich anpasse und die zur Aufzeichnung von Logs verwendet wird: [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]
|