この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 13448|答える: 5

科学的に赤い封筒を取る方法:年末には裕福になって、赤い封筒を取るプログラムを書くことができます

[リンクをコピー]
掲載地 2015/02/13 22:44:10 | | | |
0×00 背景

赤い封筒はどんな感じですか? 彼の兄の息子フエルは「お金はほぼ同等だ」と語りました。 兄と娘の道雲は言った。「風のせいで叔母ほど良くないよ。」 「みんな背景はわかってるよ。新年で、赤い封筒が空中に飛び交う日なんだ。 たまたま2日前にPythonを習得して、もっとワクワクしていたので、Weiboの紅封通しを何度も勉強しました。なぜAlipayの赤封じゃなくてWeiboの紅封じゃないのか、私はウェブしか理解できないからです。もしエネルギーがあれば、将来的にモグラ叩きのアルゴリズムも勉強するかもしれません。
私はPython初心者なので、このプログラムはPythonを学んでから書いた3番目のプログラムでもあります。ですから、コードに穴があったら直接突っ込まないでください。焦点はアイデアにあります。もし穴があれば、直接突っ込まないでください。IEはデフォルトブラウザに設定する顔を持っています。私はクズ記事を書くのも許容範囲です......
私はPython 2.7を使っていますが、Python 2とPython 3には大きな違いがあると言われています。
0×01のアイデア
言葉で説明するのが面倒だったので、スケッチを描いてみて、みんなに理解できるはずだと思いました。
まず最初に、昔ながらのルールですが、まずは役立つとわからないけれど、絶対に使えないライブラリを紹介しましょう。
[mw_shl_code=java,true]import re、urllib import urllib2、querylibraryをインポート、base64をインポート、binascii、os import、json、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]ここではPythonにはデフォルトで含まれていないRSAライブラリを使用しています。 インストールが必要です :https://pypi.python.org/pypi/rsa/

ダウンロードしたらインストールを実行し setpy.py、その後開発作業を始められます。
0×02 微博ログイン
赤い封筒を取る動作はログイン後に行う必要があるため、ログイン機能が必要で、ログインはキーではなく、キーはクッキーの保存です。ここではクッキーライブラリの協力が必要です。
[mw_shl_code=java,true]cj = クッキーライブラリ。 CookieJar()opener = urllib2.build_opener(urllib2. HTTPCookieProcessor(cj))urllib2.install_opener(opener)[/mw_shl_code] こうすることで、openerを使うすべてのネットワーク操作がクッキーの状態を処理します。詳しくはわかりませんが、とても使いやすいです。
次に、2つのモジュールをカプセル化する必要があります。1つはデータ取得モジュールで、単にデータを取得するために使われ、もう1つは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() テキストを返しますが例外を除きます。e: print u'Request exception, url: '+url[/mw_shl_code] これら2つのモジュールで、データ取得と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) 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」----------......----------「例外を除く、e: print u」---------ログイン失敗! -------" print "----------......----------" exit(0)[/mw_shl_code]このパラメータや暗号化アルゴリズムはインターネットからコピーしたもので、よく理解できません。おそらく、まずタイムスタンプと公開鍵を要求し、その後RSA暗号化し、最後に処理処理を処理してSinaのログインインターフェースに提出するというものです。Sinaからログインに成功すると、Weiboアドレスが返されます。ログイン状態が完全に有効になるために、それをリクエストする必要があります。 ログインに成功した後、その後のリクエストは現在のユーザーのクッキーを含みます。
0×03 指定赤封筒抽選
Weiboに無事ログインできた後、まずはブラウザで試すために赤い封筒を見つけるのが待ちきれません。 ついに赤い封筒ボタンのあるページを見つけ、F12はデバッガを呼び出してデータパケットの要求を確認しました。

