def init(): # 设置代理 crawler.quickly_set_proxy() if ACCESS_TOKEN is not None: return True # 文件存在,检查格式是否正确 if os.path.exists(token_file_path): api_info = tool.json_decode(crypto.Crypto().decrypt(file.read_file(token_file_path)), []) if crawler.check_sub_key(("api_key", "api_secret"), api_info): # 验证token是否有效 if get_access_token(api_info["api_key"], api_info["api_secret"]): output.print_msg("access token get succeed!") return True else: output.print_msg("api info has expired") else: output.print_msg("decrypt api info failure") # token已经无效了,删除掉 path.delete_dir_or_file(token_file_path) output.print_msg("Please input api info") while True: api_key = input("API KEY: ") api_secret = input("API SECRET; ") # 验证token是否有效 if get_access_token(api_key, api_secret): # 加密保存到文件中 if not os.path.exists(token_file_path): file.write_file(crypto.Crypto().encrypt(json.dumps({"api_key": api_key, "api_secret": api_secret})), token_file_path, file.WRITE_FILE_TYPE_REPLACE) output.print_msg("access token get succeed!") return True output.print_msg("incorrect api info, please type again!") return False
def check_login(): global USER_ID, USER_KEY # 文件存在,检查格式是否正确 if SESSION_DATA_PATH is not None: api_info = tool.json_decode(crypto.Crypto().decrypt(file.read_file(SESSION_DATA_PATH))) if crawler.check_sub_key(("user_id", "user_key"), api_info): # 验证token是否有效 if check_token(api_info["user_id"], api_info["user_key"]): # 设置全局变量 USER_ID = api_info["user_id"] USER_KEY = api_info["user_key"] return True log.step("登录信息已过期") # token已经无效了,删除掉 path.delete_dir_or_file(SESSION_DATA_PATH) while True: input_str = input(crawler.get_time() + " 未检测到api信息,是否手动输入手机号码+密码登录(1)、或者直接输入api信息进行验证(2)、或者退出程序(E)xit?").lower() if input_str in ["e", "exit"]: tool.process_exit() elif input_str not in ["1", "2"]: continue elif input_str == "1": phone_number = input(crawler.get_time() + " 请输入手机号:") password = input(crawler.get_time() + " 请输入密码:") # 模拟登录 login_status, error_message = login(phone_number, password) if login_status is False: log.step("登录失败,原因:%s" % error_message) continue elif input_str == "2": user_id = input(crawler.get_time() + " 请输入USER ID: ") user_key = input(crawler.get_time() + " 请输入USER KEY; ") # 验证token是否有效 if not check_token(user_id, user_key): log.step("无效的登录信息,请重新输入") continue # 设置全局变量 USER_ID = user_id USER_KEY = user_key # 加密保存到文件中 file.write_file(crypto.Crypto().encrypt(json.dumps({"user_id": USER_ID, "user_key": USER_KEY})), SESSION_DATA_PATH, file.WRITE_FILE_TYPE_REPLACE) return True return False
def set_token_to_file(): access_token = input(crawler.get_time() + " 请输入access_token: ") auth_token = input(crawler.get_time() + " 请输入auth_token: ") zhezhe_info = input(crawler.get_time() + " 请输入zhezhe_info: ") account_data = { "access_token": access_token, "auth_token": auth_token, "zhezhe_info": zhezhe_info, } file.write_file(crypto.Crypto().encrypt(json.dumps(account_data)), SESSION_DATA_PATH, file.WRITE_FILE_TYPE_REPLACE)
def check_login(): if not COOKIE_INFO["sessionid"] and SESSION_DATA_PATH: # 从文件中读取账号密码 account_data = tool.json_decode(crypto.Crypto().decrypt(file.read_file(SESSION_DATA_PATH)), {}) if crawler.check_sub_key(("email", "password"), account_data): if _do_login(account_data["email"], account_data["password"]): return True else: index_url = "https://www.instagram.com/" index_response = net.request(index_url, method="GET", cookies_list=COOKIE_INFO) if index_response.status == net.HTTP_RETURN_CODE_SUCCEED: return index_response.data.decode(errors="ignore").find('"viewer":{') >= 0 return False
def get_token_from_file(): account_data = tool.json_decode(crypto.Crypto().decrypt( file.read_file(SESSION_DATA_PATH))) if account_data is None: return False if crawler.check_sub_key(("access_token", "auth_token", "zhezhe_info"), account_data): global ACCESS_TOKEN, AUTH_TOKEN, ZHEZHE_INFO ACCESS_TOKEN = account_data["access_token"] AUTH_TOKEN = account_data["auth_token"] ZHEZHE_INFO = account_data["zhezhe_info"] return True return False
def login_from_console(): # 从命令行中输入账号密码 while True: email = input(tool.get_time() + " 请输入邮箱: ") password = input(tool.get_time() + " 请输入密码: ") while True: input_str = input(tool.get_time() + " 是否使用这些信息(Y)es或重新输入(N)o: ") input_str = input_str.lower() if input_str in ["y", "yes"]: if _do_login(email, password): if IS_LOCAL_SAVE_SESSION and SESSION_DATA_PATH: file.write_file(crypto.Crypto().encrypt(json.dumps({"email": email, "password": password})), SESSION_DATA_PATH, file.WRITE_FILE_TYPE_REPLACE) return True return False elif input_str in ["n", "no"]: break