未测试【WPS自动签到】利用云函数实现WPS自动签到获得WPS免费会员

【2020.07.20更新】
自动打卡签到已经失效,需要手动打卡,但是自动邀请仍然正常,手动打卡后每天仍然可以获得11天+的会员。

20200720170853920
2020.07.20日打卡获得12天会员

20200720143047472
2020.07.19打卡获得11天会员

前言
WPS是一款经常用的软件,但是会员又不想买, 有些功能还必须会员使用,本来WPS是有一个【打卡签到】可以免费领取会员的,但是每天总是忘,因此想到利用“云函数”+Server酱实现基于Python的自动打卡签到,这样每天就会自动获得会员了,效果还不错,由于内置了一些小号来接受打卡邀请,因此我们的账号还可获得邀请奖励,2020.07.17日亲测是每天最少获得11天的会员,下面是这几天的实测效果:

20200718212641782
2020.07.17亲测有效

20200718212746649
2020.07.18又获得11天会员

一.需要的一些配置说明
废话不多说,直接说怎么实现,我们需要进行一些简单的配置。

1.1 获得自己WPS帐号的[sid]和[userid]
首先我们就是要知道自己的【sid】和【userid】,这两个是我们帐号的标志符或者说是自己的WPS帐号的ID身份证明,那么我们去哪里获得这两个参数呢?

其实很简单,首先我们需要知道一些基础的抓包操作,一般浏览器都是【F12】键开启控制台调试,以谷歌浏览器为例,首先跳转到WPS官方的签到网站:https://zt.wps.cn/2018/clock_in/,界面截图如下:

20200718213910509
此时我们按【F12】,点击【网络】,进入抓包调试界面, 这时候我们在签到页面点击登录,按照提示登录后,因为抓包已经开启,故就可在【clock_in】页面获取到自己登陆后返回的【sid】了,需要注意的是WPS账号一定要先绑定手机号和微信,否则可能会提示出错。具体操作截图如下:

20200718214341656
具体抓包操作截图
我们把【sid】记录下来先,接下来继续找到我们的【userid】,此信息就是我们手机WPS个人信息中的用户ID,举例:【191641526】这一串数字就是我们的【userid】,如下图示:

20200718214807639
获取自己的userid
知道这两个我们就获取了自己的信息了,就可以进行下一步了。

1.2 配置server酱用于信息推送
接下来我们需要配置的是【server酱】,它是用来在push微信信息来告诉我们每天签到是否成功还是失败,使用很简单,只需要按照网站上的流程来即可,网站如下:http://sc.ftqq.com

配置好拿到SERVER酱的SCKEY即可,举例:SCUXXXXXXXXXXXXXXXX

1.3 配置云函数
云函数可以理解为在云上运行的代码,好处就是可以自动执行,不需要你在自己电脑上运行,目前各个商家的云函数每个月都会给用户免费提供一些次数,在这里我用的是腾讯云函数,一个月是100万次的免费次数,实际上我们实现WPS自动签到一个月只需要30次就够了,因此是绰绰有余的。

首先登陆腾讯云:https://cloud.tencent.com/ ,登陆后找到云函数选项,进入,之后新建一个云函数,配置一下点下一步,详情如下图:

20200718215636629
选择云函数

20200718215913629
新建云函数

20200718220101901
新建函数的配置

之后在代码编辑栏里输入一下代码,注意下面的代码中请依次修改 23、27、28、33、34行中的需要修改的部分内容!

# !/usr/bin/env python
# coding=utf-8
import requests
import time
import json
import sys
import pytz
import datetime
import re
from io import StringIO
  
# Python版本 3.6
# 20200717更新:添加签到失败提醒
# 请依次修改 23、27、28、33、34行中的需要修改的部分内容
# 邀请用户签到可以额外获得会员,每日可邀请最多10个用户,已预置了13个小号用于接受邀请,89-101行信息可选删改
 