リクエストのアドレスは http://huodong.weibo.com/aj_hongbao/getlucky で、主に2つのパラメータがあります。1つはouid、つまりURLに見られる赤い封筒IDです。もう1つはWeiboに共有するかどうかを決めるshareパラメータです。そして、何のためか分からない_tもあります。
理論的には、このURLに3つのパラメータを提出すれば赤い封筒の抽出は完了できますが、実際にパラメータを提出すると、サーバーが魔法のように次のような文字列を返してくれます。
[mw_shl_code=java、真]{"code":303403,"msg":"すみませんが、このページへのアクセス権限はありません","data":[]}[/mw_shl_code] 今は慌てないでください。私の長年のウェブ開発経験によると、相手のプログラマーはリファラーを判断すべきです。非常にシンプルで、過去のリクエストのすべてのヘッダーをコピーするだけです。
[mw_shl_code=java,true]def getLucky(id): #抽奖程序 print u"--- draw red envelope from:"+str(id)+"---" print "----------......----------" 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、ゲッコのように) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36', 'X-Requested-With':'XMLHttpRequest' } res = postData(luckyUrl,param, mw_shl_codeこの場合、理論上は問題ありませんが、実際には問題はありません。 宝くじアクションが完了した後、状況を判断する必要があります。返されたresはjson文字列で、コード100000が成功、90114なら今日の宝くじの上限値であり、他の値も失敗となります。
[mw_shl_code=java,true]hbRes=json.loads(res)if hbRes["code"]=='901114': #今天红包已经抢完 print u"--------- has passed time---------" print "----------......----------" log('lucky', str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) exit(0)elif hbRes["code"]=='100000':#成功 print u"---------Wishing you prosperity---------" 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アップロードの最大制限に関する注意事項
次に:PHP5.2、5.3、5.4、5.5用のmemcache dll拡張子ダウンロード
 地主| 掲載地 2015/02/13 22:46:37 |
