如今是網絡時代,逢年過節用手機發紅包支付的網站也不少,想電腦愛好者網站,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參數 |
在調用接口前,請商戶使用微信支付商戶號登陸微信支付商戶平臺完成下述工做:
備註:
微信支付商戶平臺地址爲pay.weixin.qq.com。微信支付商戶號會在商戶申請微信支付成功後,經過開戶郵件發送給您。請不要使用微信公衆平臺帳號或者appid登陸。若是您登陸時遇到問題,請聯繫微信支付小助手weixinpay@tencent.com
◆ 下載證書
商戶調用微信紅包接口時,服務器會進行證書驗證,請在商戶平臺下載證書
◆ 充值
發放現金紅包將扣除商戶的可用餘額,請注意,可用餘額並非微信支付交易額,須要預先充值,確保可用餘額充足。查看可用餘額、充值、提現請登陸微信支付商戶平臺,進入「資金管理」菜單,進行操做
◆ 後臺API調用:待進入聯調過程時與開發進行詳細溝通;
◆ 告知服務器:告知服務器接收微信紅包的用戶openID,告知服務器該用戶得到的金額;
◆ 從商務號扣款:服務器獲取信息後從對應的商務號扣取對應的金額;
◆ 調用失敗:因不符合發送規則,商務號餘額不足等緣由形成調用失敗,反饋至調用方;
◆ 發送成功:以微信紅包公衆帳號發送對應紅包至對應用戶;圖下
支付寶紅包的申請,在有網站的前提下使用Dreamweaver添加支付寶紅包源程序,
以下:發紅包流程
紅包程序編程通常用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寫搶紅包程序
開發圖:思惟輪廓草圖
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