# 参考以下代码解决https访问警告
# from requests.packages.urllib3.exceptions import InsecureRequestWarning,InsecurePlatformWarning
# requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
# requests.packages.urllib3.disable_warnings(InsecurePlatformWarning)
 
# 初始化信息
SCKEY = '*********复制SERVER酱的SCKEY进来*************(保留引号)'
data = {
    "wps_checkin": [
        {
            "name": "*********请自行输入,仅用于显示*************(保留双引号)",
            "sid": "*********复制'http://zt.wps.cn'网址Cookie中的sid进来*************(保留双引号)"
        }
    ],
    "wps_invite": [
        {
            "name": "*********请自行输入,仅用于显示*************(保留双引号)",
            "invite_userid": "*********复制手机WPS个人信息中的用户ID进来,类似括号内容(191641526)*************(不保留双引号)",
            "sid": []
        }
    ]
}
# 初始化日志
sio = StringIO('WPS签到日志\n\n')
sio.seek(0, 2)  # 将读写位置移动到结尾
s = requests.session()
tz = pytz.timezone('Asia/Shanghai')
nowtime = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
sio.write("--------------------------"+nowtime+"----------------------------\n\n")
 
# 微信推送
def pushWechat(desp,nowtime):
    ssckey = SCKEY
    send_url='https://sc.ftqq.com/' + ssckey + '.send'
    if '失败' in desp :
        params = {
            'text': 'WPS小程序签到失败提醒' + nowtime,
            'desp': desp
            }
    else:
        params = {
            'text': 'WPS小程序签到提醒' + nowtime,
            'desp': desp
            }
    requests.post(send_url,params=params)
 
# 主函数
def main():
    # sio.write("\n            ===模拟wps小程序签到===")
    sid = data['wps_checkin']
 
    for item in sid:
        sio.write("\n为{}签到---↓\n\n".format(item['name']))
        bl = wps_clockin(item['sid'])
        if bl == 1:
            # 获取当前会员信息
            member_url = 'https://zt.wps.cn/2018/clock_in/api/get_data?member=wps'
            r1 = s.get(member_url, headers={'sid': item['sid']})
            # 累计获得会员天数
            total_add_day = re.search('"total_add_day":(\d+)', r1.text).group(1)
            sio.write('累计获得会员天数: {}天\n\n'.format(total_add_day))
            userinfo_url = 'https://vip.wps.cn/userinfo'
            r2 = s.get(userinfo_url, headers={'sid': item['sid']})
            resp = json.loads(r2.text)
            sio.write('会员信息: {{ "类型":{}, '.format(resp['data']['vip']['name']))
            sio.write('"过期时间":{} }}\n\n'.format(datetime.datetime.fromtimestamp(
                resp['data']['vip']['expire_time']).strftime("%Y--%m--%d %H:%M:%S")))
 
    # sys.exit()
    wps_inv = data['wps_invite']
    # 这13个账号被邀请
    invite_sid = [
                "V02StVuaNcoKrZ3BuvJQ1FcFS_xnG2k00af250d4002664c02f",
                "V02SWIvKWYijG6Rggo4m0xvDKj1m7ew00a8e26d3002508b828",
                "V02Sr3nJ9IicoHWfeyQLiXgvrRpje6E00a240b890023270f97",
                "V02SBsNOf4sJZNFo4jOHdgHg7-2Tn1s00a338776000b669579",
                "V02ScVbtm2pQD49ArcgGLv360iqQFLs014c8062e000b6c37b6",
                "V02S2oI49T-Jp0_zJKZ5U38dIUSIl8Q00aa679530026780e96",
                "V02ShotJqqiWyubCX0VWTlcbgcHqtSQ00a45564e002678124c",
                "V02SFiqdXRGnH5oAV2FmDDulZyGDL3M00a61660c0026781be1",
                "V02S7tldy5ltYcikCzJ8PJQDSy_ElEs00a327c3c0026782526",
                "V02SPoOluAnWda0dTBYTXpdetS97tyI00a16135e002684bb5c",
                "V02Sb8gxW2inr6IDYrdHK_ywJnayd6s00ab7472b0026849b17",
                "V02SwV15KQ_8n6brU98_2kLnnFUDUOw00adf3fda0026934a7f",
                "V02SC1mOHS0RiUBxeoA8NTliH2h2NGc00a803c35002693584d"
            ]
    sio.write("\n\n==========wps邀请==========\n\n")
    for item in wps_inv:
        sio.write("为{}邀请---↓\n\n".format(item['name']))
        if type(item['invite_userid']) == int:
            wps_invite(invite_sid, item['invite_userid'])
        else:
            sio.write("邀请失败:用户ID错误,请重新复制手机WPS个人信息中的用户ID并修改'invite_userid'项,注意不保留双引号\n\n")
    desp = sio.getvalue()
    pushWechat(desp,nowtime)
    #print(desp)
    return desp
  
