當前位置:
首頁 > 新聞 > 看我是如何跟羊毛黨戰鬥的之我也變成羊毛黨

看我是如何跟羊毛黨戰鬥的之我也變成羊毛黨

*本文原創作者:西毒若相惜,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載


一、前言

快錢、飛凡雙旦活動已經過去,這裡跟大家分享下我是如何跟羊毛黨戰鬥的。/doge

由於是事後寫的,所以當時活動的一些截圖可能就沒有了,大家自行腦補~

就當順便給快錢、飛凡打個廣告啦~


二、導火索

作為老東家,有活動當然要支持一下啦,也就一元購還算比較靠譜划算了。

想搶個東西,從來沒有看到過存在有貨的情況,特別是整點放貨的時候也基本都是已搶光,可惡的羊毛黨

特別是發現鹹魚上都是賣這個東西的

於是想著自己也去做個羊毛黨算了,機智啊。


三、卧薪嘗膽

說做就做,無非就是寫腳本監控起來,發現有貨了告訴我們一下,我們去搶即可。

代理APP抓包(如有不會請自行百度),抓到活動頁面的api請求http://api.ffan.com/xxxxxxx

可以看到返回的內容,簡單分析下可知stockNum就是當前數量,totalStockNum是總共放出搶購的數量

當然識別你想搶購的商品,可以通過detailUrl,goodsPic,goodsSn等唯一識別碼去識別

所以這一塊的代碼應該是這樣


fight against sheep beta0.9


def shuliang():

geturl="

http://api.ffan.com/xxxxx

"

headers ={(User-Agent),(Referer),(Cookie)}

opener.addheaders = headers

response = opener.open(geturl).read()//打開網頁獲取返回內容

if(response.find("s1e58a65f13d284c1e811bd3a33c62e9f0")>0)://找到你想要關注的商品

str=response[response.find("s1e58a65f13d284c1e811bd3a33c62e9f0"):]

str=str[str.find("stockNum"):]
shuliang=str[str.find(":")+1:str.find(",")]//通過最簡單的字元串截取獲得stockNum的值,也就是當前庫存數量

if(int(shuliang)<10)://這地方沒貨的情況值應該是0,這裡設為10的意思是,就算庫存有10個也就當做沒有貨,反正也搶不到,因為可能存在搶購到但是沒有付款,於是訂單超時取消的情況

print("沒有貨")

else:

print("有貨")

else:

print("沒有上架")

上面beta0.9版本應該是有了雛形,但還是有一些需要優化的地方。


1.程序不能無限制的執行下去吧(通過time.sleep()來控制請求的頻率)

2.通過print打出的提醒不能及時看到(暫時想到通過一個彈框來提醒自己,在公司里,自己辦公電腦總不能聲音告警吧,但是當你在認真工作時,程序執行的時候發現有貨了,會談一個框告訴你有貨了,這樣來達到及時的效果)

於是就有了以下的代碼。


fight against sheep beta1.0


while True:

shuliang()

time.sleep(60)//每分鐘請求一下查詢庫存

當然這個頻率不是很合適,需要細化,結合業務,每隔兩小時的整點上貨,那麼我們就在那段時間請求頻繁一點即可。


//每日9點到21點,每2小時的整點進行搶購,那我在55分到05分直接就多進行關注就行了。例如我8:55-9:05 10:55-11:05等等多加關注

if((int(time.strftime("%M"))>55 and int(time.strftime("%H"))%2==0 and int(time.strftime("%H"))>7 and int(time.strftime("%H"))<22) or (int(time.strftime("%H"))%2==1 and int(time.strftime("%M"))<5 and int(time.strftime("%H"))>7 and int(time.strftime("%H"))<22)):

time.sleep(5)//瀕臨搶購時間點,咱們5秒請求一次

......

if(int(shuliang)<10):

print("沒有貨")

else:

print("有貨")

os.system("calc.exe")//彈個計算器出來,這樣你一邊在認證工作,突然出來個計算器,你就知道有貨了,就去準備購買了

上面代碼為什麼還不能成為正式版,因為在程序運行過程中還會發生一些問題,程序不夠健壯


1.當請求頻率過高時,socket連接失敗,例如打開連接超時,或者服務端拒絕了此次連接等等,導致程序直接崩了(你以為你程序在跑著呢,結果程序異常直接退出了,你還傻傻的等它提醒你呢)

2.print列印在終端,程序運行時間長了內容多了終端無法全部顯示出來(加個日誌吧,也不能說是日誌,就是把終端列印的東西存在一個文本文件中去,方便查看)

3.感覺彈框提醒貌似也有局限性(比如1點的搶購,可能人還在外面吃午飯,你電腦上彈框了你也不知道有貨了,所以增加郵件告警吧)

在解決了上面3個問題後,不是beta版的正式版本終於到來。


fight against sheep 正式版


while 1:

try:

response = opener.open(geturl).read()

break//打開網頁出錯,則跳出循環重新執行

except Exception, e:

print str(e)

while True:

f=open("a.txt","a")

old=sys.stdout//就是把輸出流接收了,放到新建的a.txt的文本文件當中

sys.stdout=f

shuliang()

sys.stdout=old

f.close()

def send(to_list,sub,content):

me="xxxx@xxx.com"

msg = MIMEText(content,_subtype="plain",_charset="utf-8")

msg["Subject"] = sub

msg["From"] = me

msg["To"] = to_list

try:

server = smtplib.SMTP()

server.connect(mail_host)

server.login(mail_user,mail_pass) //自己定義好告警郵箱

server.sendmail(me,to_list, msg.as_string())

server.close()

return True

except Exception, e:

print str(e)

return False

......

if(int(shuliang)<10):

