def _get_update_info(changelog_page: str, readme_page: str) -> UpdateInfo: logger.info(f"尝试使用 {changelog_page} 来查询更新信息") update_info = UpdateInfo() # 获取github本项目的readme页面内容和changelog页面内容 timeout = 3 # 由于国内网络不太好,加个超时 changelog_html_text = requests.get(changelog_page, timeout=timeout).text readme_html_text = requests.get(readme_page, timeout=timeout).text # 从更新日志中提取所有版本信息 versions = re.findall(r"(?<=[vV])[0-9.]+(?=\s+\d+\.\d+\.\d+)", changelog_html_text) # 找出其中最新的那个版本号 update_info.latest_version = version_int_list_to_version( max(version_to_version_int_list(ver) for ver in versions)) # 从readme中提取最新网盘信息 netdisk_address_matches = re.findall( r'链接: <a[\s\S]+?rel="nofollow">(?P<link>.+?)<\/a> 提取码: (?P<passcode>[a-zA-Z0-9]+)', readme_html_text, re.MULTILINE) # 先选取首个网盘链接作为默认值 update_info.netdisk_link = netdisk_address_matches[0][0] update_info.netdisk_passcode = netdisk_address_matches[0][1] # 然后随机从仍有效的网盘链接中随机一个作为最终结果 random.seed(datetime.now()) random.shuffle(netdisk_address_matches) for match in netdisk_address_matches: if not is_shared_content_blocked(match[0]): update_info.netdisk_link = match[0] update_info.netdisk_passcode = match[1] break # 尝试提取更新信息 update_message_list_match_groupdict_matches = re.search( r"(?<=更新公告</h1>)\s*<ol.+?>(?P<update_message_list>(\s|\S)+?)</ol>", changelog_html_text, re.MULTILINE) if update_message_list_match_groupdict_matches is not None: update_message_list_match_groupdict = update_message_list_match_groupdict_matches.groupdict( ) if "update_message_list" in update_message_list_match_groupdict: update_message_list_str = update_message_list_match_groupdict[ "update_message_list"] update_messages = re.findall("<li>(?P<update_message>.+?)</li>", update_message_list_str, re.MULTILINE) update_info.update_message = "\n".join( f"{idx + 1}. {message}" for idx, message in enumerate(update_messages)) else: async_message_box("走到这里说明提取更新信息的正则表达式不符合最新的网页了,请到群里@我反馈,多谢0-0", "检查更新出错了", show_once_daily=True) logger.info( f"netdisk_address_matches={netdisk_address_matches}, selected=({update_info.netdisk_link}, {update_info.netdisk_passcode})" ) return update_info
def update_fallback(config: CommonConfig): if not is_windows(): return try: # 到这里一般是无法访问github,这时候试试gitee的方案 latest_version = get_version_from_gitee() ui = UpdateInfo() ui.latest_version = latest_version ui.netdisk_link = config.netdisk_link ui.netdisk_passcode = "fzls" ui.update_message = "当前无法访问github,暂时无法获取更新内容,若欲知更新内容,请浏览gitee主页进行查看哦~\n\nhttps://gitee.com/fzls/djc_helper/blob/master/CHANGELOG.MD" try_manaual_update(ui) except Exception as err: logger.error( f"手动检查版本更新失败(这个跟自动更新没有任何关系),大概率是访问不了github和gitee导致的,可自行前往网盘查看是否有更新, 错误为{err}" + color("bold_green") + f"\n(无法理解上面这段话的话,就当没看见这段话,对正常功能没有任何影响)") # 如果一直连不上github,则尝试判断距离上次更新的时间是否已经很长 time_since_last_update = datetime.now() - datetime.strptime( ver_time, "%Y.%m.%d") if time_since_last_update.days >= 7: msg = f"无法访问github确认是否有新版本,而当前版本更新于{ver_time},距今已有{time_since_last_update},很可能已经有新的版本,建议打开目录中的[网盘链接]看看是否有新版本,或者购买自动更新DLC省去手动更新的操作\n\n(如果已购买自动更新DLC,就无视这句话)" logger.info(color("bold_green") + msg) if is_first_run( f"notify_manual_update_if_can_not_connect_github_v{now_version}" ): win32api.MessageBox(0, msg, "更新提示", win32con.MB_ICONINFORMATION) webbrowser.open(config.netdisk_link)
def get_update_info(config) -> UpdateInfo: update_info = UpdateInfo() # 获取github本项目的readme页面内容和changelog页面内容 timeout = 3 # 由于国内网络不太好,加个超时 changelog_html_text = requests.get(config.changelog_page, timeout=timeout).text readme_html_text = requests.get(config.readme_page, timeout=timeout).text # 从更新日志中提取所有版本信息 versions = re.findall("(?<=[vV])[0-9.]+(?=\s+\d+\.\d+\.\d+)", changelog_html_text) # 找出其中最新的那个版本号 update_info.latest_version = version_int_list_to_version( max(version_to_version_int_list(ver) for ver in versions)) # 从readme中提取最新网盘信息 netdisk_address_matches = re.findall( '链接: <a[\s\S]+?rel="nofollow">(?P<link>.+?)<\/a> 提取码: (?P<passcode>[a-zA-Z0-9]+)', readme_html_text, re.MULTILINE) # 先选取首个网盘链接作为默认值 netdisk_link = netdisk_address_matches[0][0] netdisk_passcode = netdisk_address_matches[0][1] # 然后随机从仍有效的网盘链接中随机一个作为最终结果 random.seed(datetime.now()) random.shuffle(netdisk_address_matches) for match in netdisk_address_matches: if not is_shared_content_blocked(match[0]): update_info.netdisk_link = match[0] update_info.netdisk_passcode = match[1] break # 尝试提取更新信息 update_message_list_match_groupdict = re.search( "(?<=更新公告</h1>)\s*<ol>(?P<update_message_list>(\s|\S)+?)</ol>", changelog_html_text, re.MULTILINE).groupdict() if "update_message_list" in update_message_list_match_groupdict: update_message_list_str = update_message_list_match_groupdict[ "update_message_list"] update_messages = re.findall("<li>(?P<update_message>.+?)</li>", update_message_list_str, re.MULTILINE) update_info.update_message = "\n".join( "{}. {}".format(idx + 1, message) for idx, message in enumerate(update_messages)) logger.info("netdisk_address_matches={}, selected=({}, {})".format( netdisk_address_matches, update_info.netdisk_link, update_info.netdisk_passcode)) return update_info
def update_fallback(config: CommonConfig): if not is_windows(): return try: # 到这里一般是无法访问github,这时候试试gitee的方案 latest_version = get_version_from_gitee() ui = UpdateInfo() ui.latest_version = latest_version ui.netdisk_link = config.netdisk_link ui.netdisk_passcode = "fzls" ui.update_message = "当前无法访问github,暂时无法获取更新内容,若欲知更新内容,请浏览gitee主页进行查看哦~\n\nhttps://gitee.com/fzls/djc_helper/blob/master/CHANGELOG.MD" try_manaual_update(ui) except Exception as err: logger.error( f"手动检查版本更新失败(这个跟自动更新没有任何关系),大概率是访问不了github和gitee导致的,可自行前往网盘查看是否有更新, 错误为{err}" + color("bold_green") + "\n(无法理解上面这段话的话,就当没看见这段话,对正常功能没有任何影响)" )