├── .gitignore ├── README.md ├── auto_api.py ├── config.py ├── index.py └── tools.py /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AutoAPI 2 | 3 | e5 续订程序(需配合 redis 与青龙面板) 4 | -------------------------------------------------------------------------------- /auto_api.py: -------------------------------------------------------------------------------- 1 | from config import api_list 2 | from tools import create_redis_key, get, get_localtime, post, timeDelay 3 | import redis 4 | 5 | 6 | class AutoApi: 7 | def __init__(self, conf) -> None: 8 | self.client_id = conf.get("client_id") 9 | self.secret = conf.get("secret") 10 | self.redirect_uri = conf.get("redirect_uri") 11 | self.redis_key = create_redis_key(conf.get("redis_key")) 12 | self.refresh_token = conf.get("refresh_token") 13 | self.redis = redis.StrictRedis( 14 | host=conf.get("redis_host"), 15 | port=conf.get("redis_port"), 16 | password=conf.get("redis_password"), 17 | ) 18 | 19 | def test_key_exists(self): 20 | return self.redis.exists(self.redis_key) 21 | 22 | def get_token(self): 23 | url = "https://login.microsoftonline.com/common/oauth2/v2.0/token" 24 | headers = {"Content-Type": "application/x-www-form-urlencoded"} 25 | data = { 26 | "grant_type": "refresh_token", 27 | "refresh_token": self.refresh_token, 28 | "client_id": self.client_id, 29 | "client_secret": self.secret, 30 | "redirect_uri": self.redirect_uri, 31 | } 32 | 33 | try: 34 | rep = post(url, data=data, headers=headers) 35 | 36 | if "error" in rep: 37 | raise Exception(rep["error_description"]) 38 | else: 39 | return [rep.get("access_token"), rep.get("refresh_token")] 40 | 41 | except Exception as ex: 42 | print(f"[Error] {ex}") 43 | 44 | def start(self): 45 | if self.test_key_exists() == 0: 46 | if self.refresh_token == "": 47 | print("Refresh token is empty. :(") 48 | return 49 | 50 | self.redis.set(self.redis_key, self.refresh_token) 51 | 52 | self.refresh_token = self.redis.get(self.redis_key) # overlay config 53 | 54 | tokens = self.get_token() 55 | self.redis.set(self.redis_key, tokens[1]) # update token 56 | 57 | headers = { 58 | "Authorization": tokens[0], 59 | "Content-Type": "application/json", 60 | } 61 | 62 | for i in range(3): 63 | print((f"开始第{i + 1}次测试").center(20, "#")) 64 | 65 | try: 66 | for idx, API in enumerate(api_list): 67 | if get(API, headers) == 200: 68 | print(f"第{idx + 1}次调用成功") 69 | else: 70 | print(f"第{idx + 1}次调用失败") 71 | 72 | timeDelay(1, 4) 73 | 74 | print(f"[Info] time: {get_localtime()}") 75 | except Exception as ex: 76 | print(f"[Error] {ex}") 77 | 78 | timeDelay(1, 4) 79 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | configs = [ 2 | { 3 | "client_id": "", 4 | "secret": "", 5 | "redirect_uri": "https://alist.nn.ci/tool/onedrive/callback", 6 | "redis_host": "192.168.1.248", 7 | "redis_port": 6379, 8 | "redis_key": "drive", # stay unique 9 | "refresh_token": "", # can keep empty, or initial value 10 | "redis_password": "", 11 | } 12 | ] 13 | 14 | api_list = [ 15 | r"https://graph.microsoft.com/v1.0/me/drive/root", 16 | r"https://graph.microsoft.com/v1.0/me/drive", 17 | r"https://graph.microsoft.com/v1.0/drive/root", 18 | r"https://graph.microsoft.com/v1.0/users", 19 | r"https://graph.microsoft.com/v1.0/me/messages", 20 | r"https://graph.microsoft.com/v1.0/me/mailFolders/inbox/messageRules", 21 | r"https://graph.microsoft.com/v1.0/me/mailFolders/Inbox/messages/delta", 22 | r"https://graph.microsoft.com/v1.0/me/drive/root/children", 23 | r"https://graph.microsoft.com/v1.0/me/drive/recent", 24 | r"https://graph.microsoft.com/v1.0/me/mailFolders", 25 | r"https://graph.microsoft.com/v1.0/me/outlook/masterCategories", 26 | ] 27 | -------------------------------------------------------------------------------- /index.py: -------------------------------------------------------------------------------- 1 | from auto_api import AutoApi 2 | from config import configs 3 | 4 | 5 | def main(): 6 | for conf in configs: 7 | a = AutoApi(conf) 8 | a.start() 9 | 10 | 11 | if __name__ == "__main__": 12 | main() 13 | -------------------------------------------------------------------------------- /tools.py: -------------------------------------------------------------------------------- 1 | import requests as req 2 | import random 3 | import time 4 | 5 | 6 | def create_redis_key(key: str): 7 | return f"auto_api_onedrive_refresh_token_{key}" 8 | 9 | 10 | def get(url, headers): 11 | res = req.get(url, headers=headers) 12 | return res.status_code 13 | 14 | 15 | def post(*args, **kwargs): 16 | return req.post(*args, **kwargs).json() 17 | 18 | 19 | def timeDelay(x, y): 20 | t = random.randrange(x, y) 21 | time.sleep(t) 22 | 23 | 24 | def get_localtime(): 25 | return time.asctime(time.localtime(time.time())) 26 | --------------------------------------------------------------------------------