|
0×00 Latar Belakang
Seperti apa amplop merahnya? Putra saudaranya, Huer, berkata, "Uangnya hampir sebanding. Kakak dan putri Dao Yun berkata, "Ini tidak sebagus bibiku karena angin." "Semua orang mengerti latar belakangnya, ini Tahun Baru, dan ini adalah hari ketika amplop merah beterbangan di seluruh langit. Kebetulan saya belajar Python dua hari yang lalu, dan saya lebih bersemangat, jadi saya mempelajari dan mempelajari merangkak amplop merah Weibo, mengapa amplop merah Weibo alih-alih amplop merah Alipay, karena saya hanya mengerti Web, dan jika saya memiliki energi, saya mungkin juga mempelajari algoritma whack-a-mole di masa depan. Karena saya seorang pemula di Python, program ini juga merupakan program ketiga yang saya tulis setelah belajar Python, jadi tolong jangan menyodok secara langsung jika ada lubang dalam kode, fokusnya adalah pada idenya, yah, jika ada lubang dalam ide tersebut, tolong jangan menyodoknya secara langsung, Anda lihat IE memiliki wajah untuk mengatur dirinya sebagai browser default, saya menulis artikel sampah juga dapat diterima...... Saya menggunakan Python 2.7, dan dikatakan bahwa ada perbedaan besar antara Python 2 dan Python 3.
0×01 Ide Saya terlalu malas untuk menggambarkannya dengan kata-kata, jadi saya menggambar sketsa, dan semua orang harus bisa memahaminya.
Pertama-tama, aturan lama, pertama-tama perkenalkan perpustakaan yang Anda tidak tahu berguna tetapi tidak dapat tanpanya: [mw_shl_code=java,true]impor ulang impor urllib impor urllib2 impor cookielib impor base64 impor binascii impor os impor json impor sys impor cPickle as p impor rsa[/mw_shl_code] Kemudian deklarasikan beberapa variabel lain yang perlu Anda gunakan nanti:
[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Pustaka rsa digunakan di sini, yang tidak disertakan dalam Python secara default. Perlu menginstalnya :https://pypi.python.org/pypi/rsa/
Setelah mengunduhnya, jalankan setpy.py instal dan kemudian kita dapat memulai langkah-langkah pengembangan kita.
0×02 Login Weibo Tindakan mengambil amplop merah harus dilakukan setelah masuk, sehingga harus ada fungsi login, login bukan kuncinya, kuncinya adalah pengawetan cookie, disini diperlukan kerja sama cookielib. [mw_shl_code=java,true]cj = cookielib. CookieJar()opener = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(opener)[/mw_shl_code] Dengan cara ini, semua operasi jaringan yang menggunakan opener akan menangani status cookie, meskipun saya tidak tahu banyak tentang itu, tetapi rasanya luar biasa. Selanjutnya, kita perlu merangkum dua modul, satu adalah modul akuisisi data, yang digunakan untuk MENDAPATKAN data, dan yang lainnya digunakan untuk POSTING data. [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') mengembalikan teks kecuali Exception, 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() mengembalikan teks kecuali Exception, e: print u'Request exception, url: '+url[/mw_shl_code] Dengan kedua modul ini, kita dapat GET dan POST data, di antaranya alasan mengapa getData memecahkan kode dan kemudian mengkodekan adalah karena di bawah Win7 saya selalu mengacaukan output saat debugging, jadi saya menambahkan beberapa pemrosesan pengkodean, ini bukan intinya, fungsi login di bawah ini adalah inti dari login Weibo. [mw_shl_code=java,true]def login(nick, pwd): cetak u"----------login----------" cetak "----------......----------" 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, 'layanan': 'miniblog', 'servertime': servertime, 'nonce': nonce, 'pwencode': 'rsa2', 'sp': sp, 'pengkodean': '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 berhasil! ------- "cetak" ----------......---------- "kecuali Pengecualian, e: cetak u" --------- login gagal! -------" cetak "----------......----------" exit(0)[/mw_shl_code]Parameter dan algoritme enkripsi dalam hal ini disalin dari Internet, saya tidak mengerti dengan baik, mungkin untuk meminta stempel waktu dan kunci publik terlebih dahulu, lalu enkripsi rsa dan terakhir memproses pemrosesan dan mengirimkannya ke antarmuka login Sina, setelah berhasil masuk dari Sina, itu akan mengembalikan alamat Weibo, Anda perlu memintanya, sehingga status login dapat berlaku sepenuhnya, Setelah berhasil login, permintaan berikutnya akan membawa cookie pengguna saat ini.
0×03 Gambar amplop merah yang ditunjuk Setelah berhasil masuk ke Weibo, saya tidak sabar untuk menemukan amplop merah untuk mencobanya terlebih dahulu, tentu saja, terlebih dahulu di browser. Akhirnya, saya menemukan halaman dengan tombol amplop merah, F12 memanggil debugger untuk melihat apa yang diminta paket data.
Anda dapat melihat bahwa alamat permintaan adalah http://huodong.weibo.com/aj_hongbao/getlucky, ada dua parameter utama, satu adalah ouid, yaitu id amplop merah, yang dapat dilihat di URL, parameter berbagi lainnya menentukan apakah akan membagikannya ke Weibo, dan ada _t Saya tidak tahu untuk apa. Oke, sekarang secara teoritis, Anda dapat menyelesaikan ekstraksi amplop merah dengan mengirimkan tiga parameter ke URL ini, tetapi ketika Anda benar-benar mengirimkan parameter, Anda akan menemukan bahwa server secara ajaib akan mengembalikan string seperti itu untuk Anda: [mw_shl_code=java,true] {"code":303403,"msg":"Maaf, Anda tidak memiliki izin untuk mengakses halaman ini","data":[]}[/mw_shl_code] Jangan panik saat ini, menurut pengalaman pengembangan web saya selama bertahun-tahun, programmer pihak lain harus menilai perujuk, sangat sederhana, salin semua header dari permintaan sebelumnya. [mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- gambar amplop merah dari:"+str(id)+"---" print "----------......----------" if checkValue(id)==False: #不符合条件, ini adalah fungsi yang dikembalikan nanti 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), 'Agen Pengguna':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, seperti Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(luckyUrl,param, header)[/mw_shl_code] Dalam hal ini, tidak ada masalah secara teori, tetapi sebenarnya tidak ada masalah. Setelah tindakan lotere selesai, kita perlu menilai statusnya, dan res yang dikembalikan adalah string json, di mana kodenya 100000 berhasil, dan jika 90114, itu adalah batas atas lotere hari ini, dan nilai lainnya juga gagal, jadi: [mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- telah mencapai batas atas---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='100000':#成功 print u"---------Semoga Anda sejahtera---------" print "----------......----------" log('success',str(id)+'---'+res) exit(0) if hbRes["data"] dan 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], di mana log juga merupakan fungsi yang saya sesuaikan, yang digunakan untuk merekam log: [mw_shl_code=java,true]def log(jenis,teks): fp = open(type+'.txt','a') fp.write(text) fp.write('\r\n') fp.close()[/mw_shl_code]
|