细谈发红包程序-----我的启示录

    现在是网络时代,逢年过节用手机发红包支付的网站也很多,想电脑爱好者网站,PHP开发的CMS,当然还有pig cms,thinkcms等,都支持微信红包支付。细谈发红包程序-----我的启示录_第1张图片细谈发红包程序-----我的启示录_第2张图片

   其微信现金红包接口API开发原理:

红包发放说明

用于企业向微信用户个人发现金红包

目前支持向指定微信用户的openid发放指定金额红包。(获取openid参见微信公众平台开发者文档:网页授权获取用户基本信息)

如需操作请登录

细谈发红包程序-----我的启示录_第3张图片

细谈发红包程序-----我的启示录_第4张图片

接口调用请求说明细谈发红包程序-----我的启示录_第5张图片

请求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位一天内不能重复的数字。

接口根据商户订单号支持重入,如出现超时可再调用。

商户号 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)

接受红包的用户

用户在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元(可联系微信支付[email protected]申请调高额度)
SEND_FAILED 红包发放失败,请更换单号再重试 该红包已经发放失败 如果需要重新发放,请更换单号再发放
FATAL_ERROR openid和原始单参数不一致 更换了openid,但商户单号未更新 请商户检查代码实现逻辑
金额和原始单参数不一致 更换了金额,但商户单号未更新 请商户检查代码实现逻辑 请检查金额、商户订单号是否正确
CA_ERROR CA证书出错,请登录微信支付商户平台下载证书 请求携带的证书出错 到商户平台下载证书,请求带上证书后重试
SIGN_ERROR 签名错误 1、没有使用商户平台设置的商户API密钥进行加密(有可能之前设置过密钥,后来被修改了,没有使用新的密钥进行加密)。
2、加密前没有按照文档进行参数排序(可参考文档)
3、把值为空的参数也进行了签名。可到(http://mch.weixin.qq.com/wiki/tools/signverify/ )验证。
4、如果以上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 超过频率限制,请稍后再试 受频率限制 请对请求做频率控制(可联系微信支付[email protected]申请调高)
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登录。如果您登录时遇到问题,请联系微信支付小助手[email protected]

◆ 下载证书

商户调用微信红包接口时,服务器会进行证书验证,请在商户平台下载证书

细谈发红包程序-----我的启示录_第6张图片

◆ 充值

发放现金红包将扣除商户的可用余额,请注意,可用余额并不是微信支付交易额,需要预先充值,确保可用余额充足。查看可用余额、充值、提现请登录微信支付商户平台,进入“资金管理”菜单,进行操作

细谈发红包程序-----我的启示录_第7张图片

微信红包接口调用流程

◆ 后台API调用:待进入联调过程时与开发进行详细沟通;

◆ 告知服务器:告知服务器接收微信红包的用户openID,告知服务器该用户获得的金额;

◆ 从商务号扣款:服务器获取信息后从对应的商务号扣取对应的金额;

◆ 调用失败:因不符合发送规则,商务号余额不足等原因造成调用失败,反馈至调用方;

◆ 发送成功:以微信红包公众账号发送对应红包至对应用户;图下


细谈发红包程序-----我的启示录_第8张图片

支付宝红包的申请,在有网站的前提下使用Dreamweaver添加支付宝红包源程序,

如下:发红包流程

一、如何发送礼仪红包

1 登录支付宝账户(www.alipay.com), 点击【我的支付宝】—【账户资产】—【红包】—【发红包】。
细谈发红包程序-----我的启示录_第9张图片
2 在“给亲朋好友”页面下方点击【立即发送】。
细谈发红包程序-----我的启示录_第10张图片
3 填写相关信息后,点击【下一步】。
细谈发红包程序-----我的启示录_第11张图片
4 确认填写的信息,输入支付密码,点击【确认发行】。
细谈发红包程序-----我的启示录_第12张图片
5 红包已发行成功。
细谈发红包程序-----我的启示录_第13张图片

 

二、如何发送促销红包(指定人)

1 登录支付宝账户(www.alipay.com), 点击【我的支付宝】—【账户资产】—【红包】—【发红包】, 在【给客户】的页面下方,点击【立即发送】。
细谈发红包程序-----我的启示录_第14张图片
2 填写相关信息后,点击【下一步】。
细谈发红包程序-----我的启示录_第15张图片
3 选择【给指定人发送红包】,输入对方的支付宝账户,点击【下一步】
 
注: 郑重提醒:以交纳保证金、消保基金、资金返还、开通银行卡等为名要求您发放红包的, 都是诈骗。切勿上当受骗!红包一旦发放,将无法追回
细谈发红包程序-----我的启示录_第16张图片
4 确认发行信息后,输入支付密码,点击【确认发行】
细谈发红包程序-----我的启示录_第17张图片
5 促销红包发行成功。 给指定人发放红包是立即到账,不需要等待。
细谈发红包程序-----我的启示录_第18张图片

 

三、如何发送促销红包(获取码)

1 登录支付宝账户(www.alipay.com), 点击【我的支付宝】—【账户资产】—【红包】—【发红包】, 在【给客户】的页面下方,点击【立即发送】。
细谈发红包程序-----我的启示录_第19张图片
2 填写相关信息后,点击【下一步】。
细谈发红包程序-----我的启示录_第20张图片
3 发行方式选择:生成红包获取码,输入发行数量,选择每个账户的限制次数(最多可以选择5次,即:1次、2次、3次、4次、5次),点击【下一步】。
细谈发红包程序-----我的启示录_第21张图片
4 确认发行信息后,输入支付密码,点击【确认发行】。
细谈发红包程序-----我的启示录_第22张图片
5 促销红包发送成功,下方可以下载获取码(卡号和密码) (红包以获取码方式发行的,需把红包卡号和密码告知收红包方)。
细谈发红包程序-----我的启示录_第23张图片

 

四、如何发送促销红包(领取按钮)

1 登录支付宝账户(www.alipay.com), 点击【我的支付宝】—【账户资产】—【红包】—【发红包】, 在【给客户】的页面下方,点击【立即发送】。
细谈发红包程序-----我的启示录_第24张图片
2 填写相关信息后,点击【下一步】。
细谈发红包程序-----我的启示录_第25张图片
3 选择红包发行方式为:生成红包领取按钮,输入发行数量,选择每个账户的限制次数(最多可以选择5次,即:1次、2次、3次、4次、5次),点击【下一步】。
细谈发红包程序-----我的启示录_第26张图片
4 确认发行信息后,输入支付密码,点击【确认发行】。
细谈发红包程序-----我的启示录_第27张图片
5 促销红包发行成功,下方可以用鼠标双击,复制代码发送给对方。
细谈发红包程序-----我的启示录_第28张图片
6 对方收到链接后,需要输入支付宝账户名和登录密码,点击【确认领取】。
细谈发红包程序-----我的启示录_第29张图片
代码要粘贴到你的网站中,表单程序中。

红包程序编程一般用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写抢红包程序

开发图:思维轮廓草图

细谈发红包程序-----我的启示录_第30张图片,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召唤出调试器,看看数据包是咋请求的。

细谈发红包程序-----我的启示录_第31张图片


好,现在理论上向这个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




你可能感兴趣的:(细谈发红包程序-----我的启示录)