Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 13448|Відповідь: 5

Як дістати червоні конверти науково: Наприкінці року можна розбагатіти і написати програму для отримання червоних конвертів

[Копіювати посилання]
Опубліковано 13.02.2015 22:44:10 | | | |
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]





Попередній:Примітки щодо максимальних обмежень завантаження PHP
Наступний:Завантаження розширення memcache dll для PHP5.2, 5.3, 5.4, 5.5
 Орендодавець| Опубліковано 13.02.2015 22:46:37 |
0×04 Перегляньте список червоних конвертів
Після успішного тестування єдиної дії збору червоного конверта це є основним модулем великого руху нашої програми — для сканування списку червоних конвертів має бути багато способів і входів для сканування списку червоних конвертів, таких як різні ключові слова Weibo тощо, але я використовую найпростіший метод: сканування списку червоних конвертів.
На головній сторінці (http://huodong.weibo.com/hongbao активності з червоним конвертом, через різні інші пункти можна спостерігати, хоча список дуже пов'язаний, його можна узагальнити у дві категорії (окрім найбагатшого списку червоного конверта): тема та таблиця лідерів.
Продовжуючи викликати F12, проаналізуйте формат обох сторінок, починаючи зі списку тематичних форм, таких як: http://huodong.weibo.com/hongbao/special_quyu
Ви можете побачити, що інформація про червоний конверт знаходиться у div під назвою info_wrap, тож нам потрібно лише активувати вихідний код цієї сторінки, потім взяти всі інфообгортки і просто обробити їх, щоб отримати червоний конвертний список цієї сторінки, тут нам потрібно використати деяких регулярних користувачів:
[mw_shl_code=java,true]def getThemeList(url,p):#主题红包 print u"--------- "+str(p)+"page---------" print "----------......----------" html=getData(url+'?p='+str(p)) pWrap= re.compile(r'<div class="info_wrap">(.+?) <span class="rob_txt"></span>',re. DOTALL) #h Отримати info_wrap звичайного pInfo=re.compile(r'.+<em class="num">(.+)</em>.+<em class="num">(.+)</em>.+<em class="num">(.+</em>). .+href="(.+)" class="btn"',re. DOTALL) #获取红包信息 List=pWrap.findall(html,re. DOTALL) n=len(List) if n==0: return for i у діапазоні(n): #traverse всі info_wrap div s=pInfo.match(List) #取得红包信息 info=list(s.groups(0))                info[0]=float(info[0].replace('\xcd\xf2','0000')) #现金,ten->0000 спроба: info[1]=float(info[1].replace('\xcd\xf2','0000')) #礼品价值, крім винятку, e:                        info[1]=float(info[1].replace('\xd2\xda','00000000')) #礼品价值 info[2]=float(info[2].replace('\xcd\xf2','0000')) #已发送 if info[2]==0: info[2]=1 #防止除数为0 if info[1]==0: info[1]=1 #防止除数为0 info.append(info[0]/(info[2]+info[1])) #红包价值, грош/(кількість отримувачів + призова вартість) # якщо info[0]/(info[2]+info[1])>100:                # print url luckyList.append(info) if 'class="page"' у html:#存在下一页 p=p+1 getThemeList(url,p) #递归调用自己爬取下一页[/mw_shl_code]Дуже важко сказати, що це так складно, і написання цих двох речень зайняло багато часу. Також є інформація в додатку [4], що є моїм алгоритмом для приблизної оцінки вартості червоних конвертів. Навіщо це робити, бо червоних конвертів багато, але ми можемо витягнути лише чотири рази. Серед величезного моря пакетів ми маємо знайти найцінніші червоні конверти і витягнути їх. Ось три дані для довідки: грошова вартість, вартість подарунка та кількість отримувачів. Очевидно, якщо готівка невелика і кількість людей, які отримують багато людей, або вартість призу дуже висока (деякі навіть шалені в сотнях мільйонів), Тоді це не варто брати, тож я довго стримувався і нарешті розробив алгоритм для вимірювання ваги червоних конвертів: вартість червоного конверта = грошовий / (кількість отримувачів + призова вартість).
Принцип сторінки таблиці лідерів той самий: знаходьте ключові теги та регулярно їх співвідношуйте.
[mw_shl_code=java,true]def getTopList(url,daily,p):#排行榜红包 print u"--------- "+str(p)+"page---------" print "----------......----------" html=getData(url+'?daily='+str(daily)+'& p='+str(p)) pWrap=re.compile(r'<div class="list_info">(.+?) <span class="list_btn"></span>',re. DOTALL) #h Отримати list_info звичайному pInfo=re.compile(r'.+<em class="num">(.+)</em>.+<em class="num">(.+)</em>.+<em class="num">(.+).</em>.+href="(.+)" class="btn rob_btn"',re. DOTALL) #获取红包信息 List=pWrap.findall(html,re. DOTALL) n=len(List) if n==0: return for i у діапазоні(n): #Iterate через усі info_wrap div s=pInfo.match(List) #取得红包信息 topinfo=list(s.groups(0))                info=list(topinfo) info[0]=topinfo[1].replace('\xd4\xaa','') #元->'' info[0]=float(info[0].replace('\xcd\xf2','0000')) #现金,10,>0000 info[1]=topinfo[2]. replace('\xd4\xaa','') #元->'' спробувати: info[1]=float(info[1].replace('\xcd\xf2','0000')) #礼品价值, крім Exception, e:                        info[1]=float(info[1].replace('\xd2\xda','0000000')) #礼品价值 info[2]=topinfo[0].replace('\xb8\xf6','') #个->'' info[2]=float(info[2].replace('\xcd\xf2','0000')) #已发送                if info[2]==0: info[2]=1 #防止除数为0 if info[1]==0: info[1]=1 #防止除数为0 info.append(info[0]/(info[2]+info[1])) #红包价值, готівка/(кількість отримувачів + вартість подарунка)                # якщо info[0]/(info[2]+info[1])>100: # print url luckyList.append(info) if 'class="page"' у html:#存在下一页 p=p+1                getTopList(url,daily,p) #递归调用自己爬取下一页[/mw_shl_code]Добре, тепер ми можемо успішно сканувати список двох спеціальних сторінок, і наступний крок — отримати список списків, тобто колекцію всіх цих адрес списків, а потім збирати їх одну за одною:
[mw_shl_code=java,true]def getList(): print u"---------Find target---------" print "----------......----------" themeUrl={ #主题列表 'theme':'http://huodong.weibo.com/hongbao/theme',                 'pinpai':'http://huodong.weibo.com/hongbao/special_pinpai', 'daka':'http://huodong.weibo.com/hongbao/special_daka', 'youxuan':'http://huodong.weibo. com/hongbao/special_youxuan', 'qiye':'http://huodong.weibo.com/hongbao/special_qiye', 'quyu':'http://huodong.weibo.com/hongbao/special_quyu', 'meiti':'http: huodong.weibo.com/hongbao/special_meiti', 'hezuo':'http://huodong.weibo.com/hongbao/special_hezuo' } topUrl={ #排行榜列表 'mostmoney':'http://huodong.weibo. com/hongbao/top_mostmoney', 'mostsend':'http://huodong.weibo.com/hongbao/top_mostsend', 'mostsenddaka':'http://huodong.weibo.com/hongbao/top_mostsenddaka',                'mostsendpartner':'http://huodong.weibo.com/hongbao/top_mostsendpartner', 'cate':'http://huodong.weibo.com/hongbao/cate?type=', 'одяг':'http://huodong.weibo.com/ Hongbao/Cate?type=Clothes', 'Beauty':'http://huodong.weibo.com/hongbao/cate?type=beauty', 'fast':'http://huodong.weibo.com/hongbao/cate?type=fast', 'life':'http: huodong.weibo.com/hongbao/cate?type=life', 'digital':'http://huodong.weibo.com/hongbao/cate?type=digital', 'інше':'http://huodong.weibo.com/hongbao/cate?type=other'                } для (theme,url) у themeUrl.items(): print "----------"+theme+"----------" print url print "----------......----------"                getThemeList(url,1) для (top,url) у topUrl.items(): print "----------"+top+"----------" print url print "----------......----------"                getTopList(url,0,1) getTopList(url,1,1)[/mw_shl_code]
 Орендодавець| Опубліковано 13.02.2015 22:47:13 |
0×05 Оцініть наявність червоних конвертів
Це досить просто: спочатку пошукайте ключові слова в вихідному коді, щоб побачити, чи є червона кнопка для покупки конверта, а потім перейдіть до рейтингу колекції, щоб побачити, який рекорд найвищий, якщо найбільший отримує лише кілька доларів — до побачення......
Адреса для перегляду запису колекції — http://huodong.weibo.com/aj_hongbao/detailmore?page=1&type=2&_t=0&__rnd=1423744829265&uid=Red Envelope ID

[mw_shl_code=java,true]def checkValue(id): infoUrl='http://huodong.weibo.com/hongbao/'+str(id) html=getData(infoUrl) якщо 'action-type="lottery"' у html або True: #存在抢红包按钮                logUrl="http://huodong.weibo.com/aj_hongbao/detailmore?page=1&type=2&_t=0&__rnd=1423744829265&uid="+id #查看排行榜数据 param={} header= { 'Cache-Control': 'no-cache', 'Content-Type':'application/x-www-form-urlencoded', 'Pragma':'no-cache', 'Referer':'http://huodong.weibo.com/hongbao/detail? uid='+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(logUrl,param,header) pMoney=re.compile(r'<span class="money">(\d+?). +?) \xd4\xaa</span>', re. DOTALL) #h Отримати всіх list_info постійних користувачів luckyLog=pMoney.findall(html,re. DOTALL) if len(luckyLog)==0: maxMoney=0 інакше: maxMoney=float(luckyLog[0]) якщо maxMoney <найнижчий: #记录中最大红包小于设定值 повернути False інакше: print u"--------- рука сповільнюється--------- надрукувати "----------......----------" повернути false        повернутися True[/mw_shl_code]0×06 Завершення робіт
Основні модулі вже встановлені, і тепер усі етапи потрібно з'єднати послідовно:
[mw_shl_code=java,true]def start(ім'я користувача,пароль,low,fromFile): gl=False lowest=low login(ім'я користувача, пароль) if fromfile=='y': якщо os.path.exists('luckyList.txt'):                         try: f = file('luckyList.txt') newList = [] newList = p.load(f)                                print u'--------- load list--------- print "----------......----------", крім винятку, e: print u' не зміг розшифрувати локальний список, обскануючи онлайн-сторінку. 'print "----------......----------" gl=True else: print u' не існує локально luckyList.txt сканування онлайн-сторінок. ' print "----------......----------" gl=True if gl==True: getList() з оператора import itemgetter                newList=sorted(luckyList, key=itemgetter(4),reverse=True) f = file('luckyList.txt', 'w') p.dump(newList, f) #把抓到的列表存到文件里, тож не потрібно ловити f.close() для удачі наступного разу newList: якщо не 'http://huodong.weibo.com' у Lucky[3]: #不是红包 продовжити друк lucky[3] id=re.findall(r'(\w*[0-9]+)\w*',lucky[3])                getLucky(id[0])[/mw_shl_code] Оскільки дуже клопітно постійно сканувати червоний конверт щоразу під час тестування, я додав абзац, щоб скинути повний список у код файлу, щоб ви могли читати локальний список і в майбутньому отримати червоний конверт.
[mw_shl_code=java,true]if __name__ == "__main__": print u"------------------ Weibo Red Envelope Assistant------------------" print "---------------------v0.0.1---------------------" print u"------------- від @***----------------" Надрукувати "-------------------------------------------------" спробуйте: uname=raw_input(u"Будь ласка, введіть свій акаунт у Weibo: ".decode('utf-8').encode('gbk'))                pwd=raw_input(u"Будь ласка, введіть свій пароль у Weibo: ".decode('utf-8').encode('gbk')) low=int(raw_input(u"Red envelope для отримання максимальної суми грошей більше n: ".decode('utf-8').encode('gbk')))) fromfile=raw_input(u) Чи варто використовувати червоний конвертний список у luckyList.txt: (y/n) ".decode('utf-8').encode('gbk')) за винятком Exception, e: print u" parameter error" print "----------......----------" print e                exit(0) print u"--------- program start---------" print "----------......----------" start(uname,pwd,low,fromfile) print u" --------- кінець програми--------- "print "----------...... ----------" os.system('пауза')[/mw_shl_code]
0×07 Пішли!

0×07 Резюме
Базовий скелет краулера фактично завершено, насправді для цього краулера ще багато простору для гри в багатьох деталях, наприклад, модифікація для підтримки пакетного входу, оптимізація алгоритму червоного конверта, сам код також має бути багато місць для оптимізації, але з моїми можливостями, я припускаю, що зможу це отримати.
Врешті-решт усі побачили результат програми, я написав сотні рядків коду, тисячі слів статей, і все, що я наполегливо здобув — це набір двокольорових кульок, Німа піт, тату, як це може бути двокольорова куля!! (Оповідач: Чим більше автор говорив, тим більше він збуджувався, і він справді плакав, і люди навколо його переконували: Брате, це не так, хіба це не просто червоний конверт з Weibo, вчора в мене боліли руки, і я не витягнув червоний конверт у WeChat.) )

Опубліковано 14.02.2015 07:14:33 |
Скільки грошей ти взяв у Лулу?
Опубліковано 02.03.2016 13:48:27 |
Виглядає таким високим
Опубліковано 07.03.2016 12:51:02 |
Я не знаю, чи це серйозно
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com