1. 程式人生 > >Python 實現「食行生鮮」簽到領積分

Python 實現「食行生鮮」簽到領積分

用過食行生鮮的同學應該知道,每天可以在食行生鮮簽到,簽到可以領到 20 積分,在購物時可以抵 2 毛錢。錢雖少,但是積少成多,買菜時可以抵扣一兩塊錢還是不錯的。

今天我們就用 Python 來實現自動簽到,省得我每天開啟 APP 來操作了。

分析

要自動簽到,最簡單的是開啟頁面分析請求,然後我們用指令碼實現請求的自動化。但是發現食行沒有頁面,只有 APP,這不是一個好訊息,這意味著需要抓包處理了。

不過還好,我們有微信。

在微信裡面,我們發現也可以登入食行,這時選擇在瀏覽器中開啟頁面,~哎~ ,柳暗花明了,我們找到了一個可用的網頁地址:wechatx.34580.com

還好沒有做只能在微信端訪問的限制

下面的操作就好辦了,在電腦端的瀏覽器開啟網址,按下 F12,開始起飛~

登入分析

登入

{
    "SourceType": "9",
    "Phone": "18800000000",
    "PassWord": "98a53578bd74e150",
    "ZhuGeDeviceMd5": "164edd53b71674-02922cef4808a-47e1039-e1000-164edd53b7222e",
    "DeviceId": ""
}

現在,還無法確定哪些欄位是必填的,哪些是可以不傳的。

有一個問題是,密碼是經過加密的,我在頁面輸入的 000000,這裡變成了 98a53578bd74e150。這裡我找了半天是如何加密的,也沒有找到,若是有大神有辦法,還請留言告知!

不過還好,加密方式是固定的,也就是 000000 一直對應的是 98a53578bd74e150,我們只要記下這個加密後的密碼,在登入時,傳入後臺即可。

登入成功後,請求會響應一些 token 資料:

{
    "Error": 0,
    "Message": "返回正確",
    "Data": {
        "CustomerGuid": "d8cd7c84-xxxx-4369-xxxx-b1e86c027407",
        "Phone": "18800000000",
        "AccessToken": "73c7b5fxxxxxxx"
    }
}

只要 Error 欄位為 0,就代表登入成功!

簽到分析

登入成功後,頁面會自動跳轉到首頁,我們可以看到簽到圖示,點選它,進入簽到頁面:

簽到頁面

發現進來還是一個簽到按鈕,套娃啊!再點它!

終於簽到成功!

簽到請求

簽到請求中有兩個重要的引數,accesstoken 和 customerguid,這兩個引數就是登陸後返回的。

簽到請求響應:

{
    "Error": 0,
    "Message": "返回正確",
    "Data": {
        "GetPoints": 5,
        "SumGetPoints": 840
    }
}

返回說這次簽到獲得了 5 個積分,其實連續簽到 4 天后,每天就可以獲得 20 積分了!

實現

通過上面的分析,我們的簽到流程也很清晰了,首先就是登陸獲取 accesstoken 和 customerguid,然後再去簽到就可以了!

import requests, json, sys


def login(Phone, PassWord):
    url = "https://wechatx.34580.com/sz/Sign/SignInV2"
    payload = {
        'SourceType': 9,
        'Phone': Phone,
        'PassWord': PassWord
    }

    # 測試下來發現,連 header 都不需要
    response = requests.post(url, data=json.dumps(payload))
    data = json.loads(response.text)
    is_error = data['Error']

    # 登入失敗直接退出
    if is_error:
        print('登入失敗:{}'.format(data['Message']))
        sys.exit(1)
    else:
        print('登入成功!')
        return data['Data']['CustomerGuid'], data['Data']['AccessToken']


def signin(customerguid, accesstoken):
    url = "https://wechatx.34580.com/sz/SignUp/CustomerSignUp"

    querystring = {"accesstoken": accesstoken,
                   "customerguid": customerguid, "sourcetype": "9"}

    # 這次不需要 body 中的傳入資料
    response = requests.post(url, params=querystring)
    data = json.loads(response.text)
    is_error = data['Error']
    if is_error:
        print(data['Message'])
    else:
        print("簽到成功,獲取到 {} 個積分".format(data['Data']['GetPoints']))


if __name__ == "__main__":
    Phone = input('請輸入賬號:')
    PassWord = input('請輸入密碼:')

    customerguid, accesstoken = login(Phone.strip(), PassWord.strip())
    signin(customerguid, accesstoken)

執行:

$ python shsx.py
請輸入賬號:188xxxxxxxx
請輸入密碼:98a53578bd74e150
登入成功!
簽到成功,獲取到 20 個積分

最後,怎麼自動執行?把登入資訊寫死到程式碼裡,然後放到 Linux 下的 crontab 裡,每天早上執行一次就行啦~

總結

這裡還有一個遺留問題,就是登入密碼的獲取,現在還只能通過 F12 檢視請求獲取到,然後記下來。

但是,登入密碼是怎麼加密的,由於本人 js 方面比較薄弱,有能力有興趣的同學要是能看出來可以留言分享下啊~

另外,怎麼知道是不是簽到成功了呢,總不能去看定時任務的執行日誌吧,是不是可以傳送簡訊通知或者微信通知?這個且看後續分解。

如果覺得有用,歡迎關注我的微信,一起學習,共同進步,不定期推出贈書活動~

你的關注是對我最大的鼓勵!

最近蒐集到慕課網視訊,視訊內容涵蓋 Python、Java、PHP、前端、小程式、演算法、架構、資料庫等等!關注本公眾號,後臺回覆「慕課網」即可獲取下載地址。