Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 13448|Resposta: 5

Como conseguir envelopes vermelhos cientificamente: No final do ano, você pode ficar rico e escrever um programa para pegar envelopes vermelhos

[Copiar link]
Publicado em 13/02/2015 22:44:10 | | | |
0×00 Contexto

Como são os envelopes vermelhos? O filho do irmão, Huer, disse: "O dinheiro é quase comparável. O irmão e a filha Dao Yun disseram: "Não é tão bom quanto minha tia por causa do vento." "Todo mundo entende o contexto, é Ano Novo, e é o dia em que envelopes vermelhos voam pelo céu. Aconteceu que aprendi Python há dois dias, e fiquei mais animado, então estudei e estudei o rastreamento dos envelopes vermelhos do Weibo, por que envelopes vermelhos do Weibo em vez dos envelopes vermelhos do Alipay, porque só entendo a Web, e se eu tiver energia, talvez também estude o algoritmo whack-a-mole no futuro.
Como sou iniciante em Python, esse programa também foi o terceiro que escrevi depois de aprender Python, então por favor, não fujem pessoalmente se houver algum buraco no código, o foco está na ideia, bem, se houver algum buraco na ideia, por favor, não mexam pessoalmente, veja bem, o IE tem o rosto de se definir como navegador padrão, eu escrever um artigo ruim também é aceitável......
Eu uso Python 2.7, e dizem que há uma grande diferença entre Python 2 e Python 3.
0×01 Ideias
Eu era preguiçoso demais para descrever em palavras, então fiz um esboço, e todo mundo deveria conseguir entender.
Primeiramente, a regra antiga: primeiro introduza uma biblioteca que você não saiba que é útil, mas não pode abrir mão:
[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] Depois, declare algumas outras variáveis que você precisará usar depois:

[mw_shl_code=java,true]reload(sys)sys.setdefaultencoding('utf-8&') #将字符编码置为utf-8luckyList=[] #红包列表lowest=10 #能忍受红包领奖记录最低为多少[/mw_shl_code]Uma biblioteca rsa é usada aqui, que não está incluída em Python por padrão. Preciso instalar :https://pypi.python.org/pypi/rsa/

