|
|
Yayınlandı 13.02.2015 22:44:10
|
|
|
|

|
0×00 Arka Plan
Kırmızı zarflar nasıl? Kardeşinin oğlu Huer, "Para neredeyse karşılaştırılabilir. Kardeş ve kız Dao Yun, "Rüzgar yüzünden teyzem kadar iyi değil," dedi. "Herkes arka planı anlıyor, yeni yıl ve kırmızı zarfların gökyüzünde uçtuğu gün. Tesadüfen iki gün önce Python öğrendim ve daha heyecanlıydım, bu yüzden Weibo kırmızı zarflarının taranmasını inceledim, neden Alipay kırmızı zarfları yerine Weibo kırmızı zarflar kullandığını, çünkü sadece Web'i anlıyorum ve enerjim varsa, gelecekte whack-a-mole algoritmasını da inceleyebilirim. Python'a yeni başlayan biri olduğum için, bu program aynı zamanda Python öğrendikten sonra yazdığım üçüncü program, bu yüzden kodda herhangi bir boşluk varsa lütfen şahsen kurtmayın, odak fikirde, eğer fikirde boşluk varsa, lütfen yüz yüze değmeyin, IE varsayılan tarayıcı olarak kendini ayarlayacak yüz yüzü var, ben de kötü bir makale yazıyorum kabul edilebilir...... Ben Python 2.7 kullanıyorum ve Python 2 ile Python 3 arasında büyük bir fark olduğu söyleniyor.
0×01 Fikirleri Kelimelerle anlatacak kadar tembel değildim, bu yüzden bir eskiz çizdim ve herkes bunu anlayabilmeliydi.
Öncelikle, eski kural, önce faydalı olduğunu bilmediğiniz ama onsuz yapamayacağınız bir kütüphane tanıtın: [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] Sonra daha sonra kullanmanız gereken bazı değişkenleri belirtin:
[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Burada varsayılan olarak Python'da olmayan bir rsa kütüphanesi kullanılır. Kurulum yapmam gerekiyor :https://pypi.python.org/pypi/rsa/
İndirdikten sonra çalıştırın setpy.py kurulumu yapın, ardından geliştirme adımlarımıza başlayabiliriz.
0×02 Weibo girişi Kırmızı zarfları yakalama işlemi giriş yaptıktan sonra yapılmalıdır, yani bir giriş fonksiyonu olmalı, giriş anahtar değil, anahtar çerezlerin korunmasıdır, burada cookielib iş birliği gereklidir. [mw_shl_code=java,doğru]cj = cookielib. CookieJar()açıcı = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(opener)[/mw_shl_code] Bu şekilde, açıcı kullanan tüm ağ işlemleri çerezlerin durumunu yönetiyor, çok bilgim yok ama harika hissettiriyor. Sonra, iki modülü kapsüllememiz gerekiyor; biri veri toplama modülü, ki sadece veri ALMAK için kullanılır, diğeri ise veriyi POST etmek için kullanılır. [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') Exception hariç metni geri döndür, e: print u' exception istisnesi, url: '+url print e def postData(url,data,header) : try: data = urllib.urlencode(data) req = urllib2. Request(url,data,header) sonuç = opener.open(req) metin = result.read() Exception hariç metni geri döndür, e: print u'İstisna iste, url: '+url[/mw_shl_code] Bu iki modülle veri GET ve POST yapabiliyoruz, bunlardan biri getData'nın kod çözme ve sonra kodlama yapmasının sebebi Win7'de hata ayıklama yaparken çıktıyı hep bozmam, bu yüzden bazı kodlama işlemleri ekledim, bunlar önemli değil, aşağıdaki giriş fonksiyonu Weibo girişinin çekirdeği. [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 (uyumlu; 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"--------- Giriş başarılı! ------- "print" ----------......---------- "except Exception, e: print u" --------- giriş başarısız oldu! -------" baskı "----------......----------" çıkış(0)[/mw_shl_code]Bu parametreler ve şifreleme algoritmaları internetten kopyalanmış, çok iyi anlamıyorum, muhtemelen önce zaman damgası ve açık anahtar talep etmek, sonra rsa şifreleme ve son olarak işleme işlemi işleyip Sina giriş arayüzüne göndermek, Sina'dan başarılı bir giriş yaptıktan sonra bir Weibo adresi döndürecek, bunu talep etmeniz gerekiyor, böylece giriş durumu tamamen devreye girebiliyor, Başarılı giriş yaptıktan sonra, sonraki istekler mevcut kullanıcının çerezini taşıyacaktır.
0×03 Belirlenmiş kırmızı zarf çizimi Weibo'ya başarılı bir şekilde giriş yaptıktan sonra, önce tarayıcıda denemek için kırmızı bir zarf bulmayı sabırsızlıkla bekliyorum. Sonunda, kırmızı bir zarf düğmesi olan bir sayfa buldum, F12 hata ayıklayıcıyı çağırdı ve veri paketinin ne istediğini gördü.
İstek adresinin http://huodong.weibo.com/aj_hongbao/getlucky olduğunu görebilirsiniz, iki ana parametre var, biri ouid, yani URL'de görülebilen kırmızı zarf kimliği, diğer paylaşma parametresi ise Weibo'ya paylaşım yapıp paylaşılmayacağını belirliyor ve bir _t ne için olduğunu bilmiyorum. Tamam, teorik olarak, kırmızı zarfların çıkarılmasını bu URL'ye üç parametre göndererek tamamlayabilirsiniz, ancak parametreleri gerçekten gönderdiğinizde, sunucu sihirli bir şekilde sizin için böyle bir diziyi döndürecek: [mw_shl_code=java, doğru] {"code":303403,"msg":"Üzgünüm, bu sayfaya erişim izniniz yok","data":[]}[/mw_shl_code] Şu anda panik yapma, uzun yılların web geliştirme deneyimime göre, karşı tarafın programcısı referansı değerlendirmeli, çok basit, geçmiş talebin tüm başlıklarını kopyala. [mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- kırmızı zarf çiz:"+str(id)+"---" "----------......----------" yaz if checkValue(id)==False: #不符合条件, bu fonksiyon daha sonra döndürülecek 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 gibi) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(luckyUrl,param, başlık)[/mw_shl_code] Bu durumda teoride bir sorun yoktur, ama aslında bir sorun yoktur. Piyango işlemi tamamlandıktan sonra durumu değerlendirmemiz gerekir ve geri dönen çözünürlük bir json dizisi; kod 100000 başarılı olur, 90114 ise bugünün piyangolarının üst sınırıdır ve diğer değerler de başarısız olur, yani: [mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- üst sınıra ulaştı---------" yaz "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='100000':#成功 print u"---------Dili size refah diliyorum---------" 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], burada log da özelleştirdiğim bir fonksiyondur ve logları kaydetmek için kullanılır: [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]
|
Önceki:PHP yükleme maksimum limitleri hakkında notlarÖnümüzdeki:PHP5.2, 5.3, 5.4, 5.5 için memcache dll uzantısı indir
|