細談發紅包程序-----個人啓示錄

    如今是網絡時代,逢年過節用手機發紅包支付的網站也不少,想電腦愛好者網站,PHP開發的CMS,固然還有pig cms,thinkcms等,都支持微信紅包支付。 php

   其微信現金紅包接口API開發原理: html

紅包發放說明

用於企業向微信用戶我的發現金紅包 python

目前支持向指定微信用戶的openid發放指定金額紅包。(獲取openid參見微信公衆平臺開發者文檔:網頁受權獲取用戶基本信息 程序員

如需操做請登陸 ajax

紅包發放說明

紅包發放說明

接口調用請求說明

請求Url https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack
是否須要證書 是(證書及使用說明詳見商戶證書
請求方式 POST

請求參數

字段名 字段 必填 示例值 類型 說明
隨機字符串 nonce_str 5K8264ILTKCH16CQ2502SI8ZNMTM67VS String(32) 隨機字符串,不長於32位
簽名 sign C380BEC2BFD727A4B6845133519F3AD6 String(32) 詳見簽名生成算法
商戶訂單號 mch_billno 10000098201411111234567890 String(28)

商戶訂單號(每一個訂單號必須惟一) 算法

組成:mch_id+yyyymmdd+10位一天內不能重複的數字。 編程

接口根據商戶訂單號支持重入,如出現超時可再調用。 json

商戶號 mch_id 10000098 String(32) 微信支付分配的商戶號
公衆帳號appid wxappid wx8888888888888888 String(32) 微信分配的公衆帳號ID(企業號corpid即爲此appId)。接口傳入的全部appid應該爲公衆號的appid(在mp.weixin.qq.com申請的),不能爲APP的appid(在open.weixin.qq.com申請的)。
商戶名稱 send_name 天虹百貨 String(32) 紅包發送者名稱
用戶openid re_openid oxTWIuGaIt6gTKsQRLau2M0yL16E String(32)

接受紅包的用戶 api

用戶在wxappid下的openid 瀏覽器

付款金額 total_amount 1000 int 付款金額,單位分
紅包發放總人數 total_num 1 int

紅包發放總人數

total_num=1

紅包祝福語 wishing 感謝您參加猜燈謎活動,祝您元宵節快樂! String(128) 紅包祝福語
Ip地址 client_ip 192.168.0.1 String(15) 調用接口的機器Ip地址
活動名稱 act_name 猜燈謎搶紅包活動 String(32) 活動名稱
備註 remark 猜越多得越多,快來搶! String(256) 備註信息

數據示例:

<xml>

<sign><![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]></sign>

<mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>

<mch_id><![CDATA[888]]></mch_id>

<wxappid><![CDATA[wxcbda96de0b165486]]></wxappid>

<send_name><![CDATA[send_name]]></send_name>

<re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>

<total_amount><![CDATA[200]]></total_amount>

<total_num><![CDATA[1]]></total_num>

<wishing><![CDATA[恭喜發財]]></wishing>

<client_ip><![CDATA[127.0.0.1]]></client_ip>

<act_name><![CDATA[新年紅包]]></act_name>

<remark><![CDATA[新年紅包]]></remark>

<nonce_str><![CDATA[50780e0cca98c8c8e814883e5caa672e]]></nonce_str>

</xml>

返回參數

字段名 變量名 必填 示例值 類型 說明
返回狀態碼 return_code SUCCESS String(16)

SUCCESS/FAIL

此字段是通訊標識,非交易標識,交易是否成功須要查看result_code來判斷

返回信息 return_msg 簽名失敗 String(128)

返回信息,如非空,爲錯誤緣由

簽名失敗

參數格式校驗錯誤

如下字段在return_code爲SUCCESS的時候有返回
簽名 sign C380BEC2BFD727A4B6845133519F3AD6 String(32) 生成簽名方式詳見簽名生成算法
業務結果 result_code SUCCESS String(16) SUCCESS/FAIL
錯誤代碼 err_code SYSTEMERROR String(32) 錯誤碼信息
錯誤代碼描述 err_code_des 系統錯誤 String(128) 結果信息描述
如下字段在return_code和result_code都爲SUCCESS的時候有返回
商戶訂單號 mch_billno 10000098201411111234567890 String(28)

商戶訂單號(每一個訂單號必須惟一)

組成:mch_id+yyyymmdd+10位一天內不能重複的數字

商戶號 mch_id 10000098 String(32) 微信支付分配的商戶號
公衆帳號appid wxappid wx8888888888888888 String(32) 商戶appid,接口傳入的全部appid應該爲公衆號的appid(在mp.weixin.qq.com申請的),不能爲APP的appid(在open.weixin.qq.com申請的)。
用戶openid re_openid oxTWIuGaIt6gTKsQRLau2M0yL16E String(32)

接受收紅包的用戶

用戶在wxappid下的openid

付款金額 total_amount 1000 int 付款金額,單位分
發放成功時間 send_time 20150520102602 int 紅包發送時間
微信單號 send_listid 100000000020150520314766074200 String(32) 紅包訂單的微信單號

成功示例:

<xml>

<return_code><![CDATA[SUCCESS]]></return_code>

<return_msg><![CDATA[發放成功.]]></return_msg>

<result_code><![CDATA[SUCCESS]]></result_code>

<err_code><![CDATA[0]]></err_code>

<err_code_des><![CDATA[發放成功.]]></err_code_des>

<mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>

<mch_id>10010404</mch_id>

<wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid>

<re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>

<total_amount>1</total_amount>

<send_listid>100000000020150520314766074200</send_listid>

<send_time>20150520102602</send_time>

</xml>

失敗示例:

<xml>

<return_code><![CDATA[FAIL]]></return_code>

<return_msg><![CDATA[系統繁忙,請稍後再試.]]></return_msg>

<result_code><![CDATA[FAIL]]></result_code>

<err_code><![CDATA[268458547]]></err_code>

<err_code_des><![CDATA[系統繁忙,請稍後再試.]]></err_code_des>

<mch_billno><![CDATA[0010010404201411170000046542]]></mch_billno>

<mch_id>10010404</mch_id>

<wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid>

<re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>

<total_amount>1</total_amount>

</xml>

錯誤碼

錯誤碼 錯誤描述 緣由 解決方式
NO_AUTH 發放失敗,此請求可能存在風險,已被微信攔截 用戶帳號異常,被攔截 請提醒用戶檢查自身賬號是否異常。使用經常使用的活躍的微信號可避免這種狀況。
SENDNUM_LIMIT 該用戶今日領取紅包個數超過限制 該用戶今日領取紅包個數超過你在微信支付商戶平臺配置的上限 若有須要、請在微信支付商戶平臺【api安全】中從新配置 【每日同一用戶領取本商戶紅包不容許超過的個數】。
ILLEGAL_APPID 非法appid,請確認是否爲公衆號的appid,不能爲APP的appid 錯誤傳入了app的appid 接口傳入的全部appid應該爲公衆號的appid(在mp.weixin.qq.com申請的),不能爲APP的appid(在open.weixin.qq.com申請的)。
MONEY_LIMIT 紅包金額發放限制 發送紅包金額再也不限制範圍內 每一個紅包金額必須大於1元,小於200元(可聯繫微信支付wxhongbao@tencent.com申請調高額度)
SEND_FAILED 紅包發放失敗,請更換單號再重試 該紅包已經發放失敗 若是須要從新發放,請更換單號再發放
FATAL_ERROR openid和原始單參數不一致 更換了openid,但商戶單號未更新 請商戶檢查代碼實現邏輯
金額和原始單參數不一致 更換了金額,但商戶單號未更新 請商戶檢查代碼實現邏輯 請檢查金額、商戶訂單號是否正確
CA_ERROR CA證書出錯,請登陸微信支付商戶平臺下載證書 請求攜帶的證書出錯 到商戶平臺下載證書,請求帶上證書後重試
SIGN_ERROR 簽名錯誤 一、沒有使用商戶平臺設置的商戶API密鑰進行加密(有可能以前設置過密鑰,後來被修改了,沒有使用新的密鑰進行加密)。
二、加密前沒有按照文檔進行參數排序(可參考文檔)
三、把值爲空的參數也進行了簽名。可到(http://mch.weixin.qq.com/wiki/tools/signverify/ )驗證。
四、若是以上3步都沒有問題,把請求串中(post的數據)裏面中文都去掉,換成英文,試下,看看是不是編碼問題。(post的數據要求是utf8)
1. 到商戶平臺從新設置新的密鑰後重試
2. 檢查請求參數把空格去掉重試
3. 中文不須要進行encode,使用CDATA
4. 按文檔要求生成簽名後再重試
在線簽名驗證工具:http://mch.weixin.qq.com/wiki/tools/signverify/
SYSTEMERROR 請求已受理,請稍後使用原單號查詢發放結果 系統無返回明確發放結果 使用原單號調用接口,查詢發放結果,若是使用新單號調用接口,視爲新發放請求
XML_ERROR 輸入xml參數格式錯誤 請求的xml格式錯誤,或者post的數據爲空 檢查請求串,確認無誤後重試
FREQ_LIMIT 超過頻率限制,請稍後再試 受頻率限制 請對請求作頻率控制(可聯繫微信支付wxhongbao@tencent.com申請調高)
NOTENOUGH 賬號餘額不足,請到商戶平臺充值後再重試 帳戶餘額不足 充值後重試
OPENID_ERROR openid和appid不匹配 openid和appid不匹配 發紅包的openid必須是本appid下的openid
PARAM_ERROR act_name字段必填,而且少於32個字符 請求的act_name字段填寫錯誤 填寫正確的act_name後重試
發放金額、最小金額、最大金額必須相等 請求的金額相關字段填寫錯誤 按文檔要求填寫正確的金額後重試
紅包金額參數錯誤 紅包金額過大 修改金額重試
appid字段必填,最長爲32個字符 請求的appid字段填寫錯誤 填寫正確的appid後重試
訂單號字段必填,最長爲28個字符 請求的mch_billno字段填寫錯誤 填寫正確的billno後重試
client_ip必須是合法的IP字符串 請求的client_ip填寫不正確 填寫正確的IP後重試
輸入的商戶號有誤 請求的mchid字段非法(或者沒填) 填寫對應的商戶號再重試
找不到對應的商戶號 請求的mchid字段填寫錯誤 填寫正確的mchid字段後重試
nick_name字段必填,而且少於16字符 請求的nick_name字段錯誤 按文檔填寫正確的nick_name後重試
nonce_str字段必填,而且少於32字符 請求的nonce_str字段填寫不正確 按文檔要求填寫正確的nonce_str值後重試
re_openid字段爲必填而且少於32個字符 請求的re_openid字段非法 填寫對re_openid後重試
remark字段爲必填,而且少於256字符 請求的remark字段填寫錯誤 填寫正確的remark後重試
send_name字段爲必填而且少於32字符 請求的send_name字段填寫不正確 按文檔填寫正確的send_name字段後重試
total_num必須爲1 total_num字段值不爲1 修改total_num值爲1後重試
wishing字段爲必填,而且少於128個字符 缺乏wishing字段 填寫wishing字段再重試
商戶號和wxappid不匹配 商戶號和wxappid不匹配 請修改Mchid或wxappid參數
CMS如何調用支付接口:

登陸微信支付商戶平臺下載證書以及充值

在調用接口前,請商戶使用微信支付商戶號登陸微信支付商戶平臺完成下述工做:

備註:

微信支付商戶平臺地址爲pay.weixin.qq.com。微信支付商戶號會在商戶申請微信支付成功後,經過開戶郵件發送給您。請不要使用微信公衆平臺帳號或者appid登陸。若是您登陸時遇到問題,請聯繫微信支付小助手weixinpay@tencent.com

◆ 下載證書

商戶調用微信紅包接口時,服務器會進行證書驗證,請在商戶平臺下載證書

下載證書

◆ 充值

發放現金紅包將扣除商戶的可用餘額,請注意,可用餘額並非微信支付交易額,須要預先充值,確保可用餘額充足。查看可用餘額、充值、提現請登陸微信支付商戶平臺,進入「資金管理」菜單,進行操做

充值

微信紅包接口調用流程

◆ 後臺API調用:待進入聯調過程時與開發進行詳細溝通;

◆ 告知服務器:告知服務器接收微信紅包的用戶openID,告知服務器該用戶得到的金額;

◆ 從商務號扣款:服務器獲取信息後從對應的商務號扣取對應的金額;

◆ 調用失敗:因不符合發送規則,商務號餘額不足等緣由形成調用失敗,反饋至調用方;

◆ 發送成功:以微信紅包公衆帳號發送對應紅包至對應用戶;圖下


支付寶紅包的申請,在有網站的前提下使用Dreamweaver添加支付寶紅包源程序,

以下:發紅包流程

1、如何發送禮儀紅包

1 登陸支付寶帳戶(www.alipay.com), 點擊【個人支付寶】—【帳戶資產】—【紅包】—【發紅包】。
2 在「給親朋好友」頁面下方點擊【當即發送】。
3 填寫相關信息後,點擊【下一步】。
4 確認填寫的信息,輸入支付密碼,點擊【確認發行】。
5 紅包已發行成功。

 

2、如何發送促銷紅包(指定人)

1 登陸支付寶帳戶(www.alipay.com), 點擊【個人支付寶】—【帳戶資產】—【紅包】—【發紅包】, 在【給客戶】的頁面下方,點擊【當即發送】。
2 填寫相關信息後,點擊【下一步】。
3 選擇【給指定人發送紅包】,輸入對方的支付寶帳戶,點擊【下一步】
 
注: 鄭重提醒:以交納保證金、消保基金、資金返還、開通銀行卡等爲名要求您發放紅包的, 都是詐騙。切勿上當受騙!紅包一旦發放,將沒法追回
4 確認發行信息後,輸入支付密碼,點擊【確認發行】
5 促銷紅包發行成功。 給指定人發放紅包是當即到帳,不須要等待。

 

3、如何發送促銷紅包(獲取碼)

1 登陸支付寶帳戶(www.alipay.com), 點擊【個人支付寶】—【帳戶資產】—【紅包】—【發紅包】, 在【給客戶】的頁面下方,點擊【當即發送】。
2 填寫相關信息後,點擊【下一步】。
3 發行方式選擇:生成紅包獲取碼,輸入發行數量,選擇每一個帳戶的限制次數(最多能夠選擇5次,即:1次、2次、3次、4次、5次),點擊【下一步】。
4 確認發行信息後,輸入支付密碼,點擊【確認發行】。
5 促銷紅包發送成功,下方能夠下載獲取碼(卡號和密碼) (紅包以獲取碼方式發行的,需把紅包卡號和密碼告知收紅包方)。

 

4、如何發送促銷紅包(領取按鈕)

1 登陸支付寶帳戶(www.alipay.com), 點擊【個人支付寶】—【帳戶資產】—【紅包】—【發紅包】, 在【給客戶】的頁面下方,點擊【當即發送】。
2 填寫相關信息後,點擊【下一步】。
3 選擇紅包發行方式爲:生成紅包領取按鈕,輸入發行數量,選擇每一個帳戶的限制次數(最多能夠選擇5次,即:1次、2次、3次、4次、5次),點擊【下一步】。
4 確認發行信息後,輸入支付密碼,點擊【確認發行】。
5 促銷紅包發行成功,下方能夠用鼠標雙擊,複製代碼發送給對方。
6 對方收到連接後,須要輸入支付寶帳戶名和登陸密碼,點擊【確認領取】。
代碼要粘貼到你的網站中,表單程序中。

紅包程序編程通常用PHP。

C語言寫的紅包算法程序,code以下:

#coding=gbk
import random
import sys
#print random.randint(0, 99)
#print "====", random.uniform(0, 0.99)
def calRandomValue(min, max, total, num):
print min, max, total, num
total = float(total)
num = int(num)
min = 0.01
if(num < 1): 
return
if num == 1:
print "第%d我的拿到紅包數爲:%.2f" %(num, total)
return

i = 1
total_money = total
#rtotal = (total*100 - min*num*100)/100
while( i < num ):
max = total_money - min*(num- i)
k = int((num-i)/2)
if num -i <= 2:
k = num -i
max = max/k
monney = random.randint(int(min*100), int(max*100))
monney = float(monney)/100
total_money = total_money - monney
print "第%d我的拿到紅包數爲:%.2f, 餘額爲: %.2f" %(i, monney, total_money)
i += 1

print "第%d我的拿到紅包數爲:%.2f, 餘額爲: %.2f" %(i, total_money, 0.0)
if __name__ == "__main__":
min = sys.argv[1]
max = sys.argv[2]
total = sys.argv[3]
num = sys.argv[4]
calRandomValue(min, max, total, num)
python 2.py 0.01 10 20 30
0.01 10 20 30
第1我的拿到紅包數爲:1.34, 餘額爲: 18.66
第2我的拿到紅包數爲:1.06, 餘額爲: 17.60
第3我的拿到紅包數爲:1.08, 餘額爲: 16.52
第4我的拿到紅包數爲:0.98, 餘額爲: 15.54
第5我的拿到紅包數爲:0.88, 餘額爲: 14.66
第6我的拿到紅包數爲:0.48, 餘額爲: 14.18
第7我的拿到紅包數爲:0.26, 餘額爲: 13.92
第8我的拿到紅包數爲:0.90, 餘額爲: 13.02
第9我的拿到紅包數爲:0.12, 餘額爲: 12.90
第10我的拿到紅包數爲:0.41, 餘額爲: 12.49
第11我的拿到紅包數爲:0.43, 餘額爲: 12.06
第12我的拿到紅包數爲:0.63, 餘額爲: 11.43
第13我的拿到紅包數爲:0.36, 餘額爲: 11.07
第14我的拿到紅包數爲:0.25, 餘額爲: 10.82
第15我的拿到紅包數爲:1.38, 餘額爲: 9.44
第16我的拿到紅包數爲:0.17, 餘額爲: 9.27
第17我的拿到紅包數爲:0.79, 餘額爲: 8.48
第18我的拿到紅包數爲:0.52, 餘額爲: 7.96
第19我的拿到紅包數爲:0.44, 餘額爲: 7.52
第20我的拿到紅包數爲:1.15, 餘額爲: 6.37
第21我的拿到紅包數爲:0.13, 餘額爲: 6.24
第22我的拿到紅包數爲:0.76, 餘額爲: 5.48
第23我的拿到紅包數爲:1.32, 餘額爲: 4.16
第24我的拿到紅包數爲:0.80, 餘額爲: 3.36
第25我的拿到紅包數爲:0.16, 餘額爲: 3.20
第26我的拿到紅包數爲:0.27, 餘額爲: 2.93
第27我的拿到紅包數爲:1.82, 餘額爲: 1.11
第28我的拿到紅包數爲:0.45, 餘額爲: 0.66
第29我的拿到紅包數爲:0.27, 餘額爲: 0.39
第30我的拿到紅包數爲:0.39, 餘額爲: 0.00

固然你熟悉Python語言,使用Python寫搶紅包程序

開發圖:思惟輪廓草圖

,first,寫Python庫代碼

import re import urllib import urllib2 import cookielib import base64  import binascii  import os import json import sys  import cPickle as p import rsa

而後順便聲明一些其它變量,之後須要用到:

reload(sys) sys.setdefaultencoding('utf-8&') #將字符編碼置爲utf-8 luckyList=[] #紅包列表 lowest=10 #能忍受紅包領獎記錄最低爲多少

這裏用到了一個rsa庫,Python默認是不自帶的,須要安裝一下:https://pypi.python.org/pypi/rsa/

下載下來後運行setpy.py install安裝,而後就能夠開始咱們的開發步驟了。

微博登錄

搶紅包的動做必定要登錄後才能夠進行的,因此必定要有登陸的功能,登陸不是關鍵,關鍵是cookie的保存,這裏須要cookielib的配合。

cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener)

這樣凡是使用opener進行的網絡操做都會對處理cookie的狀態,雖然我也不太懂可是感受好神奇的樣子。

接下來須要封裝兩個模塊,一個是獲取數據模塊,用來單純地GET數據,另外一個用來POST數據,其實只是多了幾個參數,徹底能夠合併成一個函數,可是我又懶又笨,不想也不會改代碼。

def getData(url) :
        try:
                req  = urllib2.Request(url)
                result = opener.open(req)
                text = result.read()
                text=text.decode("utf-8").encode("gbk",'ignore')
                return text
        except Exception, e:
                print u'請求異常,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
        except Exception, e:
                print u'請求異常,url:'+url

有了這兩個模塊咱們就能夠GET和POST數據了,其中getData中之因此decode而後又encode啥啥的,是由於在Win7下我調試輸出的時候總亂碼,因此加了些編碼處理,這些都不是重點,下面的login函數纔是微博登錄的核心。

def login(nick , pwd) :       
  print u"----------登陸中----------"        
 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 (compatible; 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("location.replace\(\'(.+?)\'\);" , s)[0]                 login=getData(urll)                 print u"---------登陸成功!-------"                 print  "----------......----------"         except Exception, e:                 print u"---------登陸失敗!-------"                 print  "----------......----------"                 exit(0)

 指定紅包抽取

成功登陸微博後,我已火燒眉毛地想找個紅包先試一會兒,固然首先是要在瀏覽器裏試的。點啊點啊點啊點的,終於找到了一個帶搶紅包按鈕的頁面了,F12召喚出調試器,看看數據包是咋請求的。


好,如今理論上向這個url提交者三個參數,就能夠完成一次紅包的抽取,可是,當你真正提交參數的時候,就會發現服務器會很神奇地給你返回這麼個串:

{"code":303403,"msg":"抱歉,你沒有權限訪問此頁面","data":[]}

這個時候不要驚慌,根據我多年Web開發經驗,對方的程序員應該是判斷referer了,很簡單,把請求過去的header全給抄過去。

def getLucky(id): #抽獎程序         print u"---抽紅包中:"+str(id)+"---"         print  "----------......----------"           if 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, like Gecko) Chrome/33.0.1750.146 BIDUBrowser/6.x Safari/537.36',                 'X-Requested-With':'XMLHttpRequest'                 }         res = postData(luckyUrl,param,header)

這樣的話理論上就沒啥問題了,事實上其實也沒啥問題。抽獎動做完成後咱們是須要判斷狀態的,返回的res是一個json串,其中code爲100000時爲成功,爲90114時是今天抽獎達到上限,其餘值一樣是失敗,因此:

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)   if hbRes["data"] and hbRes["data"]["title"]:         print hbRes["data"]["title"]         print  "----------......----------"         log('lucky',str(id)+'---'+str(hbRes["code"])+'---'+hbRes["data"]["title"]) else:         print u"---------請求錯誤---------"         print  "----------......----------"         log('lucky',str(id)+'---'+res)

其中log也是我自定義的一個函數,用來記錄日誌用的:

def log(type,text):         fp = open(type+'.txt','a')         fp.write(text)         fp.write('\r\n')         fp.close()

爬取紅包列表

單個紅包領取動做測試成功後,就是咱們程序的核心大招模塊了——爬取紅包列表,爬取紅包列表的方法和入口應該有很多,好比各類微博搜索關鍵字啥啥的,不過我這裏用最簡單的方法:爬取紅包榜單。

adiOS
相關文章
相關標籤/搜索