Depois de baixar, execute setpy.py instale e então podemos começar as etapas de desenvolvimento.
0×02 login no Weibo
A ação de pegar envelopes vermelhos deve ser realizada após o login, então deve haver uma função de login, o login não é a chave, a chave é a preservação dos cookies, aqui é necessária a cooperação do cookielib.
[mw_shl_code=java,true]cj = cookielib. CookieJar()opener = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(opener)[/mw_shl_code] Dessa forma, todas as operações de rede usando opener vão lidar com o estado dos cookies, embora eu não saiba muito sobre isso, mas é uma sensação incrível.
Em seguida, precisamos encapsular dois módulos, um é o módulo de aquisição de dados, que é usado simplesmente para obter dados, e o outro é usado para POST dados.
[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') retorne texto exceto 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() retorne texto exceto Exception, e: print u'Request exception, url: '+url[/mw_shl_code] Com esses dois módulos, podemos GET e POST dados, entre os quais a razão pela qual o getData decode e depois encode é porque no Win7 eu sempre distorcia a saída ao depurar, então adicionei um pouco de processamento de codificação, mas esse não é o objetivo, a função de login abaixo é o núcleo do login do 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] chave de pub = re.findall('"chave de publicação":"(.+?)",' , 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) chave = rsa. PublicKey(rsaPublickey,65537) mensagem = str(servertime) +'\t' + str(nonce) + '\n' + str(pwd) sp = binascii.b2a_hex(rsa.encrypt(message,key)) cabeçalho = {'User-Agent' : 'Mozilla/5.0 (compatível; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)'} param = { 'entrada': '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, 'codificação': '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) imprimir u"--------- Login bem-sucedido! ------- "imprimir" ----------......---------- "exceto exceção, e: imprimir u" --------- login falhou! -------" imprimir "----------......----------" exit(0)[/mw_shl_code]Os parâmetros e algoritmos de criptografia aqui são copiados da Internet, não entendo muito bem, provavelmente é pedir primeiro um carimbo de tempo e chave pública, depois criptografia RSA e finalmente processar o processamento e enviar para a interface de login do Sina, após fazer login com sucesso pelo Sina, ele retornará um endereço Weibo, você precisa solicitá-lo para que o status de login tenha efeito completo, Após o login bem-sucedido, as requisições subsequentes carregarão o cookie do usuário atual.
0×03 Desenho designado do envelope vermelho
Depois de fazer login com sucesso no Weibo, mal posso esperar para encontrar um envelope vermelho para tentar primeiro, claro, primeiro no navegador. Finalmente, encontrei uma página com um botão vermelho de envelope, F12 invocou o depurador para ver o que o pacote de dados estava solicitando.

Você pode ver que o endereço da solicitação é http://huodong.weibo.com/aj_hongbao/getlucky, há dois parâmetros principais: um é ouid, ou seja, o ID do envelope vermelho, que pode ser visto na URL, o outro parâmetro de compartilhamento determina se compartilhar no Weibo, e há um _t não sei para que serve.
Ok, agora teoricamente, você pode completar a extração dos envelopes vermelhos submetendo três parâmetros para essa URL, mas quando você realmente enviar os parâmetros, verá que o servidor magicamente retornará essa string para você:
[mw_shl_code=java, verdade] {"code":303403,"msg":"Desculpe, você não tem permissão para acessar esta página","data":[]}[/mw_shl_code] Não entre em pânico neste momento, de acordo com meus muitos anos de experiência em desenvolvimento web, o programador da outra parte deve julgar o referenciador, muito simples, copiar todos os cabeçalhos da solicitação anterior.
[mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- desenhar envelope vermelho de:"+str(id)+"---" print "----------......----------" if checkValue(id)==False: #不符合条件, essa é a função return depois        luckyUrl="http://huodong.weibo.com/aj_hongbao/getlucky" param={ 'ouid':id, 'share':0, '_t':0 } cabeçalho= {                '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, como Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(luckyUrl,param, cabeçalho)[/mw_shl_code] Neste caso, não há problema em teoria, mas na verdade não há problema. Após a conclusão da ação da loteria, precisamos julgar o status, e a re retornada é uma string json, onde o código 100000 é bem-sucedido, e se for 90114, é o limite superior da loteria atual, e os outros valores também são falhados, então:
[mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- atingiu o limite máximo---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='10000':#成功 print u"---------Desejo prosperidade---------" print "----------......----------"        log('sucesso',str(id)+'---'+res) exit(0) se hbRes["data"] e 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], onde log também é uma função que personalizo, usada para registrar logs:
[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]





Anterior:Notas sobre limites máximos de upload do PHP
Próximo:download da extensão dll memcache para PHP5.2, 5.3, 5.4, 5.5
 Senhorio| Publicado em 13/02/2015 22:46:37 |
0×04 Rastrear a lista de envelopes vermelhos
Após o teste bem-sucedido de uma única ação de coleta de envelopes vermelhos, ela é o módulo principal de grande movimento do nosso programa – rastrear a lista de envelopes vermelhos, deve haver muitos métodos e entradas para rastrear a lista vermelha, como várias palavras-chave de busca no Weibo e assim por diante, mas eu uso o método mais simples aqui: rastrear a lista de envelopes vermelhos.
Na página inicial (http://huodong.weibo.com/hongbao da atividade do envelope vermelho, por vários pontos mais, tudo pode ser observado, embora a lista esteja muito conectada, ela pode ser resumida em duas categorias (exceto a lista de envelopes vermelhos mais rica): tema e tabela de líderes.
Continuando a invocar F12, analise o formato de ambas as páginas, começando com uma lista de formas temáticas, como: http://huodong.weibo.com/hongbao/special_quyu
Você pode ver que a informação do envelope vermelho está em um div chamado info_wrap, então só precisamos ativar o código-fonte desta página, pegar todos os infowraps e simplesmente processar para obter a lista de envelopes vermelhos desta página, aqui precisamos usar alguns regulares:
[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 Obtenha info_wrap a classe regular 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) se n==0: retorne para i no intervalo(n): #traverse todos os info_wrap div s=pInfo.match(List) #取得红包信息 info=list(s.groups(0))                info[0]=float(info[0].replace('\xcd\xf2','0000')) #现金,ten->0000 tente: info[1]=float(info[1].replace('\xcd\xf2','0000')) #礼品价值 exceto 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 se info[1]==0: info[1]=1 #防止除数为0 info.append(info[0]/(info[2]+info[1])) #红包价值, dinheiro/(número de reivindicados + valor do prêmio) # se info[0]/(info[2]+info[1])>100:                # print url luckyList.append(info) se 'class="page"' em html:#存在下一页 p=p+1 getThemeList(url,p) #递归调用自己爬取下一页[/mw_shl_code]É tão difícil dizer que é tão difícil, e demorou muito para escrever essas duas frases. Também há uma informação aqui no anexo [4], que é meu algoritmo para julgar aproximadamente o valor dos envelopes vermelhos, por que fazer isso? Porque há muitos envelopes vermelhos, mas só podemos tirar quatro vezes, no vasto mar de sacos, precisamos encontrar os envelopes vermelhos mais valiosos e depois desenhá-los, aqui estão três dados para referência: valor em dinheiro, valor do presente e número de destinatários, obviamente se o dinheiro for pequeno e o número de pessoas recebendo muitas pessoas ou o valor do prêmio for super alto (alguns são até loucos em unidades de centenas de milhões), Então não vale a pena pegá-lo, então fiquei muito tempo e finalmente criei um algoritmo para medir o peso dos envelopes vermelhos: valor do envelope vermelho = dinheiro / (número de destinatários + valor do prêmio).
O princípio da página do ranking é o mesmo: encontre as etiquetas de teclas e as compare regularmente.
[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 Obtenha list_info a classe regular 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) se n==0: retorne para i no intervalo(n): #Iterate por todos os info_wrap div s=pInfo.match(List) #取得红包信息 topinfo=list(s.groups(0))                info=lista(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','') #元->'' try: info[1]=float(info[1].replace('\xcd\xf2','0000')) #礼品价值 exceto 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')) #已发送                se info[2]==0: info[2]=1 #防止除数为0 se info[1]==0: info[1]=1 #防止除数为0 info.append(info[0]/(info[2]+info[1])) #红包价值, dinheiro/(número de destinatários + valor do presente)                # if info[0]/(info[2]+info[1])>100: # imprimir url luckyList.append(info) se 'class="page"' em html:#存在下一页 p=p+1                getTopList(url,daily,p) #递归调用自己爬取下一页[/mw_shl_code]Ok, agora podemos rastrear com sucesso a lista das duas páginas especiais, e o próximo passo é obter a lista de listas, ou seja, a coleção de todos esses endereços de lista, e então pegá-los um por um:
[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=', 'roupas':'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'                } for (theme,url) em themeUrl.items(): print "----------"+theme+"----------" print url print "----------......----------"                getThemeList(url,1) for (top,url) em topUrl.items(): print "----------"+top+"----------" print url print "----------......----------"                getTopList(url,0,1) getTopList(url,1,1)[/mw_shl_code]
 Senhorio| Publicado em 13/02/2015 22:47:13 |
0×05 Julgue a disponibilidade de envelopes vermelhos
Isso é relativamente simples: primeiro pesquise por palavras-chave no código-fonte para ver se há um botão vermelho de captura de envelope, e depois vá até o ranking da coleção para ver qual é o maior recorde; se o maior recebe apenas alguns dólares, adeus......
O endereço para visualizar o registro de coleção é http://huodong.weibo.com/aj_hongbao/detailmore?page=1&type=2&_t=0&__rnd=1423744829265&uid=Red ID do envelope

[mw_shl_code=java,true]def checkValue(id): infoUrl='http://huodong.weibo.com/hongbao/'+str(id) html=getData(infoUrl) if 'action-type="lotery"' em html ou True: #存在抢红包按钮                logUrl="http://huodong.weibo.com/aj_hongbao/detailmore?page=1&type=2&_t=0&__rnd=1423744829265&uid="+id #查看排行榜数据 param={} cabeçalho= { '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, como 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 Faça todos list_info regulares luckyLog=pMoney.findall(html,re. DOTALL) se len(luckyLog)==0: maxMoney=0 else: maxMoney=float(luckyLog[0]) se maxMoney <mais baixo: #记录中最大红包小于设定值 return False else: print u"--------- hand downs---------" print "----------......----------" return false        return True[/mw_shl_code]0×06 Trabalho de finalização
Os módulos principais já estão no lugar, e agora todos os passos precisam ser conectados em série:
[mw_shl_code=java,true]def start(username,password,low,fromFile): gl=False lowest=low login(nome de usuário, senha) if fromfile=='y': if os.path.exists('luckyList.txt'):                         try: f = arquivo('luckyList.txt') newList = [] newList = p.load(f)                                print u'--------- load list---------' print "----------......----------" exceto Exception, e: print u' não conseguiu analisar a lista local, rastreando a página online. ' print "----------......----------" gl=True else: print u' não existe localmente luckyList.txt rastrear páginas online. ' print "----------......----------" gl=True if gl==True: getList() from operator import itemgetter                newList=sorted(luckyList, key=itemgetter(4),reverse=True) f = file('luckyList.txt', 'w') p.dump(newList, f) #把抓到的列表存到文件里, então você não precisa pegar f.close() para sorte na próxima vez newList: se não 'http://huodong.weibo.com' em lucky[3]: #不是红包 continue imprimir lucky[3] id=re.findall(r'(\w*[0-9]+)\w*',lucky[3])                getLucky(id[0])[/mw_shl_code] Como é muito complicado rastrear a lista de envelopes vermelhos repetidamente toda vez que é testada, adicionei um parágrafo para despejar a lista completa no código do arquivo, para que você possa ler a lista local e pegar o envelope vermelho no futuro.
[mw_shl_code=java,true]if __name__ == "__main__": print u"------------------ Weibo Red Envelope Assistant------------------" print "---------------------v0.0.1---------------------" print u"------------- por @***----------------" Imprimir "-------------------------------------------------" Tente: uname=raw_input(u"Por favor, insira sua conta no Weibo: ".decode('utf-8').encode('GBK'))                pwd=raw_input(u"Por favor, insira sua senha do Weibo: ".decode('utf-8').encode('gbk')) low=int(raw_input(u"Envelope vermelho para receber o valor máximo maior que n: ".decode('utf-8').encode('gbk')))) fromfile=raw_input(u) Se deve usar a lista de envelopes vermelhos no luckyList.txt: (y/n) ".decode('utf-8').encode('gbk')) exceto Exceção, e: print u" erro de parâmetro" print "----------......----------" print e                exit(0) imprimir u"--------- iniciar o programa---------" imprimir "----------......----------" iniciar(uname,pwd,low,fromfile) imprimir u" --------- fim do programa--------- "imprimir "----------...... ----------" os.system('pausa')[/mw_shl_code]
0×07 Vamos!

Resumo ×07
O esqueleto básico do crawler já foi basicamente concluído, na verdade, ainda há muito espaço para esse crawler jogar em muitos detalhes, como modificá-lo para suportar login em lote, otimizar o algoritmo do valor do envelope vermelho, o código em si também deve ter muitos lugares para otimizar, mas com minha habilidade, estimo que consigo fazer isso.
No fim, todo mundo viu o resultado do programa, escrevi centenas de linhas de código, milhares de palavras de artigos, e tudo o que me esforcei foi um conjunto de bolas bicolores, Nima pit dad, como poderia ser uma bola de duas cores!! (Narrador: Quanto mais o autor falava, mais animado ele ficava, e ele realmente chorava, e as pessoas ao redor persuadiam: Irmão, não é isso, não é só um envelope vermelho do Weibo? Ontem minhas mãos estavam doloridas, e eu não sacudi um envelope vermelho do WeChat.) )

Publicado em 14/02/2015 07:14:33 |
Quanto dinheiro você conseguiu em Loulou?
Publicado em 02/03/2016 13:48:27 |
Parece tão alto
Publicado em 07/03/2016 12:51:02 |
Não sei se é sério
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com