参数错误:wishing字段为phalcon 必填字段并且少于128个字符.

细谈发红包程序-----我的启示录-爱编程
细谈发红包程序-----我的启示录
& & 现在是网络时代,红包支付的网站也很多,想电脑爱好者网站,PHP开发的CMS,当然还有pig cms,thinkcms等,都支持微信红包支付。
& &其微信现金红包接口API开发原理:
红包发放说明
用于企业向微信用户个人发现金红包
目前支持向指定微信用户的openid发放指定金额红包。(获取openid参见微信公众平台开发者文档:)
如需操作请登录
接口调用请求说明
https://api.mch./mmpaymkttransfers/sendredpack
是否需要证书
是(证书及使用说明详见)
随机字符串
5K8264ILTKCH16CQ2502SI8ZNMTM67VS
String(32)
随机字符串,不长于32位
C380BEC2BFD727A4BF3AD6
String(32)
商户订单号
mch_billno
String(28)
商户订单号(每个订单号必须唯一)
组成:mch_id+yyyymmdd+10位一天内不能重复的数字。
接口根据商户订单号支持重入,如出现超时可再调用。
String(32)
微信支付分配的商户号
公众账号appid
String(32)
微信分配的公众账号ID(企业号corpid即为此appId)。接口传入的所有appid应该为公众号的appid(在mp.申请的),不能为APP的appid(在open.申请的)。
String(32)
红包发送者名称
用户openid
oxTWIuGaIt6gTKsQRLau2M0yL16E
String(32)
接受红包的用户
用户在wxappid下的openid
total_amount
付款金额,单位分
红包发放总人数
红包发放总人数
total_num=1
红包祝福语
感谢您参加猜灯谜活动,祝您元宵节快乐!
String(128)
红包祝福语
192.168.0.1
String(15)
调用接口的机器Ip地址
猜灯谜抢红包活动
String(32)
猜越多得越多,快来抢!
String(256)
数据示例:
&sign&&![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]&&/sign&
&mch_billno&&![CDATA[6545]]&&/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[50780e0cca98c8c8ecaa672e]]&&/nonce_str&
返回状态码
return_code
String(16)
SUCCESS/FAIL
此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断
return_msg
String(128)
返回信息,如非空,为错误原因
参数格式校验错误
以下字段在return_code为SUCCESS的时候有返回
C380BEC2BFD727A4BF3AD6
String(32)
生成签名方式详见
result_code
String(16)
SUCCESS/FAIL
SYSTEMERROR
String(32)
错误码信息
错误代码描述
err_code_des
String(128)
结果信息描述
以下字段在return_code和result_code都为SUCCESS的时候有返回
商户订单号
mch_billno
String(28)
商户订单号(每个订单号必须唯一)
组成:mch_id+yyyymmdd+10位一天内不能重复的数字
String(32)
微信支付分配的商户号
公众账号appid
String(32)
商户appid,接口传入的所有appid应该为公众号的appid(在mp.申请的),不能为APP的appid(在open.申请的)。
用户openid
oxTWIuGaIt6gTKsQRLau2M0yL16E
String(32)
接受收红包的用户
用户在wxappid下的openid
total_amount
付款金额,单位分
发放成功时间
红包发送时间
send_listid
String(32)
红包订单的微信单号
成功示例:
&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[6545]]&&/mch_billno&
&mch_id&&/mch_id&
&wxappid&&![CDATA[wx6fa7e3bab7e15415]]&&/wxappid&
&re_openid&&![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]&&/re_openid&
&total_amount&1&/total_amount&
&send_listid&074200&/send_listid&
&send_time&02&/send_time&
失败示例:
&return_code&&![CDATA[FAIL]]&&/return_code&
&return_msg&&![CDATA[系统繁忙,请稍后再试.]]&&/return_msg&
&result_code&&![CDATA[FAIL]]&&/result_code&
&err_code&&![CDATA[]]&&/err_code&
&err_code_des&&![CDATA[系统繁忙,请稍后再试.]]&&/err_code_des&
&mch_billno&&![CDATA[6542]]&&/mch_billno&
&mch_id&&/mch_id&
&wxappid&&![CDATA[wx6fa7e3bab7e15415]]&&/wxappid&
&re_openid&&![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]&&/re_openid&
&total_amount&1&/total_amount&
发放失败,此请求可能存在风险,已被微信拦截
用户账号异常,被拦截
请提醒用户检查自身帐号是否异常。使用常用的活跃的微信号可避免这种情况。
SENDNUM_LIMIT
该用户今日领取红包个数超过限制
该用户今日领取红包个数超过你在微信支付商户平台配置的上限
如有需要、请在微信支付商户平台【api安全】中重新配置 【每日同一用户领取本商户红包不允许超过的个数】。
ILLEGAL_APPID
非法appid,请确认是否为公众号的appid,不能为APP的appid
错误传入了app的appid
接口传入的所有appid应该为公众号的appid(在mp.申请的),不能为APP的appid(在open.申请的)。
MONEY_LIMIT
红包金额发放限制
发送红包金额不再限制范围内
每个红包金额必须大于1元,小于200元(可联系微信支付申请调高额度)
SEND_FAILED
红包发放失败,请更换单号再重试
该红包已经发放失败
如果需要重新发放,请更换单号再发放
FATAL_ERROR
openid和原始单参数不一致
更换了openid,但商户单号未更新
请商户检查代码实现逻辑
金额和原始单参数不一致
更换了金额,但商户单号未更新
请商户检查代码实现逻辑
请检查金额、商户订单号是否正确
CA证书出错,请登录微信支付商户平台下载证书
请求携带的证书出错
到商户平台下载证书,请求带上证书后重试
SIGN_ERROR
1、没有使用商户平台设置的商户API密钥进行加密(有可能之前设置过密钥,后来被修改了,没有使用新的密钥进行加密)。 2、加密前没有按照文档进行参数排序(可参考文档) 3、把值为空的参数也进行了签名。可到(http://mch./wiki/tools/signverify/ )验证。 4、如果以上3步都没有问题,把请求串中(post的数据)里面中文都去掉,换成英文,试下,看看是否是编码问题。(post的数据要求是utf8)
1. 到商户平台重新设置新的密钥后重试 2. 检查请求参数把空格去掉重试 3. 中文不需要进行encode,使用CDATA 4. 按文档要求生成签名后再重试 在线签名验证工具:http://mch./wiki/tools/signverify/
SYSTEMERROR
请求已受理,请稍后使用原单号查询发放结果
系统无返回明确发放结果
使用原单号调用接口,查询发放结果,如果使用新单号调用接口,视为新发放请求
输入xml参数格式错误
请求的xml格式错误,或者post的数据为空
检查请求串,确认无误后重试
FREQ_LIMIT
超过频率限制,请稍后再试
受频率限制
请对请求做频率控制(可联系微信支付申请调高)
帐号余额不足,请到商户平台充值后再重试
账户余额不足
充值后重试
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.。微信支付商户号会在商户申请微信支付成功后,通过开户邮件发送给您。请不要使用微信公众平台账号或者appid登录。如果您登录时遇到问题,请联系微信支付小助手
◆ 下载证书
商户调用微信红包接口时,服务器会进行证书验证,请在商户平台下载证书
发放现金红包将扣除商户的可用余额,请注意,可用余额并不是微信支付交易额,需要预先充值,确保可用余额充足。查看可用余额、充值、提现请登录微信支付商户平台,进入“资金管理”菜单,进行操作
微信红包接口调用流程
◆ 后台API调用:待进入联调过程时与开发进行详细沟通;
◆ 告知服务器:告知服务器接收微信红包的用户openID,告知服务器该用户获得的金额;
◆ 从商务号扣款:服务器获取信息后从对应的商务号扣取对应的金额;
◆ 调用失败:因不符合发送规则,商务号余额不足等原因造成调用失败,反馈至调用方;
◆ 发送成功:以微信红包公众账号发送对应红包至对应用户;图下
支付宝红包的申请,在有网站的前提下使用Dreamweaver添加支付宝红包源程序,
如下:发红包流程
一、如何发送礼仪红包
1&登录支付宝账户(), 点击【我的支付宝】—【账户资产】—【红包】—【发红包】。
2&在“给亲朋好友”页面下方点击【立即发送】。
3&填写相关信息后,点击【下一步】。
4&确认填写的信息,输入支付密码,点击【确认发行】。
5&红包已发行成功。
二、如何发送促销红包(指定人)
1&登录支付宝账户(), 点击【我的支付宝】—【账户资产】—【红包】—【发红包】, 在【给客户】的页面下方,点击【立即发送】。
2&填写相关信息后,点击【下一步】。
3&选择【给指定人发送红包】,输入对方的支付宝账户,点击【下一步】
注:&郑重提醒:以交纳保证金、消保基金、资金返还、开通银行卡等为名要求您发放红包的, 都是诈骗。切勿上当受骗!红包一旦发放,将无法追回
4&确认发行信息后,输入支付密码,点击【确认发行】
5&促销红包发行成功。 给指定人发放红包是立即到账,不需要等待。
三、如何发送促销红包(获取码)
1&登录支付宝账户(), 点击【我的支付宝】—【账户资产】—【红包】—【发红包】, 在【给客户】的页面下方,点击【立即发送】。
2&填写相关信息后,点击【下一步】。
3&发行方式选择:生成红包获取码,输入发行数量,选择每个账户的限制次数(最多可以选择5次,即:1次、2次、3次、4次、5次),点击【下一步】。
4&确认发行信息后,输入支付密码,点击【确认发行】。
5&促销红包发送成功,下方可以下载获取码(卡号和密码) (红包以获取码方式发行的,需把红包卡号和密码告知收红包方)。
四、如何发送促销红包(领取按钮)
1&登录支付宝账户(), 点击【我的支付宝】—【账户资产】—【红包】—【发红包】, 在【给客户】的页面下方,点击【立即发送】。
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默认是不自带的,需要安装一下:
下载下来后运行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&=&'.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.15)&_=6'&%&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':&'/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack', &&&&&&&&&&&&&&
&&'returntype':&'META', &&&&&&&&&&&&&&&
&'rsakv'&:&rsakv, &&&&&&&&&&&&&&&&} &&&&&&
&&s&=&postData('.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="/aj_hongbao/getlucky" &&&&&&&&param={ &&&&&&&&&&&&&&&&'ouid':id, &&&&&&&&&&&&&&&&'share':0, &&&&&&&&&&&&&&&&'_t':0 &&&&&&&&&&&&&&&&} &
&&&&&&&&header=&{ &&&&&&&&&&&&&&&&'Cache-Control':'no-cache', &&&&&&&&&&&&&&&&'Content-Type':'application/x-www-form-urlencoded', &&&&&&&&&&&&&&&&'Origin':'', &&&&&&&&&&&&&&&&'Pragma':'no-cache', &&&&&&&&&&&&&&&&'Referer':'/hongbao/'+str(id), &&&&&&&&&&&&&&&&'User-Agent':'Mozilla/5.0&(Windows&NT&6.1;&WOW64)&AppleWebKit/537.36&(KHTML,&like&Gecko)&Chrome/33.0.&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()
爬取红包列表
单个红包领取动作测试成功后,就是我们程序的核心大招模块了——爬取红包列表,爬取红包列表的方法和入口应该有不少,比如各种微博搜索关键字啥啥的,不过我这里用最简单的方法:爬取红包榜单。
版权所有 爱编程 (C) Copyright 2012. . All Rights Reserved.
闽ICP备号-3
微信扫一扫关注爱编程,每天为您推送一篇经典技术文章。以下试题来自:
填空题若将“电话号码”字段的“必填字段”属性设置和“允许空字符串”属性均设置为“否”,则该字段允许为______值,但不允许是______字符串。 Null 空
为您推荐的考试题库
你可能感兴趣的试题
1.填空题 Like"张*"2.填空题 所有家住北京的姓王的人3.填空题 Null 空4.填空题 参数5.填空题 导入 链接
热门相关试卷
最新相关试卷所有回答(2)
api变动过了?
园豆:5358
应该是签名错了
&&&您需要以后才能回答,未注册用户请先。> 博客详情
& & 现在是网络时代,逢年过节用手机发红包支付的网站也很多,想电脑爱好者网站,PHP开发的CMS,当然还有pig cms,thinkcms等,都支持微信红包支付。
& &其微信现金红包接口API开发原理:
红包发放说明
用于企业向微信用户个人发现金红包
目前支持向指定微信用户的openid发放指定金额红包。(获取openid参见微信公众平台开发者文档:)
如需操作请登录
接口调用请求说明
https://api.mch./mmpaymkttransfers/sendredpack
是否需要证书
是(证书及使用说明详见)
随机字符串
5K8264ILTKCH16CQ2502SI8ZNMTM67VS
String(32)
随机字符串,不长于32位
C380BEC2BFD727A4BF3AD6
String(32)
商户订单号
mch_billno
String(28)
商户订单号(每个订单号必须唯一)
组成:mch_id+yyyymmdd+10位一天内不能重复的数字。
接口根据商户订单号支持重入,如出现超时可再调用。
String(32)
微信支付分配的商户号
公众账号appid
String(32)
微信分配的公众账号ID(企业号corpid即为此appId)。接口传入的所有appid应该为公众号的appid(在mp.申请的),不能为APP的appid(在open.申请的)。
String(32)
红包发送者名称
用户openid
oxTWIuGaIt6gTKsQRLau2M0yL16E
String(32)
接受红包的用户
用户在wxappid下的openid
total_amount
付款金额,单位分
红包发放总人数
红包发放总人数
total_num=1
红包祝福语
感谢您参加猜灯谜活动,祝您元宵节快乐!
String(128)
红包祝福语
192.168.0.1
String(15)
调用接口的机器Ip地址
猜灯谜抢红包活动
String(32)
猜越多得越多,快来抢!
String(256)
数据示例:
&sign&&![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]&&/sign&
&mch_billno&&![CDATA[6545]]&&/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[50780e0cca98c8c8ecaa672e]]&&/nonce_str&
返回状态码
return_code
String(16)
SUCCESS/FAIL
此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断
return_msg
String(128)
返回信息,如非空,为错误原因
参数格式校验错误
以下字段在return_code为SUCCESS的时候有返回
C380BEC2BFD727A4BF3AD6
String(32)
生成签名方式详见
result_code
String(16)
SUCCESS/FAIL
SYSTEMERROR
String(32)
错误码信息
错误代码描述
err_code_des
String(128)
结果信息描述
以下字段在return_code和result_code都为SUCCESS的时候有返回
商户订单号
mch_billno
String(28)
商户订单号(每个订单号必须唯一)
组成:mch_id+yyyymmdd+10位一天内不能重复的数字
String(32)
微信支付分配的商户号
公众账号appid
String(32)
商户appid,接口传入的所有appid应该为公众号的appid(在mp.申请的),不能为APP的appid(在open.申请的)。
用户openid
oxTWIuGaIt6gTKsQRLau2M0yL16E
String(32)
接受收红包的用户
用户在wxappid下的openid
total_amount
付款金额,单位分
发放成功时间
红包发送时间
send_listid
String(32)
红包订单的微信单号
成功示例:
&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[6545]]&&/mch_billno&
&mch_id&&/mch_id&
&wxappid&&![CDATA[wx6fa7e3bab7e15415]]&&/wxappid&
&re_openid&&![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]&&/re_openid&
&total_amount&1&/total_amount&
&send_listid&074200&/send_listid&
&send_time&02&/send_time&
失败示例:
&return_code&&![CDATA[FAIL]]&&/return_code&
&return_msg&&![CDATA[系统繁忙,请稍后再试.]]&&/return_msg&
&result_code&&![CDATA[FAIL]]&&/result_code&
&err_code&&![CDATA[]]&&/err_code&
&err_code_des&&![CDATA[系统繁忙,请稍后再试.]]&&/err_code_des&
&mch_billno&&![CDATA[6542]]&&/mch_billno&
&mch_id&&/mch_id&
&wxappid&&![CDATA[wx6fa7e3bab7e15415]]&&/wxappid&
&re_openid&&![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]&&/re_openid&
&total_amount&1&/total_amount&
发放失败,此请求可能存在风险,已被微信拦截
用户账号异常,被拦截
请提醒用户检查自身帐号是否异常。使用常用的活跃的微信号可避免这种情况。
SENDNUM_LIMIT
该用户今日领取红包个数超过限制
该用户今日领取红包个数超过你在微信支付商户平台配置的上限
如有需要、请在微信支付商户平台【api安全】中重新配置 【每日同一用户领取本商户红包不允许超过的个数】。
ILLEGAL_APPID
非法appid,请确认是否为公众号的appid,不能为APP的appid
错误传入了app的appid
接口传入的所有appid应该为公众号的appid(在mp.申请的),不能为APP的appid(在open.申请的)。
MONEY_LIMIT
红包金额发放限制
发送红包金额不再限制范围内
每个红包金额必须大于1元,小于200元(可联系微信支付申请调高额度)
SEND_FAILED
红包发放失败,请更换单号再重试
该红包已经发放失败
如果需要重新发放,请更换单号再发放
FATAL_ERROR
openid和原始单参数不一致
更换了openid,但商户单号未更新
请商户检查代码实现逻辑
金额和原始单参数不一致
更换了金额,但商户单号未更新
请商户检查代码实现逻辑
请检查金额、商户订单号是否正确
CA证书出错,请登录微信支付商户平台下载证书
请求携带的证书出错
到商户平台下载证书,请求带上证书后重试
SIGN_ERROR
1、没有使用商户平台设置的商户API密钥进行加密(有可能之前设置过密钥,后来被修改了,没有使用新的密钥进行加密)。 2、加密前没有按照文档进行参数排序(可参考文档) 3、把值为空的参数也进行了签名。可到(http://mch./wiki/tools/signverify/ )验证。 4、如果以上3步都没有问题,把请求串中(post的数据)里面中文都去掉,换成英文,试下,看看是否是编码问题。(post的数据要求是utf8)
1. 到商户平台重新设置新的密钥后重试 2. 检查请求参数把空格去掉重试 3. 中文不需要进行encode,使用CDATA 4. 按文档要求生成签名后再重试 在线签名验证工具:http://mch./wiki/tools/signverify/
SYSTEMERROR
请求已受理,请稍后使用原单号查询发放结果
系统无返回明确发放结果
使用原单号调用接口,查询发放结果,如果使用新单号调用接口,视为新发放请求
输入xml参数格式错误
请求的xml格式错误,或者post的数据为空
检查请求串,确认无误后重试
FREQ_LIMIT
超过频率限制,请稍后再试
受频率限制
请对请求做频率控制(可联系微信支付申请调高)
帐号余额不足,请到商户平台充值后再重试
账户余额不足
充值后重试
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.。微信支付商户号会在商户申请微信支付成功后,通过开户邮件发送给您。请不要使用微信公众平台账号或者appid登录。如果您登录时遇到问题,请联系微信支付小助手
◆ 下载证书
商户调用微信红包接口时,服务器会进行证书验证,请在商户平台下载证书
发放现金红包将扣除商户的可用余额,请注意,可用余额并不是微信支付交易额,需要预先充值,确保可用余额充足。查看可用余额、充值、提现请登录微信支付商户平台,进入“资金管理”菜单,进行操作
微信红包接口调用流程
◆ 后台API调用:待进入联调过程时与开发进行详细沟通;
◆ 告知服务器:告知服务器接收微信红包的用户openID,告知服务器该用户获得的金额;
◆ 从商务号扣款:服务器获取信息后从对应的商务号扣取对应的金额;
◆ 调用失败:因不符合发送规则,商务号余额不足等原因造成调用失败,反馈至调用方;
◆ 发送成功:以微信红包公众账号发送对应红包至对应用户;图下
支付宝红包的申请,在有网站的前提下使用Dreamweaver添加支付宝红包源程序,
如下:发红包流程
一、如何发送礼仪红包
1&登录支付宝账户(), 点击【我的支付宝】—【账户资产】—【红包】—【发红包】。
2&在“给亲朋好友”页面下方点击【立即发送】。
3&填写相关信息后,点击【下一步】。
4&确认填写的信息,输入支付密码,点击【确认发行】。
5&红包已发行成功。
二、如何发送促销红包(指定人)
1&登录支付宝账户(), 点击【我的支付宝】—【账户资产】—【红包】—【发红包】, 在【给客户】的页面下方,点击【立即发送】。
2&填写相关信息后,点击【下一步】。
3&选择【给指定人发送红包】,输入对方的支付宝账户,点击【下一步】
注:&郑重提醒:以交纳保证金、消保基金、资金返还、开通银行卡等为名要求您发放红包的, 都是诈骗。切勿上当受骗!红包一旦发放,将无法追回
4&确认发行信息后,输入支付密码,点击【确认发行】
5&促销红包发行成功。 给指定人发放红包是立即到账,不需要等待。
三、如何发送促销红包(获取码)
1&登录支付宝账户(), 点击【我的支付宝】—【账户资产】—【红包】—【发红包】, 在【给客户】的页面下方,点击【立即发送】。
2&填写相关信息后,点击【下一步】。
3&发行方式选择:生成红包获取码,输入发行数量,选择每个账户的限制次数(最多可以选择5次,即:1次、2次、3次、4次、5次),点击【下一步】。
4&确认发行信息后,输入支付密码,点击【确认发行】。
5&促销红包发送成功,下方可以下载获取码(卡号和密码) (红包以获取码方式发行的,需把红包卡号和密码告知收红包方)。
四、如何发送促销红包(领取按钮)
1&登录支付宝账户(), 点击【我的支付宝】—【账户资产】—【红包】—【发红包】, 在【给客户】的页面下方,点击【立即发送】。
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默认是不自带的,需要安装一下:
下载下来后运行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&=&'.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.15)&_=6'&%&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':&'/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack', &&&&&&&&&&&&&&
&&'returntype':&'META', &&&&&&&&&&&&&&&
&'rsakv'&:&rsakv, &&&&&&&&&&&&&&&&} &&&&&&
&&s&=&postData('.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="/aj_hongbao/getlucky" &&&&&&&&param={ &&&&&&&&&&&&&&&&'ouid':id, &&&&&&&&&&&&&&&&'share':0, &&&&&&&&&&&&&&&&'_t':0 &&&&&&&&&&&&&&&&} & &&&&&&&&header=&{ &&&&&&&&&&&&&&&&'Cache-Control':'no-cache', &&&&&&&&&&&&&&&&'Content-Type':'application/x-www-form-urlencoded', &&&&&&&&&&&&&&&&'Origin':'', &&&&&&&&&&&&&&&&'Pragma':'no-cache', &&&&&&&&&&&&&&&&'Referer':'/hongbao/'+str(id), &&&&&&&&&&&&&&&&'User-Agent':'Mozilla/5.0&(Windows&NT&6.1;&WOW64)&AppleWebKit/537.36&(KHTML,&like&Gecko)&Chrome/33.0.&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()
爬取红包列表
单个红包领取动作测试成功后,就是我们程序的核心大招模块了——爬取红包列表,爬取红包列表的方法和入口应该有不少,比如各种微博搜索关键字啥啥的,不过我这里用最简单的方法:爬取红包榜单。
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥}

我要回帖

更多关于 必填字段 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信