import requests import json import schedule import datetime import time from loguru import logger from MsgSender import MessageSender, DingDingSender, TelegramSender, MailSender def aliyundrive_sign(token): update_token_url = 'https://auth.aliyundrive.com/v2/account/token' headers = { 'Content-Type': 'application/json' } data = { 'grant_type': 'refresh_token', 'refresh_token': token } req = requests.Session() try: resp = req.post(update_token_url, json=data, headers=headers) result = json.loads(resp.text) access_token = result['access_token'] user_name = result['user_name'] except Exception as e: log_and_send('', '获取access token请求失败, 错误%s' % e) return signin_url = 'https://member.aliyundrive.com/v1/activity/sign_in_list' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + access_token } params = {'_rx-s': 'mobile'} try: resp = req.post(signin_url, headers=headers, params=params, json={'isReward': False}) result = json.loads(resp.text) except Exception as e: log_and_send(user_name, '签到请求失败, 错误%s' % e) return if result.get('code') == 'AccessTokenInvalid': log_and_send(user_name, 'access token 无效') return if not result.get('success'): log_and_send(user_name, '阿里云盘签到失败, 错误信息:\n %s' % result) return try: signin_count = result['result']['signInCount'] reward_url = 'https://member.aliyundrive.com/v1/activity/sign_in_reward' resp = req.post(reward_url, params=params, headers=headers, json={'signInDay': signin_count}) result = json.loads(resp.text) except Exception as e: log_and_send(user_name, '阿里云盘签到成功, 领奖请求失败, 错误%s' % e) return if not result.get('success'): log_and_send(user_name, '阿里云盘签到成功, 领奖失败, 错误信息:\n %s' % result) return log_and_send(user_name, '阿里云盘签到成功,奖品: %s' % result['result']['name'], False) def log_and_send(user_name, msg, is_error=True): msg = '用户%s: %s' % (user_name, msg) if user_name else msg logger.error(msg) if is_error else logger.info(msg) sender.send(msg) def init_sender(): msg_sender = MessageSender() dingding = "dingding" msg_sender.register_channel(dingding, DingDingSender(config[dingding])) telegram = "telegram" msg_sender.register_channel(telegram, TelegramSender(config[telegram])) mail = "mail" msg_sender.register_channel(mail, MailSender(config[mail])) return msg_sender if __name__ == '__main__': with open('config.json', 'r', encoding='utf-8') as f: config = json.load(f) env_time = config['env_time'] refresh_token_list = config['refresh_token_list'].split(',') sender = init_sender() start_time = datetime.datetime.now().replace(hour=env_time, minute=0, second=0, microsecond=0) for refresh_token in refresh_token_list: schedule_time = start_time.strftime('%H:%M') start_time += datetime.timedelta(seconds=60) logger.info("refresh_token: %s, schedule_time: %s" % (refresh_token, schedule_time)) schedule.every().day.at(schedule_time).do(aliyundrive_sign, refresh_token) logger.info("应用启动成功") sender.send("阿里云盘自动签到应用启动成功") while True: schedule.run_pending() time.sleep(1)