# wps接受邀请
def wps_invite(sid: list, invite_userid: int) -> None:
    invite_url = 'http://zt.wps.cn/2018/clock_in/api/invite'
    for index, i in enumerate(sid):
        headers = {
            'sid': i
        }
        r = s.post(invite_url, headers=headers, data={
                   'invite_userid': invite_userid})
        sio.write("ID={}, 状态码: {}, \n\n  请求信息{}\n\n".format(str(index+1).zfill(2), r.status_code, r.text))
 
# wps签到
def wps_clockin(sid: str):
    if len(sid) == 0:
        sio.write("签到失败:用户sid为空,请重新输入\n\n")
        return 0
    elif "*" in sid or sid[0] != "V":
        sio.write("签到失败:用户sid错误,请重新输入\n\n")
        return 0
    # 打卡签到
    clockin_url = 'http://zt.wps.cn/2018/clock_in/api/clock_in?member=wps'
    r = s.get(clockin_url, headers={'sid': sid})
    if len(r.history) != 0:
        if r.history[0].status_code == 302:
            sio.write("签到失败:用户sid错误,请重新输入\n\n")
            return 0
    resp = json.loads(r.text)
    # 判断是否已打卡
    if resp['msg'] == '已打卡':
        sio.write("签到信息: {}\n\n".format(r.text))
        return 1
    # 判断是否绑定手机
    elif resp['msg'] == '未绑定手机':
        sio.write('签到失败: 未绑定手机,请绑定手机后重新运行签到\n\n')
        return 0
    # 判断是否重新报名
    elif resp['msg'] == '前一天未报名':
        sio.write('前一天未报名\n\n')
        signup_url = 'http://zt.wps.cn/2018/clock_in/api/sign_up'
        r=s.get(signup_url, headers={'sid': sid})
        resp = json.loads(r.text)
        if resp['result'] == 'ok':
            sio.write('报名信息: 已自动报名,报名后第二天签到\n\n')
            return 1
        else:
            sio.write('报名失败: 请手动报名,报名后第二天签到\n\n')
            return 0
    # 打卡签到需要参加活动
    elif resp['msg'] == '答题未通过':
        getquestion_url = 'http://zt.wps.cn/2018/clock_in/api/get_question?member=wps'
        r = s.get(getquestion_url, headers={'sid': sid})
        '''
        {
            "result": "ok",
            "data": {
                "multi_select": 1,
                "options": [
                    "30天文档分享链接有效期",
                    "远程下载助手",
                    "输出长图片去水印",
                    "PDF转图片"
                ],
                "title": "以下哪些特权是WPS会员和超级会员共同拥有的?"
            },
            "msg": ""
        }
        '''
        answer_set = {
            'WPS会员全文检索',
            '100G',
            'WPS会员数据恢复',
            'WPS会员PDF转doc',
            'WPS会员PDF转图片',
            'WPS图片转PDF插件',
            '金山PDF转WORD',
            'WPS会员拍照转文字',
            '使用WPS会员修复',
            'WPS全文检索功能',
            '有,且无限次',
            '文档修复'
        }
        resp = json.loads(r.text)
        # sio.write(resp['data']['multi_select'])
        # 只做单选题 multi_select==1表示多选题
        while resp['data']['multi_select'] == 1:
            r = s.get(getquestion_url, headers={'sid': sid})
            resp = json.loads(r.text)
            # sio.write('选择题类型: {}'.format(resp['data']['multi_select'])) 
        answer_id = 3
        for i in range(4):
            opt = resp['data']['options'][i]
            if opt in answer_set:
                answer_id = i+1
                break
        sio.write("选项: {}\n\n".format(resp['data']['options']))
        sio.write("选择答案: {}\n\n".format(answer_id))
        # 提交答案
        answer_url = 'http://zt.wps.cn/2018/clock_in/api/answer?member=wps'
        r = s.post(answer_url, headers={'sid': sid}, data={'answer': answer_id})
        resp = json.loads(r.text)
        # 答案错误
        if resp['msg'] == 'wrong answer':
            sio.write("答案不对,挨个尝试\n\n")
            for i in range(4):
                r = s.post(answer_url, headers={'sid': sid}, data={'answer': i+1})
                resp = json.loads(r.text)
                sio.write(i+1)
                if resp['result'] == 'ok':
                    sio.write(r.text)
                    break
        # 打卡签到
        clockin_url = 'http://zt.wps.cn/2018/clock_in/api/clock_in?member=wps'
        r = s.get(clockin_url, headers={'sid': sid})
        sio.write("签到信息: {}\n\n".format(r.text))
        return 1
    # 判断是否不在签到时间内
    elif resp['msg'] == '不在打卡时间内':
        sio.write('签到失败: 不在打卡时间内\n\n')
        signup_url = 'http://zt.wps.cn/2018/clock_in/api/sign_up'
        r=s.get(signup_url, headers={'sid': sid})
        resp = json.loads(r.text)
        if resp['result'] == 'ok':
            sio.write('已自动报名,报名后请设置在规定时间内签到\n\n')
            return 1
        else:
            sio.write('报名失败: 请手动报名,报名后第二天签到\n\n')
            return 0
    # 其他错误
    elif resp['result'] == 'error':
        sio.write('签到失败信息: {}\n\n'.format(r.text))
        signup_url = 'http://zt.wps.cn/2018/clock_in/api/sign_up'
        r=s.get(signup_url, headers={'sid': sid})
        resp = json.loads(r.text)
        if resp['result'] == 'ok':
            sio.write('已自动报名,报名后请设置在规定时间内签到\n\n')
            return 1
        else:
            sio.write('报名失败: 请手动报名,报名后第二天签到\n\n')
            return 0
 
def main_handler(event, context):
    return main()
 
if __name__ == '__main__':
    main()

 

按照说明修改完以上代码后,我们可以先测试触发一下看看是否配置正确,点击下面的【测试】按钮,会返回测试结果,如下图所示:

20200718221628126
测试返回结果

确认代码无误后,我们点击完成,之后配置云函数的触发规则,首先点击【触发管理】,之后选择【创建触发器】,具体操作如下图:

20200718220738236
创建触发器
创建完触发器后,我们配置触发器规则,首先在触发方式里选择【定时触发】,触发周期里选择【自定义触发周期】,在下面的Cron表达式里填入:0 10 8 * * * *

如下图示:

202007182211333
触发器规则配置

以上完成后,便可解放双手,每天在8点10分自动签到,会员就到手了。
————————————————
版权声明:本文为CSDN博主「XiaoSong_Aha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a6892255/article/details/107435504

版权声明:
作者:王金阁
链接:https://www.nnbbxx.net/post-8773.html
来源:王金阁博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
< <上一篇
下一篇>>
文章目录
关闭
目 录
文章页广告3