Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 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
Действие захвата красных конвертов должно выполняться после входа, поэтому должна быть функция входа, ключ — не вход, ключ — сохранение куки, здесь требуется сотрудничество 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') возвращает текст, кроме исключения, 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, кроме исключения, e: print u'Request exception, url: '+url[/mw_shl_code] С помощью этих двух модулей мы можем GET и POST данные, среди которых причина декодирования и кодирования getData в том, что в Win7 я всегда искажал вывод при отладке, поэтому добавил обработку кодирования, но это не главное, функция входа ниже — ядро входа в Weibo.
[mw_shl_code=java,true]def login(nick, pwd): вывести u"----------login----------" вывести "----------......----------" 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 (совместим; 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"--------- Вход успешен! ------- «печатать» ----------......---------- «кроме исключения, например: print u» --------- неудачный вход! -------" печатать "----------......----------" exit(0)[/mw_shl_code]Параметры и алгоритмы шифрования скопированы из Интернета, я плохо понимаю, вероятно, сначала нужно запросить временную метку и публичный ключ, затем RSA-шифрование, а затем обработку и отправку в интерфейс входа Sina, после успешного входа из Sina он вернёт адрес Weibo, нужно его запросить, чтобы статус входа полностью вступил в силу, После успешного входа последующие запросы будут содержать текущий файл cookie пользователя.
0×03 Чертеж с выделенным красным конвертом
После успешного входа в Weibo я с нетерпением жду, когда сначала найду красный конверт, чтобы попробовать его, конечно же, сначала в браузере. Наконец, я нашёл страницу с красной кнопкой конверта, F12 вызвал отладчик, чтобы узнать, что запрашивает пакет данных.

Вы видите, что адрес запроса — http://huodong.weibo.com/aj_hongbao/getlucky, есть два основных параметра: один — ouid, то есть красный идентификатор конверта, который отображается в 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): #抽奖程序 print u"--- нарисовать красную конверт из:"+str(id)+"---" print "----------......----------" if checkValue(id)==False: #不符合条件, это функция return later        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, заголовок)[/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["код"])+'---'+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 try: info[1]=float(info[1].replace('\xcd\xf2','0000')) #礼品价值 кроме исключения, e:                        info[1]=float(info[1].replace('\xd2\xda','0000000')) #礼品价值 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')) #礼品价值 кроме исключения, e:                        info[1]=float(info[1].replace('\xd2\xda','00000000')) #礼品价值 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])) #红包价值, наличные/(количество получателей + стоимость подарка)                # if 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', 'other':'http://huodong.weibo.com/hongbao/cate?type=other'                } для (тема,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 <Самый низкий: #记录中最大红包小于设定值 возврат Ложно, иначе: печать u"--------- рука замедляется---------" печать "----------......----------" возвращать ложь        return True[/mw_shl_code]0×06 Отделочные работы
Основные модули уже готовы, и теперь все этапы должны быть соединены последовательно:
[mw_shl_code=java,true]def start(username,password,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 "----------......----------", кроме исключения, например: print u' не смог проанализировать локальный список, сканируя онлайн-страницу. 'print "----------......----------" gl=True else: print u' не существует локально luckyList.txt сканирующих онлайн-страниц. ' print "----------......----------" gl=True if gl==True: getList() из import operator 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')) кроме исключения, e: print u" параметр 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 7:14:33 |
Сколько денег вы заработали в Лулу?
Опубликовано 02.03.2016 13:48:27 |
Выглядит так высоко
Опубликовано 07.03.2016 12:51:02 |
Не знаю, серьёзно ли это
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com