|
|
Δημοσιεύτηκε στις 13/2/2015 10:44:10 μ.μ.
|
|
|
|

|
0×00 Ιστορικό
Πώς είναι οι κόκκινοι φάκελοι; Ο γιος του αδελφού του, Huer, είπε: «Τα χρήματα είναι σχεδόν συγκρίσιμα. Ο αδερφός και η κόρη Ντάο Γιουν είπαν: «Δεν είναι τόσο καλό όσο η θεία μου λόγω του ανέμου». «Όλοι καταλαβαίνουν το φόντο, είναι η Πρωτοχρονιά και είναι η μέρα που κόκκινοι φάκελοι πετούν σε όλο τον ουρανό. Έτυχε να μάθω Python πριν από δύο μέρες και ήμουν πιο ενθουσιασμένος, οπότε μελέτησα και μελέτησα την ανίχνευση των κόκκινων φακέλων του Weibo, γιατί κόκκινοι φάκελοι Weibo αντί για κόκκινους φακέλους Alipay, γιατί καταλαβαίνω μόνο τον Ιστό, και αν έχω την ενέργεια, μπορεί επίσης να μελετήσω τον αλγόριθμο whack-a-mole στο μέλλον. Επειδή είμαι αρχάριος στην Python, αυτό το πρόγραμμα είναι επίσης το τρίτο πρόγραμμα που έγραψα αφού έμαθα την Python, οπότε παρακαλώ μην τρυπάτε αυτοπροσώπως εάν υπάρχει κάποιο λάκκο στον κώδικα, η εστίαση είναι στην ιδέα, καλά, αν υπάρχει κάποιο λάκκο στην ιδέα, παρακαλώ μην το σπρώχνετε αυτοπροσώπως, βλέπετε ότι ο IE έχει το πρόσωπο να ορίσει τον εαυτό του ως το προεπιλεγμένο πρόγραμμα περιήγησης, γράφω ένα άρθρο αποβρασμάτων είναι επίσης αποδεκτό...... Χρησιμοποιώ την Python 2.7 και λέγεται ότι υπάρχει μεγάλη διαφορά μεταξύ της Python 2 και της Python 3.
0×01 Ιδέες Ήμουν πολύ τεμπέλης για να το περιγράψω με λόγια, οπότε σχεδίασα ένα σκίτσο και όλοι θα έπρεπε να μπορούν να το καταλάβουν.
Πρώτα απ 'όλα, ο παλιός κανόνας, εισαγάγετε πρώτα μια βιβλιοθήκη για την οποία δεν γνωρίζετε ότι είναι χρήσιμη αλλά δεν μπορείτε να κάνετε χωρίς: [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] Στη συνέχεια, δηλώστε κάποιες άλλες μεταβλητές που θα χρειαστεί να χρησιμοποιήσετε αργότερα:
[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Εδώ χρησιμοποιείται μια βιβλιοθήκη rsa, η οποία δεν περιλαμβάνεται στην Python από προεπιλογή. Πρέπει να το εγκαταστήσετε :https://pypi.python.org/pypi/rsa/
Αφού το κατεβάσετε, εκτελέστε setpy.py εγκατάσταση και, στη συνέχεια, μπορούμε να ξεκινήσουμε τα βήματα ανάπτυξης.
0×02 Είσοδος στο Weibo Η ενέργεια της αρπαγής κόκκινων φακέλων πρέπει να πραγματοποιηθεί μετά τη σύνδεση, επομένως πρέπει να υπάρχει λειτουργία σύνδεσης, η σύνδεση δεν είναι το κλειδί, το κλειδί είναι η διατήρηση των cookies, εδώ απαιτείται η συνεργασία του cookielib. [mw_shl_code=java,true]cj = cookielib. CookieJar()opener = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(opener)[/mw_shl_code] Με αυτόν τον τρόπο, όλες οι λειτουργίες δικτύου που χρησιμοποιούν το opener θα χειρίζονται την κατάσταση των cookies, αν και δεν γνωρίζω πολλά για αυτό, αλλά είναι καταπληκτικό. Στη συνέχεια, πρέπει να ενσωματώσουμε δύο ενότητες, η μία είναι η μονάδα απόκτησης δεδομένων, η οποία χρησιμοποιείται για την απλή ΛΗΨΗ δεδομένων και η άλλη χρησιμοποιείται για την ΑΝΑΡΤΗΣΗ δεδομένων. [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') κείμενο επιστροφής εκτός από την Εξαίρεση, π.χ.: 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() return text except Exception, e: print u'Request exception, url: '+url[/mw_shl_code] Με αυτές τις δύο ενότητες, μπορούμε να ΛΗΨΟΥΜΕ και να ΑΝΑΡΤΗΣΟΥΜΕ δεδομένα, μεταξύ των οποίων ο λόγος για τον οποίο το getData αποκωδικοποιεί και στη συνέχεια κωδικοποιεί είναι επειδή στο Win7 πάντα αλλοίωνα την έξοδο κατά τον εντοπισμό σφαλμάτων, οπότε πρόσθεσα κάποια επεξεργασία κωδικοποίησης, δεν είναι αυτά το θέμα, η παρακάτω λειτουργία σύνδεσης είναι ο πυρήνας της σύνδεσης στο Weibo. [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) κλειδί = 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 (συμβατό; MSIE 9.0; Windows NT 6.1; ΟΥΑΟΥ64; 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"--------- Η σύνδεση ήταν επιτυχής! ------- "print" ----------......---------- "εκτός από την εξαίρεση, e: print u" --------- η σύνδεση απέτυχε! -------" print "----------......----------" exit(0)[/mw_shl_code]Οι παράμετροι και οι αλγόριθμοι κρυπτογράφησης σε αυτό αντιγράφονται από το Διαδίκτυο, δεν καταλαβαίνω πολύ καλά, μάλλον είναι να ζητήσετε πρώτα μια χρονική σήμανση και δημόσιο κλειδί, μετά κρυπτογράφηση rsa και τέλος να επεξεργαστείτε την επεξεργασία και να την υποβάλετε στη διεπαφή σύνδεσης Sina, μετά την επιτυχή σύνδεση από τη Sina, θα επιστρέψει μια διεύθυνση Weibo, πρέπει να τη ζητήσετε, ώστε η κατάσταση σύνδεσης να τεθεί σε ισχύ πλήρως, Μετά την επιτυχή σύνδεση, τα επόμενα αιτήματα θα φέρουν το cookie του τρέχοντος χρήστη.
0×03 Καθορισμένο σχέδιο κόκκινου φακέλου Αφού συνδεθώ με επιτυχία στο Weibo, ανυπομονώ να βρω έναν κόκκινο φάκελο για να τον δοκιμάσω πρώτα, φυσικά, πρώτα στο πρόγραμμα περιήγησης. Τελικά, βρήκα μια σελίδα με ένα κόκκινο κουμπί φακέλου, το F12 κάλεσε το πρόγραμμα εντοπισμού σφαλμάτων για να δει τι ζητούσε το πακέτο δεδομένων.
Μπορείτε να δείτε ότι η διεύθυνση του αιτήματος είναι http://huodong.weibo.com/aj_hongbao/getlucky, υπάρχουν δύο κύριες παράμετροι, η μία είναι το ouid, δηλαδή το κόκκινο αναγνωριστικό φακέλου, το οποίο φαίνεται στη διεύθυνση URL, η άλλη παράμετρος κοινής χρήσης καθορίζει εάν θα το μοιραστείτε στο Weibo και υπάρχει μια _t δεν ξέρω σε τι χρησιμεύει. Εντάξει, τώρα θεωρητικά, μπορείτε να ολοκληρώσετε την εξαγωγή κόκκινων φακέλων υποβάλλοντας τρεις παραμέτρους σε αυτήν τη διεύθυνση URL, αλλά όταν υποβάλετε πραγματικά τις παραμέτρους, θα διαπιστώσετε ότι ο διακομιστής θα επιστρέψει ως δια μαγείας μια τέτοια συμβολοσειρά για εσάς: [mw_shl_code=java,true] {"code":303403,"msg":"Λυπούμαστε, δεν έχετε άδεια πρόσβασης σε αυτήν τη σελίδα","data":[]}[/mw_shl_code] Μην πανικοβληθείτε αυτή τη στιγμή, σύμφωνα με την πολυετή εμπειρία μου στην ανάπτυξη ιστοσελίδων, ο προγραμματιστής του άλλου μέρους θα πρέπει να κρίνει τον παραπέμποντα, πολύ απλό, να αντιγράψει όλες τις κεφαλίδες του προηγούμενου αιτήματος. [mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- draw red envelope from:"+str(id)+"---" print "----------......----------" if checkValue(id)==False: #不符合条件, αυτή είναι η συνάρτηση που επιστρέφει αργότερα 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, όπως το Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(luckyUrl,param, header)[/mw_shl_code] Σε αυτή την περίπτωση, δεν υπάρχει πρόβλημα θεωρητικά, αλλά στην πραγματικότητα δεν υπάρχει πρόβλημα. Αφού ολοκληρωθεί η ενέργεια της κλήρωσης, πρέπει να κρίνουμε την κατάσταση και το επιστρεφόμενο res είναι μια συμβολοσειρά json, όπου ο κωδικός είναι 100000 είναι επιτυχής και αν είναι 90114, είναι το ανώτατο όριο της σημερινής λαχειοφόρου αγοράς και οι άλλες τιμές επίσης αποτυγχάνουν, οπότε: [mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- έχει φτάσει στο ανώτατο όριο---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='100000':#成功 print u"---------Σας εύχομαι ευημερία---------" print "----------......----------" log('success',str(id)+'---'+res) exit(0) if hbRes["data"] and 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], όπου το log είναι επίσης μια συνάρτηση που προσαρμόζω, η οποία χρησιμοποιείται για την καταγραφή αρχείων καταγραφής: [mw_shl_code=java,true]def log(τύπος,κείμενο): fp = open(type+'.txt','a') fp.write(κείμενο) fp.write('\r\n') fp.close()[/mw_shl_code]
|
Προηγούμενος:Σημειώσεις σχετικά με τα μέγιστα όρια μεταφόρτωσης PHPΕπόμενος:Λήψη επέκτασης memcache dll για PHP5.2, 5.3, 5.4, 5.5
|