|
0×00 Передумови
Які червоні конверти? Син його брата, Хуер, сказав: «Гроші майже порівнянні. Брат і донька Дао Юнь сказали: «Це не так добре, як у моєї тітки, через вітер.» "Всі розуміють передмістя, це Новий рік, і це день, коли червоні конверти літають по всьому небу. Так сталося, що я вивчив 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 Дію захоплення червоних конвертів потрібно виконати після входу, тому має бути функція входу, ключ не є входом, ключем є збереження cookie, тут потрібна співпраця cookielib. [mw_shl_code=java,true]cj = cookielib. CookieJar()opener = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(opener)[/mw_shl_code] Таким чином, усі мережеві операції з opener оброблятимуть стан cookie, хоча я мало про це знаю, але відчуття неймовірні. Далі потрібно інкапсулювати два модулі: один — модуль збору даних, який використовується для отримання даних, а інший — для POST даних. [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, 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() return text за винятком Exception, e: print u'Request exception, url: '+url[/mw_shl_code] З цими двома модулями ми можемо GET і POST дані, серед яких причина декодування 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) key = rsa. PublicKey(rsaPublickey,65537) повідомлення = 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; 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, 'кодування': '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"--------- Вхід успішно! ------- "друкувати" ----------......---------- "окрім винятку, e: print u" --------- вхід не вдався! -------" надрукувати "----------......----------" exit(0)[/mw_shl_code]Параметри та алгоритми шифрування тут скопійовані з Інтернету, я не дуже добре розумію, ймовірно, спочатку потрібно запитати часову мітку та публічний ключ, потім RSA-шифрування, а потім обробку і надіслати на інтерфейс входу Sina, після успішного входу з Sina він поверне адресу Weibo, потрібно її запитати, щоб статус входу міг повністю набути чинності, Після успішного входу наступні запити зберігатимуть файл cookie поточного користувача.
0×03 Призначений червоний малюнок конверта Після успішного входу у Weibo я не можу дочекатися, щоб знайти червоний конверт, щоб спробувати його першим, звісно, спочатку в браузері. Нарешті я знайшов сторінку з червоною кнопкою конверта, F12 викликав відлагоджувач, щоб дізнатися, що запитує пакет даних.
Ви можете побачити, що адреса запиту — http://huodong.weibo.com/aj_hongbao/getlucky, є два основні параметри: один — ouid, тобто червоний конвертний id, який видно в URL, інший параметр share, визначає, чи варто поділитися ним у Weibo, і є _t для чого я не знаю, для чого він. Теоретично ви можете завершити вилучення червоних конвертів, ввівши три параметри на цей URL, але коли ви фактично подаєте параметри, сервер магічно поверне вам такий рядок: [mw_shl_code=java, true] {"code":303403,"msg":"Вибачте, ви не маєте дозволу на доступ до цієї сторінки","data":[]}[/mw_shl_code] Не панікуйте, згідно з моїм багаторічним досвідом у веб-розробці, програміст іншої сторони має оцінити реферера, дуже просто, скопіюйте всі заголовки попереднього запиту. [mw_shl_code=java,true]def getLucky(id): #抽奖程序 надрукувати u"--- намалювати червоний конверт з:"+str(id)+"---" друкувати "----------......----------" якщо checkValue(id)==Неправда: #不符合条件, це функція, що повернеться пізніше 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] У цьому випадку теоретично проблеми немає, але насправді проблеми немає. Після завершення лотерейної дії потрібно оцінити статус, і повернене розділення — це 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) якщо hbRes["data"] та 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(type,text): fp = open(type+'.txt','a') fp.write(text) fp.write('\r\n') fp.close()[/mw_shl_code]
|