0×04 赤い封筒のリストを這い回る
単一の赤封筒回収アクションのテストが成功した後、それが私たちのプログラムのコアとなる大きな動きモジュールです。赤封筒リストをクロールする際、微博検索キーワードなど多くの方法や入り口があるはずですが、ここでは最も簡単な方法を使っています:赤封筒リストのクロールです。
ホームページ(赤封筒アクティビティの http://huodong.weibo.com/hongbao では、さらに様々なポイントを通じてすべて観察できますが、リストは多くつながっていますが、(最も充実した赤い封筒リストを除く)テーマとリーダーボードの2つのカテゴリーにまとめられます。
F12を召喚し続け、両方のページのフォーマットを分析し、まずトピック形式のリストから始めます。例えば http://huodong.weibo.com/hongbao/special_quyu
赤い封筒の情報はinfo_wrapという名前のdivにあるので、このページのソースコードを有効化し、すべてのインフォラップを取得し、単純に処理すればこのページの赤封筒リストが得られます。ここではいくつかの通常のリストを使う必要があります:
[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) info_wrap #h 通常の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(リスト) n==0の場合:range(n) の i を返す : #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')))#礼品价值 例外を除く                        info[1]=float(info[1].replace('\xd2\xda','000000000')) #礼品价值 info[2]=float(info[2].replace('\xcd\xf2','0000'))) #已发送 ifif[2]==0: info[2]=1 #防止除数为0 info[1]==0の場合:info[1]=1 #防止除数为0 info.append(info[0]/(info[2]+info[1])))#红包价值、現金/(受領者数+賞品価値)# ifif[0]/(info[2]+info[1])>100:                # print url luckyList.append(info) if 'class="page"' in html:#存在下一页 p=p+1 getThemeList(url,p) #递归调用自己爬取下一页[/mw_shl_code]それがとても難しいと言うのはとても難しく、この二文を書くのに長い時間がかかりました。 ここにある情報の付録[4]には、赤い封筒の価値を大まかに判断するための私のアルゴリズムもあります。なぜそうするのか?赤い封筒はたくさんあるのに、私たちは4回しか引けないからです。膨大な袋の海の中で、最も価値のある赤い封筒を見つけて引かなければなりません。参考までに3つのデータがあります:現金価値、贈り物の価値、そして受取人の数。もちろん、現金が少なくて多くの人を受け取る人や賞品の価値が非常に高い場合(中には数億単位で非常に高いものもあります)、 それなら手に取る価値がないので、長い間我慢して、最終的に赤い封筒の重さを測るアルゴリズムを思いつきました:赤封筒の価値 = 現金 / (受取者数 + 賞品価値)。
リーダーボードのルールも同じで、キータグを見つけて定期的にマッチングします。
[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の場合:範囲(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','') #元->'' try: info[1]=float(info[1].replace('\xcd\xf2','0000'))#礼品价值 例外を除く                        info[1]=float(info[1].replace('\xd2\xda','000000000')) #礼品价值 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]))) #红包价值, cash/(受取人数 + ギフト価値)                # if info[0]/(info[2]+info[1])>100: # html:#存在下一页 p=p+1 の場合は url luckyList.append(info) を印刷                getTopList(URL、daily、p) #递归调用自己爬取下一页[/mw_shl_code]さて、これで2つの特殊ページのリストをクロールでき、次のステップはリストのリスト、つまりこれらすべてのリストアドレスの集合を取得し、一つずつ取得することです。
[mw_shl_code=java,true]def getList(): print u"---------Find target---------" print "----------......----------" themeUrl={ #主题列表 'theme':'http://huodong.weibo.com/hongbao/theme',                 『ピンパイ』:http://huodong.weibo.com/hongbao/special_pinpai『daka』:http://huodong.weibo.com/hongbao/special_daka『有宣』: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',                「モストセンドパートナー」:'http://huodong.weibo.com/hongbao/top_mostsendpartner', 'cate':'http://huodong.weibo.com/hongbao/cate?type=', 'clothes':'http://huodong.weibo.com/ ホンバオ/ケイト?タイプ=衣服'、 「美しさ」:「http://huodong.weibo.com/ホンバオ/カテ?タイプ=beauty」、 「速い」:「http://huodong.weibo.com/ホンバオ/カテ?タイプ=fast」、 「人生」:'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'                } themeUrl.items(): print "----------"+theme+""----------" print URL print "----------......----------"                getThemeList(url,1) for (top, url) in topUrl.items(): print "----------"+top+"----------" print URL print "----------......----------"                getTopList(url,0,1) getTopList(url,1,1)[/mw_shl_code]
 地主| 掲載地 2015/02/13 22:47:13 |
0×05 赤い封筒の入手状況を判断してください
これは比較的簡単です。まずソースコード内でキーワードを検索して赤い封筒の掴みボタンがあるか確認し、その後コレクションランキングで最高記録を確認し、もし最高が数ドルしかもらえなければ、さようならです......
回収記録を見る住所は http://huodong.weibo.com/aj_hongbao/detailmore?page=1&type=2&_t=0&__rnd=1423744829265&uid=Red 封筒ID

[mw_shl_code=java,true]def checkValue(id): infoUrl='http://huodong.weibo.com/hongbao/'+str(id) html=getData(infoUrl) 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 pullyLog=pMoney.findall(html,re. DOTALL)の場合、len(luckyLog)==0: maxMoney=0 else: maxMoney=float(luckyLog[0]) if maxMoney<最低値:#记录中最大红包小于设定值 返す false なければ: print u"--------- 手が遅くなる---------" print "----------......----------" return false        返す 真実[/mw_shl_code]0×06 仕上げ作業
主要なモジュールはすでに設置されており、すべてのステップを直列に接続する必要があります:
[mw_shl_code=java,true]def start(username, password, low, fromFile): gl=False lowest=low login(username, password) if fromfile=='y': if 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でなければ: print u' はオンラインページをクロールluckyList.txtローカルには存在しません。 ' 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) #把抓到的列表存到文件里 なので、次回のラッキーのためにf.close()をキャッチする必要はありません newList: Lucky[3]で「http://huodong.weibo.com」でなければ、#不是红包 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"------------------ 微博赤封アシスタント------------------" print "---------------------v0.0.1---------------------" print u"------------- @***----------------" print "-------------------------------------------------" 試してみて:uname=raw_input(u"微博アカウントを入力してください: ".decode('utf-8').encode('gbk')))                pwd=raw_input(u"Weiboパスワードを入力してください: ".decode('utf-8').encode('gbk'))) low=int(raw_input(u"nより大きい現金を受け取るための赤封筒: ".decode('utf-8').encode('gbk'))) fromfile=raw_input(u) luckyList.txtの赤い封筒リストを使うかどうか:(y/n) ".decode('utf-8').encode('gbk'))) 例外を除き、e: print u" parameter error" print "----------......----------" print e                exit(0) print u"--------- program start---------" print "----------......----------" start(uname, pwd, low, fromfile) print u" --------- program end--------- "print "----------...... ----------" os.system('pause')[/mw_shl_code]
0×07 行こう!

0×07 概要
基本的なクローラーの骨組みはほぼ完成しており、実際、バッチログイン対応の修正や赤封筒値アルゴリズムの最適化など、多くの細部でクローラーを動かす余地がまだたくさんあります。コード自体にも最適化すべき箇所はたくさんあるはずですが、私の能力ではこれならできると見積もっています。
結局、みんながプログラムの結果を見て、私は何百行ものコードを書き、何千語もの記事を書き、努力して手に入れたのはただの二色のボールのセットだけでした。ニマ・ピット・パパ、どうして二色のボールなんてあり得るの!! (ナレーター:作者が話せば話すほど興奮し、実際に泣き、周囲の人たちもこう説得した。「兄さん、そうじゃないよ。昨日は手が痛くて、WeChatの赤い封筒も振らなかっただけだよ。」と。 )

掲載地 2015/02/14 7:14:33 |
ルルーでいくら稼いだ?
掲載地 2016/03/02 13:48:27 |
すごく背が高いみたいだ
掲載地 2016/03/07 12:51:02 |
深刻かどうかはわかりません
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com