├── .gitignore ├── README.md ├── action.py ├── img ├── 2021-09-25-01.png ├── 2021-09-25.png ├── 2021-7-15 1-0.png ├── 2021-7-15 1-1.png ├── 2021-7-15 1.png ├── 2021-7-15 2.png ├── 2021-7-15 3.png ├── 2021-7-15 token.png ├── 2021-7-20 1-1.png ├── 2021-7-20 1-2.png ├── 2021-8-4 1-1.png └── 2021-8-4 1-2.png ├── index.py ├── local_action.py ├── requirements.txt └── 腾讯云部署.md /.gitignore: -------------------------------------------------------------------------------- 1 | tempCodeRunnerFile.py 2 | *pycache*/ 3 | cookies.txt 4 | date 5 | target 6 | github部署.md 7 | encryption.txt 8 | action2-0.py 9 | *.go -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # **Aiqiyi-Sign** 2 | 3 | > 爱奇艺会员签到打卡 4 | > 5 | > 爱奇艺会员签到打卡,增加经验值,增加爱奇艺会员天数(连续打卡一个月,可以增加5天会员),**前提是爱奇艺会员** 6 | >每日三次抽奖,非会员也可参与 7 | > 项目地址:[Aiqiyi_Sign](https://github.com/ioutime/Aiqiyi_Sign) 8 | 9 | 10 | ## 脚本功能: 11 | 12 | 1. 登录爱奇艺,cookie(需要手动获取) 13 | 2. 支持爱奇艺会员**签到**打卡,每日三次**抽奖**,并显示今日成长值,vip到期时间等 14 | 3. 支持本地命令行执行 15 | 4. 支持pushplus 微信公众号推送 16 | 5. 支持腾讯云函数部署(建议,推荐) 17 | 6. 支持多个账户签到(P00001),只支持签到,无其他功能 18 | 19 | 20 | ## 注意事项: 21 | 22 | - **需要是爱奇艺会员**,否则脚本执行会不成功 23 | 24 | 25 | 26 | 使用方法: 27 | --- 28 | 29 | ### 安装依赖 30 | 31 | ```shell 32 | pip install -r requirements.txt 33 | ``` 34 | 35 | ### 本地执行脚本----local_action.py 36 | 37 | **必须**:**替换local_action.py的第十九行为自己的cookie值(下面有获取cookie的方法)**,否则运行不成功 38 | 39 | eg: 40 | 41 | ```shell 42 | python local_action.py 43 | ``` 44 | 45 | 结果 46 | 47 | ``` 48 | ======================================== 49 | *****: 签到成功:获得积分4 成长值4 累计签到 2 天 50 | 网页端签到成功: 获得积分6 累计签到2天 51 | VIP等级:5 52 | 升级需成长值:4267 53 | VIP到期时间:2022-02-24 54 | 今日抽奖次数:3 55 | 第1次抽奖:《我们的父辈1》 56 | 第3次抽奖:《我们的父辈1》 57 | 第2次抽奖:《我们的父辈1》 58 | 执行时间:7.906020096000248 59 | ======================================== 60 | ``` 61 | 62 | 63 | 64 | ### 部署参数介绍 65 | 66 | ``` 67 | COOKIE (必填) 68 | TOKEN (选填,pushplus的token值) 69 | P00001(选填,多账号签到使用,注意是四个零; 多个以英文逗号【','】隔开,必须是英文的逗号) 70 | ``` 71 | 72 | 73 | 74 | ### COOKIE值获取 75 | 76 | 1、打开[爱奇艺](https://www.iqiyi.com/)官网,并***登录***,一定要登录 77 | 78 | 2、按下**F12**,选择**network**(或者是网络), 按下 **F5** 刷新页面,如下图所示 79 | 80 | 81 | 82 | 3、点击第一个**www. iqiyi .com**,右边的**Headers**,找到 **Request Headers**,中的cookie值(从冒号开始) 83 | 84 | 85 | 86 | ### pushplus 微信公众号推送 87 | 88 | 使用[pushplus](http://www.pushplus.plus/)平台进行推送。 89 | 90 | 使用方法: 91 | 92 | 1. 访问[pushplus](http://www.pushplus.plus/)官网,登录 93 | 2. 找到**一对一推送**,并复制你的**token** 94 | 3. 执行脚本时替换token值 95 | 96 | 97 | 98 | 99 | 100 | 结果: 101 | 102 | ``` 103 | 签到成功 104 | 成长值+2 105 | 连续签到:3天 106 | 签到周期:3天/7天 107 | VIP等级:4 108 | 升级需成长值:315 109 | VIP到期时间:2021-10-04 110 | ``` 111 | 112 | 113 | 114 | 腾讯云函数部署: 115 | --- 116 | 117 | 详细过程请看[腾讯云部署.md](https://github.com/ioutime/Aiqiyi_Sign/blob/master/腾讯云部署.md)文件 118 | 119 | 120 | 121 | 122 | ## 多个爱奇艺账号部署: 123 | 124 | 多个账号部署,和上**面的部署流程一样**,只是**需要参数不同**不一样。 125 | 126 | ### 腾讯云函数部署: 127 | 128 | 填写必要参数 **P00001** 【注意是四个零; 多个以英文逗号【','】隔开,必须是英文的逗号】 129 | 130 | 131 | P00001的获取与如何填入数据 132 | --- 133 | 134 | 1、打开[爱奇艺](https://www.iqiyi.com/)官网,并***登录***,一定要登录 135 | 136 | 2、按下**F12**,选择**Application**(或者是应用程序), 并选择左侧栏的Cookies ,如下图所示 137 | 138 | 139 | 140 | 3、在搜索栏中输入P00001,回车,如下图所示,复制P00001 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | ## 建议: 149 | 150 | 1. 建议关注爱奇艺的公众号,能接收到会员天数的增加消息 151 | 2. 建议添加微信公众号推送,以便接收是否打卡成功 152 | 3. 如果使用cookie签到,网页端登录后别退出一直保持登录,建议一个月更新一次cookie值,**不更新也没事,可以正常签到**,但是不能获取个人详细信息(如vip到期时间等) 153 | 154 | -------------------------------------------------------------------------------- /action.py: -------------------------------------------------------------------------------- 1 | ''' 2 | @FILE : action.py 3 | @DSEC : 爱奇艺签到 4 | @AUTHOR : ioutime 5 | @DATE : 2022/02/08 18:30:52 6 | @VERSION : 3.0 7 | ''' 8 | 9 | import random 10 | import requests 11 | import argparse 12 | from urllib.parse import unquote 13 | import json 14 | import time 15 | import hashlib 16 | import string 17 | from json import dumps 18 | 19 | def main(infos): 20 | '''爱奇艺签到、每日三次抽奖,cookie签到''' 21 | start = time.perf_counter() 22 | cookie = infos["cookie"] 23 | p00001 = infos["p00001"] 24 | # Run tasks 25 | if not cookie: 26 | if not p00001: 27 | print("缺少必要参数") 28 | end = time.perf_counter() 29 | runTime = "\n执行时间:"+ str(end - start) 30 | push_info(infos,"缺少必要参数"+runTime) 31 | else: 32 | p00001s = p00001.split(',') 33 | more_accounts(infos,p00001s) 34 | elif cookie and p00001: 35 | p00001s = p00001.split(',') 36 | more_accounts(infos,p00001s) 37 | else: 38 | #转换cookie 39 | dct = transform(infos,cookie) 40 | if dct == None: 41 | return 42 | #获取nickname 43 | nickname = '' 44 | try: 45 | text = dct.get('P00002') 46 | text = unquote(text, 'utf-8').encode('utf-8').decode('unicode_escape') 47 | text = json.loads(text) 48 | nickname = text.get('nickname') + ': ' 49 | #判断是否是会员 50 | text2 = dct.get('QC179') 51 | text2 = unquote(text2, 'utf-8').encode('utf-8').decode('unicode_escape') 52 | text2 = json.loads(text2) 53 | vipTypes = text2.get('vipTypes') 54 | #可能判断不准确(我到现在只遇到'' 和 '1'这种情况,不知道是否有其他情况) 55 | if vipTypes == '' or vipTypes == ' ': 56 | nickname = nickname +'非会员\n' 57 | else: 58 | nickname = nickname +'会员\n' 59 | except Exception as e: 60 | print(e) 61 | nickname = '' 62 | #查询抽奖次数 63 | chance = draw(dct,0).get('chance') 64 | #抽奖 65 | msg_draw = '\n今日抽奖次数:'+ str(chance) 66 | res_msg = '' 67 | while(chance > 0): 68 | res_msg = res_msg + '\n第'+ str(chance % 3 + 1) +'次抽奖:'+ draw(dct,1).get('msg') 69 | chance-=1 70 | time.sleep(2) 71 | #签到 72 | msg0 = nickname + member_sign(dct) + "\n" 73 | #网页签到 74 | msg0 = msg0 + websign(dct) + "\n" 75 | #用户信息 76 | msg = msg0 + get_info(dct) + msg_draw + res_msg 77 | end = time.perf_counter() 78 | runTime = "\n执行时间:"+ str(end - start) 79 | msg = msg + runTime 80 | print(msg) 81 | push_info(infos,msg) 82 | 83 | 84 | def more_accounts(infos,p00001): 85 | ''' 86 | 多账号签到 87 | ''' 88 | ans = '' 89 | for i in p00001: 90 | ans = ans + "第%s账号:" % (p00001.index(i) + 1) 91 | print ("第%s账号:" % (p00001.index(i) + 1)) 92 | if len(i) >= 20: 93 | dct = {} 94 | dct['P00001']=i 95 | #签到 96 | msg = member_sign(dct) 97 | if msg!='失败\n': 98 | ans = ans + ' 签到成功\n' 99 | else: 100 | ans = ans + ' 签到失败!\n' 101 | print(msg) 102 | else: 103 | msg = ' p00001不完整' 104 | ans = ans + ' p00001不完整\n' 105 | print(msg) 106 | print('='*40) 107 | if len(ans) <= 300: 108 | push_info(infos,ans) 109 | else: 110 | push_info(infos,ans[0:200]+'......') 111 | 112 | def push_info(infos,msg): 113 | ''' 114 | 推送信息 115 | ''' 116 | token = infos["token"] 117 | if not token: 118 | return 119 | else: 120 | try: 121 | url = "http://www.pushplus.plus/send?token="+token+"&title=爱奇艺签到&content="+msg+"&template=html" 122 | requests.get(url=url) 123 | except Exception as e: 124 | print('推送失败') 125 | print(e) 126 | 127 | def get_args(): 128 | ''' 129 | 参数获取 130 | ''' 131 | parser = argparse.ArgumentParser() 132 | parser.add_argument("-t", dest="token", help="pushplus的token值") 133 | parser.add_argument("-c", dest="cookie", help="cookie值") 134 | parser.add_argument("-s", dest="p00001", help="P00001值") 135 | args = parser.parse_args() 136 | 137 | return { 138 | "token" : args.token, 139 | "cookie" : args.cookie, 140 | "p00001" : args.p00001 141 | } 142 | 143 | 144 | 145 | 146 | def member_sign(cookies_dict): 147 | ''' 148 | 签到 149 | ''' 150 | P00001 = cookies_dict.get('P00001') 151 | P00003 = cookies_dict.get('P00003') 152 | dfp = cookies_dict.get('__dfp').split('@')[0] 153 | sign_date = { 154 | "agentType": "1", 155 | "agentversion": "1.0", 156 | "appKey": "basic_pcw", 157 | "authCookie": P00001, 158 | "qyid": md5(strRandom(16)), 159 | "task_code": "natural_month_sign", 160 | "timestamp": time_13(), 161 | "typeCode": "point", 162 | "userId": P00003 163 | } 164 | post_date = { 165 | "natural_month_sign": { 166 | "agentType": "1", 167 | "agentversion": "1", 168 | "authCookie": P00001, 169 | "qyid": md5(strRandom(16)), 170 | "taskCode": "iQIYI_mofhr", 171 | "verticalCode": "iQIYI" 172 | } 173 | } 174 | sign = k('|', sign_date, "UKobMjDMsDoScuWOfp6F") 175 | url = f"https://community.iqiyi.com/openApi/task/execute?{k('&', sign_date)}&sign={sign}" 176 | header = { 177 | 'Content-Type': 'application/json' 178 | } 179 | res = requests.post(url, headers=header, data=dumps(post_date)).json() 180 | if res['code'] == 'A00000': 181 | if res['data']['code'] == 'A0000': 182 | quantity = res['data']['data']['rewards'][0]['rewardCount'] # 积分 183 | addgrowthvalue = res['data']['data']['rewards'][0]['rewardCount'] # 新增成长值 184 | continued = res['data']['data']['signDays'] # 签到天数 185 | msg = (f"签到成功:获得积分{quantity} 成长值{addgrowthvalue} 累计签到 {continued} 天") 186 | else: 187 | msg = (f"签到失败:{res['data']['msg']}") 188 | else: 189 | msg = (f"签到失败:{res['message']}") 190 | return msg 191 | 192 | 193 | def websign(cookies_dict): 194 | ''' 195 | 网页签到 196 | ''' 197 | P00001 = cookies_dict.get('P00001') 198 | P00003 = cookies_dict.get('P00003') 199 | dfp = cookies_dict.get('__dfp').split('@')[0] 200 | web_sign_date = { 201 | "agenttype": "1", 202 | "agentversion": "0", 203 | "appKey": "basic_pca", 204 | "appver": "0", 205 | "authCookie": P00001, 206 | "channelCode": "sign_pcw", 207 | "dfp": dfp, 208 | "scoreType": "1", 209 | "srcplatform": "1", 210 | "typeCode": "point", 211 | "userId": P00003, 212 | "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36", 213 | "verticalCode": "iQIYI" 214 | } 215 | sign = k('|', web_sign_date, "DO58SzN6ip9nbJ4QkM8H") 216 | url = f"https://community.iqiyi.com/openApi/score/add?{k('&', web_sign_date)}&sign={sign}" 217 | res = requests.get(url).json() 218 | if res['code'] == 'A00000': 219 | if res['data'][0]['code'] == 'A0000': 220 | quantity = res['data'][0]['score'] # 积分 221 | continued = res['data'][0]['continuousValue'] # 累计签到天数 222 | msg = (f"网页端签到成功: 获得积分{quantity} 累计签到{continued}天") 223 | else: 224 | msg = (f"网页端签到失败:{res['data'][0]['message']}") 225 | else: 226 | msg = (f"网页端签到失败:{res['message']}") 227 | # print(msg) 228 | return msg 229 | 230 | 231 | 232 | def get_info(cookies_dict): 233 | ''' 234 | 获取用户信息 235 | ''' 236 | P00001 = cookies_dict.get('P00001') 237 | url = 'http://serv.vip.iqiyi.com/vipgrowth/query.action' 238 | params = { 239 | "P00001": P00001, 240 | } 241 | res = requests.get(url, params=params) 242 | if res.json()["code"] == "A00000": 243 | try: 244 | res_data = res.json()["data"] 245 | #VIP等级 246 | level = res_data["level"] 247 | #升级需要成长值 248 | distance = res_data["distance"] 249 | #VIP到期时间 250 | deadline = res_data["deadline"] 251 | msg = f"VIP等级:{level}\n升级需成长值:{distance}\nVIP到期时间:{deadline}" 252 | except: 253 | print("获取具体信息失败") 254 | msg = "" 255 | else: 256 | print("获取个人信息失败") 257 | msg = "" 258 | return msg 259 | 260 | def draw(cookies_dict,type): 261 | ''' 262 | 查询抽奖次数,抽奖 263 | type: 0 查询次数;1 抽奖 264 | ''' 265 | P00001 = cookies_dict.get('P00001') 266 | P00003 = cookies_dict.get('P00003') 267 | url = "https://iface2.iqiyi.com/aggregate/3.0/lottery_activity" 268 | params = { 269 | "lottery_chance": 1, 270 | "app_k": "0", 271 | "app_v": "0", 272 | "platform_id": 10, 273 | "dev_os": "2.0.0", 274 | "dev_ua": "COL-AL10", 275 | "net_sts": 1, 276 | "qyid": "2655b332a116d2247fac3dd66a5285011102", 277 | "psp_uid": P00003, 278 | "psp_cki": P00001, 279 | "psp_status": 3, 280 | "secure_v": 1, 281 | "secure_p": "0", 282 | "req_sn": round(time.time()*1000) 283 | } 284 | # 抽奖删除 lottery_chance 参数 285 | if type == 1: 286 | del params["lottery_chance"] 287 | res = requests.get(url, params=params) 288 | 289 | if not res.json().get('code'): 290 | chance = int(res.json().get('daysurpluschance')) 291 | msg = res.json().get("awardName") 292 | return {"status": "成功", "msg": msg, "chance": chance} 293 | else: 294 | try: 295 | msg = res.json().get("kv", {}).get("msg") 296 | except: 297 | msg = res.json()["errorReason"] 298 | return {"status": "失败", "msg": msg, "chance": 0} 299 | 300 | def transform(infos,cookie): 301 | ''' 302 | 转换完整的COOKIE,并执行签到等功能 303 | ''' 304 | try: 305 | cookies = cookie.replace(' ','') 306 | dct = {} 307 | lst = cookies.split(';') 308 | for i in lst: 309 | name = i.split('=')[0] 310 | value = i.split('=')[1] 311 | dct[name] = value 312 | except: 313 | msg0 = "输入的cookie有问题,请重新获取" 314 | print(msg0) 315 | push_info(infos,msg0) 316 | return 317 | #判断是否有要的值 318 | P00001 = dct.get('P00001') 319 | P00003 = dct.get('P00003') 320 | if P00001 == None: 321 | msg0 = "输入的cookie有问题(P00001),请重新获取" 322 | print(msg0) 323 | push_info(infos,msg0) 324 | return 325 | if P00003 == None: 326 | msg0 = "输入的cookie有问题(P00003),请重新获取" 327 | print(msg0) 328 | push_info(infos,msg0) 329 | return 330 | return dct 331 | 332 | # 随机字符串 a-z A-Z 0-9 333 | def strRandom(num): 334 | return ''.join(random.sample(string.ascii_letters + string.digits, num)) 335 | 336 | 337 | # md5加密 338 | def md5(data): 339 | return hashlib.md5(bytes(data, encoding='utf-8')).hexdigest() 340 | 341 | 342 | # 13位时间戳 343 | def time_13(): 344 | return round(time.time() * 1000) 345 | 346 | 347 | # 拼接 连接符 数据 特殊符号(可不填) 348 | def k(c, t, e=None): 349 | buf = [] 350 | for key, value in t.items(): 351 | buf.append('='.join([key, str(value)])) 352 | if e != None: 353 | buf.append(e) 354 | return (md5(c.join(buf))) 355 | return (c.join(buf)) 356 | 357 | if __name__=="__main__": 358 | print('='*40) 359 | main(get_args()) 360 | print('='*40) 361 | -------------------------------------------------------------------------------- /img/2021-09-25-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ioutime/Aiqiyi_Sign/8c2009852a01c07e5f63e30a3c9b77b3b550b306/img/2021-09-25-01.png -------------------------------------------------------------------------------- /img/2021-09-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ioutime/Aiqiyi_Sign/8c2009852a01c07e5f63e30a3c9b77b3b550b306/img/2021-09-25.png -------------------------------------------------------------------------------- /img/2021-7-15 1-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ioutime/Aiqiyi_Sign/8c2009852a01c07e5f63e30a3c9b77b3b550b306/img/2021-7-15 1-0.png -------------------------------------------------------------------------------- /img/2021-7-15 1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ioutime/Aiqiyi_Sign/8c2009852a01c07e5f63e30a3c9b77b3b550b306/img/2021-7-15 1-1.png -------------------------------------------------------------------------------- /img/2021-7-15 1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ioutime/Aiqiyi_Sign/8c2009852a01c07e5f63e30a3c9b77b3b550b306/img/2021-7-15 1.png -------------------------------------------------------------------------------- /img/2021-7-15 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ioutime/Aiqiyi_Sign/8c2009852a01c07e5f63e30a3c9b77b3b550b306/img/2021-7-15 2.png -------------------------------------------------------------------------------- /img/2021-7-15 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ioutime/Aiqiyi_Sign/8c2009852a01c07e5f63e30a3c9b77b3b550b306/img/2021-7-15 3.png -------------------------------------------------------------------------------- /img/2021-7-15 token.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ioutime/Aiqiyi_Sign/8c2009852a01c07e5f63e30a3c9b77b3b550b306/img/2021-7-15 token.png -------------------------------------------------------------------------------- /img/2021-7-20 1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ioutime/Aiqiyi_Sign/8c2009852a01c07e5f63e30a3c9b77b3b550b306/img/2021-7-20 1-1.png -------------------------------------------------------------------------------- /img/2021-7-20 1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ioutime/Aiqiyi_Sign/8c2009852a01c07e5f63e30a3c9b77b3b550b306/img/2021-7-20 1-2.png -------------------------------------------------------------------------------- /img/2021-8-4 1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ioutime/Aiqiyi_Sign/8c2009852a01c07e5f63e30a3c9b77b3b550b306/img/2021-8-4 1-1.png -------------------------------------------------------------------------------- /img/2021-8-4 1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ioutime/Aiqiyi_Sign/8c2009852a01c07e5f63e30a3c9b77b3b550b306/img/2021-8-4 1-2.png -------------------------------------------------------------------------------- /index.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | import action 3 | 4 | infos = { 5 | "cookie": '''cookie值''', 6 | "token" : "",#推送token 7 | "p00001" : ""#多账号 8 | } 9 | 10 | 11 | def main_handler(event, context): 12 | action.main(infos) 13 | 14 | 15 | if __name__ == "__main__": 16 | main_handler("", "") -------------------------------------------------------------------------------- /local_action.py: -------------------------------------------------------------------------------- 1 | ''' 2 | @FILE : action.py 3 | @DSEC : 爱奇艺签到 4 | @AUTHOR : ioutime 5 | @DATE : 2022/02/08 18:30:52 6 | @VERSION : 3.0 7 | ''' 8 | 9 | import random 10 | import requests 11 | from urllib.parse import unquote 12 | import json 13 | import time 14 | import hashlib 15 | import string 16 | from json import dumps 17 | 18 | infos = { 19 | "cookie": '''cookie值''', 20 | "token" : ""#推送token 21 | } 22 | 23 | 24 | def main(infos): 25 | '''爱奇艺签到、每日三次抽奖,cookie签到''' 26 | start = time.perf_counter() 27 | cookie = infos["cookie"] 28 | # Run tasks 29 | if not cookie: 30 | print("缺少必要参数") 31 | end = time.perf_counter() 32 | runTime = "\n执行时间:"+ str(end - start) 33 | print(runTime) 34 | push_info(infos,"缺少必要参数"+runTime) 35 | else: 36 | #转换cookie 37 | dct = transform(infos,cookie) 38 | if dct == None: 39 | return 40 | #获取nickname 41 | nickname = '' 42 | try: 43 | text = dct.get('P00002') 44 | text = unquote(text, 'utf-8').encode('utf-8').decode('unicode_escape') 45 | text = json.loads(text) 46 | nickname = text.get('nickname') + ': ' 47 | #判断是否是会员 48 | text2 = dct.get('QC179') 49 | text2 = unquote(text2, 'utf-8').encode('utf-8').decode('unicode_escape') 50 | text2 = json.loads(text2) 51 | vipTypes = text2.get('vipTypes') 52 | #可能判断不准确(我到现在只遇到'' 和 '1'这种情况,不知道是否有其他情况) 53 | if vipTypes == '' or vipTypes == ' ': 54 | nickname = nickname +'非会员\n' 55 | else: 56 | nickname = nickname +'会员\n' 57 | except Exception as e: 58 | print(e) 59 | nickname = '' 60 | #查询抽奖次数 61 | chance = draw(dct,0).get('chance') 62 | #抽奖 63 | msg_draw = '\n今日抽奖次数:'+ str(chance) 64 | res_msg = '' 65 | while(chance > 0): 66 | res_msg = res_msg + '\n第'+ str(chance % 3 + 1) +'次抽奖:'+ draw(dct,1).get('msg') 67 | chance-=1 68 | time.sleep(2) 69 | #签到 70 | msg0 = nickname + member_sign(dct) + "\n" 71 | #网页签到 72 | msg0 = msg0 + websign(dct) + "\n" 73 | #用户信息 74 | msg = msg0 + get_info(dct) + msg_draw + res_msg 75 | end = time.perf_counter() 76 | runTime = "\n执行时间:"+ str(end - start) 77 | msg = msg + runTime 78 | print(msg) 79 | push_info(infos,msg) 80 | 81 | 82 | 83 | 84 | def push_info(infos,msg): 85 | ''' 86 | 推送信息 87 | ''' 88 | token = infos["token"] 89 | if not token: 90 | return 91 | else: 92 | try: 93 | url = "http://www.pushplus.plus/send?token="+token+"&title=爱奇艺签到&content="+msg+"&template=html" 94 | requests.get(url=url) 95 | except Exception as e: 96 | print('推送失败') 97 | print(e) 98 | 99 | def member_sign(cookies_dict): 100 | ''' 101 | 签到 102 | ''' 103 | P00001 = cookies_dict.get('P00001') 104 | P00003 = cookies_dict.get('P00003') 105 | dfp = cookies_dict.get('__dfp').split('@')[0] 106 | sign_date = { 107 | "agentType": "1", 108 | "agentversion": "1.0", 109 | "appKey": "basic_pcw", 110 | "authCookie": P00001, 111 | "qyid": md5(strRandom(16)), 112 | "task_code": "natural_month_sign", 113 | "timestamp": time_13(), 114 | "typeCode": "point", 115 | "userId": P00003 116 | } 117 | post_date = { 118 | "natural_month_sign": { 119 | "agentType": "1", 120 | "agentversion": "1", 121 | "authCookie": P00001, 122 | "qyid": md5(strRandom(16)), 123 | "taskCode": "iQIYI_mofhr", 124 | "verticalCode": "iQIYI" 125 | } 126 | } 127 | sign = k('|', sign_date, "UKobMjDMsDoScuWOfp6F") 128 | url = f"https://community.iqiyi.com/openApi/task/execute?{k('&', sign_date)}&sign={sign}" 129 | header = { 130 | 'Content-Type': 'application/json' 131 | } 132 | res = requests.post(url, headers=header, data=dumps(post_date)).json() 133 | if res['code'] == 'A00000': 134 | if res['data']['code'] == 'A0000': 135 | quantity = res['data']['data']['rewards'][0]['rewardCount'] # 积分 136 | addgrowthvalue = res['data']['data']['rewards'][0]['rewardCount'] # 新增成长值 137 | continued = res['data']['data']['signDays'] # 签到天数 138 | msg = (f"签到成功:获得积分{quantity} 成长值{addgrowthvalue} 累计签到 {continued} 天") 139 | else: 140 | msg = (f"签到失败:{res['data']['msg']}") 141 | else: 142 | msg = (f"签到失败:{res['message']}") 143 | return msg 144 | 145 | 146 | def websign(cookies_dict): 147 | ''' 148 | 网页签到 149 | ''' 150 | P00001 = cookies_dict.get('P00001') 151 | P00003 = cookies_dict.get('P00003') 152 | dfp = cookies_dict.get('__dfp').split('@')[0] 153 | web_sign_date = { 154 | "agenttype": "1", 155 | "agentversion": "0", 156 | "appKey": "basic_pca", 157 | "appver": "0", 158 | "authCookie": P00001, 159 | "channelCode": "sign_pcw", 160 | "dfp": dfp, 161 | "scoreType": "1", 162 | "srcplatform": "1", 163 | "typeCode": "point", 164 | "userId": P00003, 165 | "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36", 166 | "verticalCode": "iQIYI" 167 | } 168 | sign = k('|', web_sign_date, "DO58SzN6ip9nbJ4QkM8H") 169 | url = f"https://community.iqiyi.com/openApi/score/add?{k('&', web_sign_date)}&sign={sign}" 170 | res = requests.get(url).json() 171 | if res['code'] == 'A00000': 172 | if res['data'][0]['code'] == 'A0000': 173 | quantity = res['data'][0]['score'] # 积分 174 | continued = res['data'][0]['continuousValue'] # 累计签到天数 175 | msg = (f"网页端签到成功: 获得积分{quantity} 累计签到{continued}天") 176 | else: 177 | msg = (f"网页端签到失败:{res['data'][0]['message']}") 178 | else: 179 | msg = (f"网页端签到失败:{res['message']}") 180 | # print(msg) 181 | return msg 182 | 183 | 184 | 185 | def get_info(cookies_dict): 186 | ''' 187 | 获取用户信息 188 | ''' 189 | P00001 = cookies_dict.get('P00001') 190 | url = 'http://serv.vip.iqiyi.com/vipgrowth/query.action' 191 | params = { 192 | "P00001": P00001, 193 | } 194 | res = requests.get(url, params=params) 195 | if res.json()["code"] == "A00000": 196 | try: 197 | res_data = res.json()["data"] 198 | #VIP等级 199 | level = res_data["level"] 200 | #升级需要成长值 201 | distance = res_data["distance"] 202 | #VIP到期时间 203 | deadline = res_data["deadline"] 204 | msg = f"VIP等级:{level}\n升级需成长值:{distance}\nVIP到期时间:{deadline}" 205 | except: 206 | print("获取具体信息失败") 207 | msg = "" 208 | else: 209 | print("获取个人信息失败") 210 | msg = "" 211 | return msg 212 | 213 | def draw(cookies_dict,type): 214 | ''' 215 | 查询抽奖次数,抽奖 216 | type: 0 查询次数;1 抽奖 217 | ''' 218 | P00001 = cookies_dict.get('P00001') 219 | P00003 = cookies_dict.get('P00003') 220 | url = "https://iface2.iqiyi.com/aggregate/3.0/lottery_activity" 221 | params = { 222 | "lottery_chance": 1, 223 | "app_k": "0", 224 | "app_v": "0", 225 | "platform_id": 10, 226 | "dev_os": "2.0.0", 227 | "dev_ua": "COL-AL10", 228 | "net_sts": 1, 229 | "qyid": "2655b332a116d2247fac3dd66a5285011102", 230 | "psp_uid": P00003, 231 | "psp_cki": P00001, 232 | "psp_status": 3, 233 | "secure_v": 1, 234 | "secure_p": "0", 235 | "req_sn": round(time.time()*1000) 236 | } 237 | # 抽奖删除 lottery_chance 参数 238 | if type == 1: 239 | del params["lottery_chance"] 240 | res = requests.get(url, params=params) 241 | 242 | if not res.json().get('code'): 243 | chance = int(res.json().get('daysurpluschance')) 244 | msg = res.json().get("awardName") 245 | return {"status": "成功", "msg": msg, "chance": chance} 246 | else: 247 | try: 248 | msg = res.json().get("kv", {}).get("msg") 249 | except: 250 | msg = res.json()["errorReason"] 251 | return {"status": "失败", "msg": msg, "chance": 0} 252 | 253 | def transform(infos,cookie): 254 | ''' 255 | 转换完整的COOKIE,并执行签到等功能 256 | ''' 257 | try: 258 | cookies = cookie.replace(' ','') 259 | dct = {} 260 | lst = cookies.split(';') 261 | for i in lst: 262 | name = i.split('=')[0] 263 | value = i.split('=')[1] 264 | dct[name] = value 265 | except: 266 | msg0 = "输入的cookie有问题,请重新获取" 267 | print(msg0) 268 | push_info(infos,msg0) 269 | return 270 | #判断是否有要的值 271 | P00001 = dct.get('P00001') 272 | P00003 = dct.get('P00003') 273 | if P00001 == None: 274 | msg0 = "输入的cookie有问题(P00001),请重新获取" 275 | print(msg0) 276 | push_info(infos,msg0) 277 | return 278 | if P00003 == None: 279 | msg0 = "输入的cookie有问题(P00003),请重新获取" 280 | print(msg0) 281 | push_info(infos,msg0) 282 | return 283 | return dct 284 | 285 | # 随机字符串 a-z A-Z 0-9 286 | def strRandom(num): 287 | return ''.join(random.sample(string.ascii_letters + string.digits, num)) 288 | 289 | 290 | # md5加密 291 | def md5(data): 292 | return hashlib.md5(bytes(data, encoding='utf-8')).hexdigest() 293 | 294 | 295 | # 13位时间戳 296 | def time_13(): 297 | return round(time.time() * 1000) 298 | 299 | 300 | # 拼接 连接符 数据 特殊符号(可不填) 301 | def k(c, t, e=None): 302 | buf = [] 303 | for key, value in t.items(): 304 | buf.append('='.join([key, str(value)])) 305 | if e != None: 306 | buf.append(e) 307 | return (md5(c.join(buf))) 308 | return (c.join(buf)) 309 | 310 | if __name__=="__main__": 311 | print('='*40) 312 | main(infos) 313 | print('='*40) 314 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests == 2.24.0 2 | PyExecJS == 1.5.1 3 | -------------------------------------------------------------------------------- /腾讯云部署.md: -------------------------------------------------------------------------------- 1 | 部署 2 | --- 3 | 4 | ### 下载仓库 5 | 6 | ``` 7 | git clone https://github.com/ioutime/Aiqiyi_Sign.git 8 | ``` 9 | 10 | ### 创建云函数 11 | 12 | 1. 打开[腾讯云官网](https://cloud.tencent.com/),登录,在产品中找到云函数入口 13 | 14 | 2. 进入**云函数**管理控制台,在函数服务中新建云函数,基础设置: 15 | 16 | ​ 创建方式: 选择自定义 17 | 18 | ​ 基础配置默认 19 | 20 | ​ 函数代码: 21 | 22 | ​ 提交方式选择:本地文件夹上传 23 | 24 | ​ 上传:选择你刚刚下载下来的代码(Aiqiyi_Sign文件夹) 25 | 26 | ​ 27 | 28 | 3. 将高级配置中的环境配置-内存改为 64MB,执行超时时间改为 900,其他默认不改动,点击创建 29 | 30 | 注:执行时间一定要改,默认的可能会超时 31 | 32 | ### 配置云函数 33 | 34 | 1. 创建完成后进入函数管理页面,在在线 IDE 中打开一个终端: 35 | 36 | ![](img/2021-09-25-01.png) 37 | 38 | 2. 在终端中执行如下指令安装依赖: 39 | 40 | ``` 41 | cd src/ && pip3 install -r requirements.txt -t . 42 | ``` 43 | 44 | 3. 依赖安装完毕之后可以看到左侧目录项多出了很多文件夹,说明依赖安装成功 45 | 46 | 4. 修改*index.py*文件,将其中的`infos`变量各值修改为脚本所需参数(参数说明见 README),除**cookie**外其余参数可选填,**不需要的参数请不要取消注释!** 47 | 48 | 49 | 50 | 5. 所有项目修改完成后,点击部署: 51 | 52 | 53 | 54 | ### 测试 55 | 56 | 部署成功即可测试,测试时间可能有些长(几分钟),如结果没有问题,可以进行下一步,否则进行错误排查 57 | 58 | 59 | 60 | ### 配置触发器 61 | 62 | 在触发管理-创建触发器中按下图填写(定时任务名称使用默认即可): 63 | 64 | ![](img/2021-09-25.png) 65 | 66 | 其中触发周期可以自定义,选择自定义出发周期可以使用 Cron 表达式创建,最后点击提交即可。 67 | 68 | --------------------------------------------------------------------------------