Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 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 ще обработват състоянието на бисквитките, макар че не знам много за това, но усещането е невероятно.
След това трябва да капсулираме два модула – единият е модулът за събиране на данни, който се използва просто за ПОЛУЧАВАНЕ на данни, а другият за 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 с изключение на Exception, e: print u'Request exception, url: '+url[/mw_shl_code] С тези два модула можем да GET и POST данни, сред които причината getData да декодира и след това да кодира е, че при Win7 винаги съм обърквал изхода при дебъгване, затова добавих малко обработка на кодиране, но това не е основната функция, функцията за вход по-долу е ядрото на Weibo login.
[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',                'sso simplelogin': '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" ----------......---------- "освен изключение, e: print u" --------- входът не успя! -------" отпечатай "----------......----------" exit(0)[/mw_shl_code]Параметрите и алгоритмите за криптиране в това са копирани от Интернет, не разбирам много добре, вероятно е първо да се поиска времеви печат и публичен ключ, после RSA криптиране и накрая обработката и подаването в интерфейса за влизане в Sina, след успешно влизане от Sina, ще се върне Weibo адрес, трябва да го поискаш, за да може статусът на вход да влезе в сила напълно, След успешно влизане, следващите заявки ще носят текущата бисквитка на потребителя.
0×03 Чертеж с определен червен плик
След като успешно влязох във Weibo, нямам търпение да намеря червен плик, за да го пробвам първо, разбира се, първо в браузъра. Накрая намерих страница с червен бутон за плик, F12 призова дебъгера, за да види какво иска пакетът с данни.

Можете да видите, че адресът на заявката е http://huodong.weibo.com/aj_hongbao/getlucky, има два основни параметъра – единият е ouid, тоест червеният плик id, който се вижда в URL адреса, другият параметър share определя дали да го споделя в Weibo, и има _t не знам за какво е.
Добре, теоретично можете да завършите извличането на червени пликове, като подадете три параметъра на този URL, но когато реално изпратите параметрите, сървърът магически ще върне такъв низ:
[mw_shl_code=java, вярно] {"code":303403,"msg":"Съжалявам, нямате разрешение за достъп до тази страница","data":[]}[/mw_shl_code] Не се паникьосвайте сега, според многогодишния ми опит в уеб разработката, програмистът на другата страна трябва да прецени реферера, много просто, копирайте всички заглавия на предишната заявка.
[mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- нарисувам червен плик от:"+str(id)+"---" print "----------......----------" ако checkValue(id)==False: #不符合条件, това е функцията return по-късно        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] В този случай теоретично няма проблем, но всъщност няма проблем. След като лотарийното действие приключи, трябва да преценим статуса, а върнатият res е 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) ако n==0: връщане за 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')) #礼品价值 освен Exception, 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 ако info[1]==0: info[1]=1 #防止除数为0 info.append(info[0]/(info[2]+info[1])) #红包价值, cash/(брой получатели + стойност на наградата) # ако 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(Списък) ако n==0: връщане за 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')) #已发送                ако info[2]==0: info[2]=1 #防止除数为0 if info[1]==0: info[1]=1 #防止除数为0 info.append(info[0]/(info[2]+info[1])) #红包价值, cash/(брой получатели + стойност на подаръка)                # ако info[0]/(info[2]+info[1])>100: # print url luckyList.append(info) ако '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', 'красота':'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', 'дигитален':'http://huodong.weibo.com/hongbao/cate?type=digital', 'other':'http://huodong.weibo.com/hongbao/cate?type=other'                } за (тема,URL) в темаUrl.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 Enplope 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 редовни късметлииLog=pMoney.findall(html,re. DOTALL) ако len(luckyLog)==0: maxMoney=0 в противен случай: maxMoney=float(luckyLog[0]) ако maxMoney <най-нисък: #记录中最大红包小于设定值 връщане Фалшиво друго: print u"--------- ръката забавя--------- печатай "----------......----------" връща false        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 "----------......----------" с изключение на Изключение, e: print u' не успя да анализира локалния списък, обхождайки онлайн страницата. 'print "----------......----------" gl=Вярно друго: print u' не съществува локално luckyList.txt обхождане на онлайн страници. ' print "----------......----------" gl=True if gl==True: getList() от operator 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]: #不是红包 продължа print 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"------------- от @***----------------" print "-------------------------------------------------" опитай: 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" параметърна грешка" 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 Резюме
Основният скелет на crawler е практически завършен, всъщност все още има много пространство за този crawler да се използва в много детайли, като например модифициране за поддръжка на batch login, като оптимизиране на алгоритъма за стойност на червената обвивка, самият код би трябвало да има много възможности за оптимизация, но с моите възможности предполагам, че мога да го постигна.
В крайна сметка всички видяха резултата от програмата, написах стотици редове код, хиляди думи статии, и всичко, за което се борих усилено, беше просто комплект двуцветни топки, Нима, татко, как може да е двуцветна топка!! (Разказвач: Колкото повече авторът говореше, толкова по-развълнуван ставаше, и наистина плакаше, а хората около него го убеждаваха: Братко, не е ли така, не е ли просто червен плик от Weibo, вчера ръцете ми боляха и не извадих червен плик от WeChat.) )

Публикувано в 14.02.2015 г. 7:14:33 ч. |
Колко пари взе в Лулу?
Публикувано в 2.03.2016 г. 13:48:27 ч. |
Изглежда толкова висока
Публикувано в 7.03.2016 г. 12:51:02 ч. |
Не знам дали е сериозно
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com