print("沒有貨")

else:

print("有貨")

send(me,"有貨","有貨有貨,郵件告知,趕緊來買")

#os.system("calc.exe")

好了,不愧是正式版,程序這次跑了很久也沒出問題,要說唯一的問題就是,貌似從來沒有收到過郵件告警。

那這個程序的存在還有什麼意義

經過一段時間的觀察,發現stockNum的值確實一直是0,但是totalstockNum的值卻每個搶購時間點在增加,說明確實搶購時間點是在放貨沒錯,這也不是程序的問題,只能說業務上貨是先把商品下架,補充貨源後再上架。

這個過程也許可能可以購買了,這就導致當商品重新上架後,已經被搶光了。於是有了下面的版本。


fight against sheep 正式改進版

主要改進幾個問題:


1.當檢測到商品下架時,我就知道可能要準備上貨了,這時候給提醒

2.到目前為止只是為了提醒我有貨了趕緊搶購,為何不直接幫我買好呢


......

if(int(shuliang)<10):

print("沒有貨")

else:

print("有貨")

send(me,"有貨","有貨有貨,郵件告知,趕緊來買")

goumai()//發現有貨不磨嘰,直接購買

else:

print("沒有上架")

goumai()//既然發現了商品沒有上架也能購買,那這裡就也直接購買吧

def goumai():

posturl="xxxxxx"

headers={xxx}

data="xxx"

opener.open(posturl,data)//直接請求購買的url即可


fight against sheep 正式改進優化版

再優化一下程序:


1.有時候購買不成功,需要定位為什麼購買不成功(沒有庫存了?還是說是我程序請求的間隔長了?一般搶購的點,10秒可能就沒了)

2.有時候會發生郵件轟炸…..自己炸自己可不好玩


if(int(time.strftime("%M"))>58 or int(time.strftime("%M"))<2):

goumai()//在之前55分到05分的前提下,這裡優化一下,在59分到01分這2分鐘內,goumai的請求頻率可以加大,比如可以1秒1次

def goumai():

......

response = opener.open(posturl,data).read()//我也獲取購買請求的response

print response//列印出來分析下為什麼購買不成功

if(response.find("5001")>0):

#send(mailto_list,"購買失敗","未上架或庫存不足")

if(response.find("5000")>0):

#send(mailto_list,"購買失敗","今日已購買過或今日已搶購滿3次,無需購買,請注意")//就不都一一發郵件通知了,print記錄下即可

if(response.find("200")>0):

send(mailto_list,"購買成功","購買成功")//分析出各種購買失敗的情況

time.sleep(60)//購買成功的話給個郵件通知,然後等待1分鐘後程序繼續跑,一般這時候搶購已經結束,就不會有多個郵件告警出來

到此為止也不是最終版,中間還經歷了各種調試,優化的過程


fight against sheep 正式改進優化版V1.1

fight against sheep 正式改進優化版V1.2

fight against sheep 正式改進優化再三確認版

fight against sheep 正式改進優化再三確認版V9

fight against sheep 正式改進優化再三確認不修改版

fight against sheep 正式改進優化再三確認不修改最終版

fight against sheep 正式改進優化再三確認不修改最終真不修改版

fight against sheep 正式改進優化再三確認不修改最終真不修改最後一次修改版

………….

fight against sheep


四,結語

來看看到目前為止的效果吧:

這也是最終的日誌的記錄,包括各種時間戳,各種響應內容,請求次數等等。

基本上每次搶購也就一封郵件出來告知是成功還是失敗,沒有多餘的轟炸。

每天穩定輸出3塊布朗尼。

1月15號就要到了,快要過期了,送一塊布朗尼,僅限上海虹口龍之夢店。需要的表哥MMM


*本文原創作者:西毒若相惜,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載



您的贊是小編持續努力的最大動力,動動手指贊一下吧!


本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊下面的「搶先收到最新資訊」瀏覽吧!



請您繼續閱讀更多來自 FreeBuf 的精彩文章:

有趣!10個你不得不知的Linux終端遊戲
全球第三方反作弊遊戲平台ESEA數據泄漏最新進展
盤點2016年針對蘋果Mac系統的惡意軟體(附樣本下載) | FreeBuf年終策劃
D-Link路由器安全性差,美聯邦貿易委員會將其告上法庭
付了錢也不解鎖:進化為勒索軟體的KillDisk越來越流氓了

TAG:FreeBuf |

您可能感興趣

我想變成那只會做瑜伽的樹懶
看戰爭如何讓「軍事巨人」變成了「經濟矮子」
這三人,都是從歌姬變成皇帝的人,如何野雞變鳳凰?
狗狗是如何從睡地板變成霸佔你的床,看完我想哭
如果我變成狗,你還會愛我嗎?
我會變成這樣都是你害的
假如你給你一個機會變成王者榮耀裡面的英雄,你願意變成誰呢?
當把可愛毛小孩變成萌刺青,儘管痛我也心甘情願刺啊
農村出生的她,一度被人說是老土,趙麗穎教你如何變成天鵝
你是如何從「志短」變成「人窮」的
我是怎麼從他哥們變成女朋友的
如果讓你改變世界,你會讓它變成什麼樣?
手把手教你如何讓你變成自己喜歡的樣子
我想變成你喜歡的樣子
他挑戰鄒市明,賽前說中國功夫是花拳繡腿,想不到結果變成這樣!
長得丑還蜇人的毛毛蟲,能變成美麗的蝴蝶?它才不會呢!
如果雛田變成這樣,鳴人還會喜歡嗎?
我說金毛啊,你的臉怎麼會變成猴子的臉面啊!長大了怎麼撩妹呢
當你養了金毛之後,你的生活就會變成這樣