Category: 技术折腾

服务器、网络、硬件与自建工具的实践记录。

  • Delta:将您的iOS设备变成经典游戏模拟器

    Delta:将您的iOS设备变成经典游戏模拟器

    您是一个热爱游戏的人,拥有iOS设备吗?您是否怀念经典视频游戏的美好时光?如果是的话,我们为您带来了令人兴奋的消息!介绍Delta,这是一款专为未越狱的iOS设备设计的全能经典视频游戏模拟器。借助Delta,您可以在iPhone或iPad上体验经典游戏,就像以前一样。

    Delta的需求

    想象一下这种情景:您坐在沙发上,回想着在玩您最喜爱的经典视频游戏上度过的无数小时。您想重温那些时光,但是您已经没有原始的游戏机了,而且也不想越狱您的iOS设备。这就是Delta要解决的问题。

    Delta

    Delta诞生于对经典游戏的热爱,以及让iOS用户能够轻松访问它而无需复杂的解决方案的愿望。它是Riley Testut的创意产物,他是一位才华横溢的开发者,也是AltStore的创始人,AltStore是在iOS设备上安装Delta的官方平台。

    通往怀旧的大门

    Delta不仅仅是一个模拟器,它是通往怀旧的大门。借助Delta,您可以模拟和玩几个经典视频游戏系统的游戏,包括:

    • 任天堂娱乐系统(NES)
    • 超级任天堂(SNES)
    • 任天堂64(N64)
    • 游戏男孩/游戏男孩颜色(GBC)
    • 游戏男孩Advance(GBA)
    • 任天堂DS(DS)
    • 世嘉创世纪/大型驱动器(GEN)(测试中)

    主要特点

    Delta配备了一系列功能,使您的经典游戏体验变得非常愉快:

    • 准确的模拟:由于成熟的底层模拟器核心,Delta提供了每个支持的系统的准确、全速度的模拟。
    • 美观的本地用户界面:用户界面从头开始为iOS设计,确保游戏体验流畅且视觉上吸引人。
    • 控制器支持:Delta支持各种控制器,包括PS4、PS5、Xbox One S、Xbox Series X和MFi游戏控制器,让您可以使用您喜欢的设置进行游戏。
    • 自定义控制器外观:选择内置的控制器外观或导入自定义外观,以个性化您的游戏体验。
    • 保存状态:从暂停菜单中保存和加载游戏状态,确保您不会丢失进度。
    • 快进:通过比正常速度更快地运行游戏来快速完成较慢的部分。
    • Delta同步:在设备之间同步您的游戏、游戏保存、保存状态、秘籍、控制器外观和控制器映射,轻松切换您的iOS设备。
    • 秘籍:为各种游戏系统解锁额外的乐趣。
    • 陀螺仪和麦克风支持:在使用陀螺仪或麦克风输入的游戏中享受独特的游戏体验。

    安装变得轻松

    由于AltStore,将Delta安装到您的iOS设备非常简单。以下是操作方法:

    1. 下载AltServer:从altstore.io获取Mac或PC上的AltServer。

    2. 连接您的iOS设备:使用闪电电缆(或iPad的USB-C)将您的iOS设备连接到计算机上。

    3. 安装:按照AltStore FAQ中提供的说明,使用AltServer将AltStore安装到您的设备上。

    4. 浏览并安装Delta:在您的设备上打开AltStore,转到“浏览”选项卡,找到Delta,然后按“免费”按钮开始安装应用程序。

    请记住,您需要每7天至少刷新一次Delta,以防止它过期。AltStore通过定期尝试在与AltServer相同的WiFi网络上后台刷新您的应用程序来简化这个过程。

    此外,您还可以从Releases下载已编译的.ipa文件,并使用您喜欢的方法进行侧载。请注意,手动侧载不会提供自动更新,因此当有新版本可用时,您需要手动更新Delta。

    幕后故事

    Delta不仅仅是一个应用程序;它是一个经过深思熟虑的项目,具有模块化设计。以下是项目背后的一瞥:

    • DeltaCore:这个框架充当了高级应用程序代码和特定模拟器核心之间的桥梁。它为您提供了所有核心Delta功能的访问权限。
    • Roxas:Riley的自有框架,用于简化iOS开发中的各种常见任务。
    • Harmony:Riley的同步框架,

    旨在同步Core Data数据库,确保无缝数据共享在您的设备之间。

    Delta支持的每个系统都作为自己的“Delta核心”来实现,无论底层核心如何,都提供一致的模拟体验。这种模块化方法允许灵活性和易于维护。

    今天开始使用Delta

    要开始使用Delta并解锁经典游戏怀旧之旅,请按照以下简单步骤操作:

    1. 克隆Delta存储库并更新Git子模块。

    2. 打开Systems/Systems.xcworkspace,在“签名和功能”选项卡中为“Systems”和“Delta”两个目标设置您自己的团队。

    3. 构建和运行应用程序!

    Delta是一个在协作中茁壮成长的项目,欢迎您使用、修改并分发Riley的项目的所有原始代码。因此,随时深入了解代码,甚至为其开发做出贡献。

  • Python实现高效日程提醒编程教程

    Python实现高效日程提醒编程教程

    在这个快节奏的时代,时间管理变得越来越重要。我们的生活和工作充满了各种各样的任务,若没有良好的日程安排和提醒系统,我们可能会错过重要的事情。想象一下,你错过了一个重要会议或者忘记了一个重要的纪念日,这可能会对你的工作和人际关系产生不利影响。为了避免这样的情况,本文将教你如何使用Python编写一个简单的日程提醒程序,让你的生活和工作变得井井有条。

    为什么选择Python?

    Python因其简洁明了的语法和强大的库支持,成为了实现自动化脚本的首选语言。不仅适合初学者入门,也能满足专业开发者的需求。在本教程中,我们将利用Python的几个强大库,比如datetime和smtplib,来创建一个日程提醒系统。

    准备工作

    在开始编码之前,请确保你的计算机上已经安装了Python环境。接下来,你需要创建一个Python文件,比如命名为reminder.py。

    步骤1:创建日程安排数据结构

    我们的提醒系统需要一个数据结构来存储所有的日程安排。在Python中,我们可以使用列表(List)来存储这些数据。

    # 日程安排列表
    schedule_list = [
        {'title': "团队会议", 'time': "2023-11-08 10:00"},
        {'title': "项目截止", 'time': "2023-11-08 18:00"},
        # 更多日程...
    ]

    在这个列表中,每个日程是一个包含title和time的字典(Dictionary),其中title表示日程的标题,time表示日程的具体时间。

    步骤2:编写提醒函数

    我们需要编写一个函数来检查当前时间与日程安排的时间,并在时间接近时发送提醒。

    import smtplib
    from email.mime.text import MIMEText
    from datetime import datetime, timedelta
    
    def send_email(subject, body):
        # 这里填写你的邮箱服务器设置,以及账号密码
        pass
    
    def check_schedule(schedule_list):
        now = datetime.now()
        for schedule in schedule_list:
            schedule_time = datetime.strptime(schedule['time'], "%Y-%m-%d %H:%M")
            if now + timedelta(minutes=30) >= schedule_time >= now:
                send_email(schedule['title'], "你有一个即将到来的日程安排。")

    在check_schedule函数中,我们首先获取当前时间,然后遍历日程安排列表,检查每个日程的时间是否即将到来。如果是,我们调用send_email函数来发送电子邮件提醒。这里,send_email函数需要你根据自己的邮箱服务提供商来填写具体的发送逻辑。

    步骤3:定时执行提醒

    我们的提醒系统需要定时检查日程安排列表,并在适当的时间发送提醒。这可以通过Python的sched模块来实现。

    import sched
    import time
    
    scheduler = sched.scheduler(time.time, time.sleep)
    
    def run_reminder(schedule_list):
        scheduler.enter(60, 1, check_schedule, (schedule_list,))
        scheduler.run()
    
    # 开始执行定时任务
    run_reminder(schedule_list)

    在这段代码中,我们创建了一个调度器对象scheduler,并使用enter方法安排了check_schedule函数每分钟执行一次。这样,我们的提醒系统就会每分钟检查一次日程安排,确保不会错过任何重要的提醒。

    在实际部署时,你可以将这个脚本放在服务器上,让它持续运行,从而实现24小时的日程提醒服务。

    结语

    至此,你已经学会了如何使用Python创建一个简单的日程提醒系统。这个系统虽然基本,但它涵盖了自动化脚本的核心概念:数据结构、函数编程、邮件发送和定时任务。你可以根据自己的需求扩展这个系统,比如添加数据库支持、集成日历应用等。

  • Windows 11更新:告别WinRAR时代

    Windows 11更新:告别WinRAR时代

    在信息技术迅猛发展的今天,我们每个人都或多或少地与各类软件打交道。这些软件如同时代的见证者,它们的更迭也在默默诉说着技术革新的步伐。而今,微软Windows 11的最新更新,或将标志着一代压缩软件巨头——WinRAR的落幕。

    软件巨变,情怀难舍

    1995年,Windows 95的到来开启了个人电脑时代的大门,而伴随它的,则是WinRAR的诞生。从那时起,WinRAR凭借其出色的压缩技术和独特的商业模式,成为了数代人的共同记忆。尤金·罗沙尔(Eugene Roshal),这位俄罗斯的程序员,用他的才华撰写了一个时代的传奇。那个熟悉的弹窗,提醒着我们的软件“试用期”已到——一个看似无休止的40天,成为了一种文化现象。

    随着时间的推移,尽管技术层出不穷,但WinRAR始终坚守其地位,似乎没有任何软件能撼动它。然而,时代的浪潮终究是要前进的。微软在Windows 11的最新可选更新中,不仅提供了原生的压缩文件支持,更是启用了所有“Moment 4”功能,包括Copilot和任务栏解组等。

    Windows 11的原生解压缩,革新还是革命?

    • Windows 11原生支持压缩文件
    • 操作系统的易用性大幅提升
    • 第三方压缩软件的市场影响

    在这次更新中,Windows 11将原生支持多达11种压缩文件格式的解压,并计划在不久的将来加入压缩功能。这意味着用户将不再需要依赖WinRAR等第三方软件来进行文件的压缩和解压操作。这一变革无疑将大幅提升操作系统的易用性和用户体验。

    但是,这种变化也带来了关于市场格局的思考。WinRAR等软件将面临巨大的挑战。毕竟,一旦操作系统自带了同样强大的功能,用户的选择很可能就会倾向于更为方便、无需额外成本的解决方案。

    WinRAR的挑战与机遇

    • WinRAR的商业模式和市场定位
    • 面对操作系统更新的应对策略
    • 第三方软件的未来道路

    WinRAR的商业模式一直以来都是其成功的秘诀之一。尽管它允许用户在试用期结束后继续使用,但是对于大型企业,它采取了严格的授权管理。这种针对性的策略使得WinRAR在企业级市场中获得了稳定的收入。但是,Windows 11的更新将迫使WinRAR必须重新思考其市场定位和商业模式。也许,这不仅是挑战,也是WinRAR探索创新,拓展新服务领域的机遇。

    对于其他第三方软件开发商来说,Windows 11的这一变化同样是一个信号,提示他们需要不断创新,以适应不断变化的市场需求和技术环境。

    在告别了一个时代的同时,我们也在迎接新技术的曙光。不变的是人们对于更好体验的追求,变的是技术的进步和市场的演变。WinRAR的40天试用期,也许在未来将不再是必须的存在,但它所代表的那份坚持和创新的精神,将永远激励着我们向前。

  • 如何创建冷钱包保护你的加密货币资产

    如何创建冷钱包保护你的加密货币资产

    在加密货币世界中,数字资产的安全性备受关注。许多人已经听说过加密货币钱包,但不是每个人都了解其中的差异,特别是冷钱包和热钱包之间的差异。在这篇文章中,我们将深入探讨这两种类型的钱包,以及如何创建冷钱包来更好地保护你的数字资产。

    热钱包 vs. 冷钱包

    热钱包 vs. 冷钱包

    热钱包

    热钱包是一种始终连接到互联网的加密货币钱包,包括在线钱包、移动钱包和桌面钱包。它们提供了快速和便捷的交易体验,适用于频繁的买卖操作。然而,热钱包的在线特性也让它们成为网络攻击的目标。因此,虽然它们适用于日常交易,但不适合长期存储大量的加密货币资产。

    冷钱包

    与热钱包相对应的是冷钱包,它不连接互联网,提供更高级别的安全性。冷钱包通常以硬件钱包(如USB设备)或纸质钱包的形式存在。由于不依赖互联网,冷钱包不容易受到网络攻击,因此是长期存储大量资产的理想选择。

    创建冷钱包的步骤

    但是,用户是否可以自己创建一个冷钱包呢?答案是肯定的。下面是创建冷钱包的步骤:

    1. 生成公钥和私钥:

      • 使用一个安全的计算机,离线生成公钥和私钥对。这可以通过使用开源的加密货币钱包软件来完成。
      • 这些密钥对将用于存储和访问你的加密货币。
    2. 打印密钥:

      • 将生成的公钥和私钥打印在纸上。确保使用一台离线的打印机,并将打印的纸存放在安全的地方,远离潜在的威胁。
    3. 保持安全:

      • 确保你的纸质冷钱包存放在安全的地方,不易被发现或盗取。
      • 避免将你的冷钱包的信息输入到在线计算机中,以减少潜在的风险。
    4. 备份:

      • 在创建冷钱包后,务必制作多份备份。这可以防止意外丢失或损坏纸质冷钱包。
      • 存储备份的位置应该与原始冷钱包的安全性一样高。
    5. 定期检查:

      • 定期检查你的冷钱包的健康状况,确保密钥没有受到损坏或退化。

    U盘作为冷钱包的替代方案

    对于一些人来说,购买硬件钱包可能是一个昂贵的选择。但是否可以使用普通的U盘作为冷钱包的替代方案呢?答案是肯定的,虽然它不如硬件钱包那样安全,但仍然是一个经济有效的选择。以下是使用U盘作为冷钱包的简单步骤:

    1. 生成密钥:

      • 使用离线计算机生成公钥和私钥对,同样要确保计算机不连接到互联网。
    2. 保存密钥到U盘:

      • 将生成的密钥保存在U盘上,确保U盘没有与互联网连接的可能。
    3. 保持安全:

      • 将U盘存放在一个安全的地方,确保它不易受到损坏或丢失。
      • 不要在未知或不受信任的计算机上插入U盘,以防恶意软件攻击。
    4. 备份:

      • 同样,制作多份备份,以防U盘损坏或丢失。
    5. 定期检查:

      • 定期检查U盘的健康状况,确保密钥的安全性。

    安全性是关键

    无论是纸质钱包还是U盘,安全性都是最重要的考虑因素。如果你的冷钱包丢失或被盗,那么你的数字资产可能会永远无法找回,这是一个巨大的风险。因此,确保你的冷钱包存放在一个安全的地方,远离潜在的威胁,是至关重要的。

    此外,由于U盘相对容易损坏,定期备份和检查U盘的健康状况对于保护你的资产也非常重要。如果U盘损坏,你将需要使用备份来恢复你的数字资产。

    结语

    总的来说,冷钱包和热钱包各有其优势和劣势。为了更好地保护你的数字资产,建议采用结合使用的策略:将少量的

    资产保存在热钱包中以方便日常交易,同时将大部分资产安全地存储在冷钱包中,以降低风险。通过谨慎管理和保护你的冷钱包,你可以在享受便利的同时,最大程度地提高你的加密货币资产的安全性。

  • 自动签到天翼云盘,告别繁琐的手动操作

    自动签到天翼云盘,告别繁琐的手动操作

    你是否也因为拥有电信手机的福利,而获得了10T的天翼云盘空间,但又不想每天都登录签到?别担心,我为你提供了一个自动签到脚本的解决方案,让你告别烦人的手动操作。

    感谢热心观众:felix发现的错误。

    为了方便大家使用,特此放上脚本的下载链接:

    玩命点我

    问题的开始

    想象一下,每天早上醒来,你需要打开手机,登录天翼云盘,找到签到入口,然后点击签到按钮。虽然这个过程看似简单,但如果你想要长期坚持每天签到,它可能会变得相当烦琐。而且,有时候你可能会因为忙碌或忘记而错过签到,错失了获得奖励的机会。

    这就是这个自动签到脚本诞生的原因。它可以轻松地代替你完成签到任务,让你享受到天翼云盘的优惠,同时又省去了不必要的手动操作。

    项目介绍

    这个项目是一个简单但非常实用的Python脚本,它可以自动登录你的天翼云盘账户,找到签到入口,并点击签到按钮,完成每日签到任务。它的使用方法也非常简单,只需将脚本上传到你的服务器上,然后设置一个定时任务即可。一旦配置完成,你就可以忘记签到的烦恼,脚本会每天按时为你签到。

    项目优势

    这个自动签到脚本具有以下几个显著的优势:

    1. 自动化操作

    脚本完全自动化,不需要手动干预。你只需设置一次,就可以忘记签到的烦恼,每天都能获得奖励。

    2. 节省时间

    手动签到可能会花费你宝贵的时间,而脚本只需要几秒钟就能完成任务,让你有更多时间用于其他事情。

    3. 避免错过签到

    由于自动定时任务的存在,你再也不会因为忘记签到而错失奖励,始终能够及时签到。

    4. 开放源代码

    这个脚本的源代码是开放的,你可以根据自己的需求进行修改和定制,以满足特定的需求。

    使用方法

    要使用这个自动签到脚本,只需按照以下简单的步骤操作:

    1. 将脚本上传到你的服务器上。
    2. 在服务器上创建一个定时任务,设置脚本每天自动执行的时间。
    3. 启动定时任务,让脚本开始自动签到。

    不需要任何复杂的配置或技术知识,即可轻松享受自动签到的便利。

    代码部分

    如果你也想告别繁琐的手动签到,省下更多的时间用于更重要的事情,那就赶紧尝试这个自动签到脚本吧!复制粘贴下面的代码,然后挂起来吧。

    import time
    import re
    import json
    import base64
    import hashlib
    import urllib.parse
    import hmac
    import rsa
    import requests
    import random
    import smtplib
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    
    BI_RM = list("0123456789abcdefghijklmnopqrstuvwxyz")
    
    B64MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    
    s = requests.Session()
    
    # 在下面两行的引号内贴上账号(仅支持手机号)和密码
    username = "手机号"
    password = "密码"
    
    # 用于发送通知的邮箱配置
    email_config = {
        "smtp_server": "修改成你的邮箱信息",  # SMTP服务器地址
        "smtp_port": 587,  # SMTP服务器端口号
        "email_address": "修改成你的邮箱信息",  # 发件人邮箱地址
        "email_password": "修改成你的邮箱信息",  # 发件人邮箱密码
        "recipient_email": "修改成你的邮箱信息",  # 收件人邮箱地址
    }
    
    if not email_config["email_address"] or not email_config["email_password"]:
        print("发件人邮箱地址或密码为空,无法发送邮件通知")
        exit()
    
    def int2char(a):
        return BI_RM[a]
    
    def b64tohex(a):
        d = ""
        e = 0
        c = 0
        for i in range(len(a)):
            if list(a)[i] != "=":
                v = B64MAP.index(list(a)[i])
                if e == 0:
                    e = 1
                    d += int2char(v >> 2)
                    c = 3 & v
                elif e == 1:
                    e = 2
                    d += int2char(c << 2 | v >> 4)
                    c = 15 & v
                elif e == 2:
                    e = 3
                    d += int2char(c)
                    d += int2char(v >> 2)
                    c = 3 & v
                else:
                    e = 0
                    d += int2char(c << 2 | v >> 4)
                    d += int2char(15 & v)
        if e == 1:
            d += int2char(c << 2)
        return d
    
    def rsa_encode(j_rsakey, string):
        rsa_key = f"-----BEGIN PUBLIC KEY-----\n{j_rsakey}\n-----END PUBLIC KEY-----"
        pubkey = rsa.PublicKey.load_pkcs1_openssl_pem(rsa_key.encode())
        result = b64tohex((base64.b64encode(rsa.encrypt(f'{string}'.encode(), pubkey))).decode())
        return result
    
    def calculate_md5_sign(params):
        return hashlib.md5('&'.join(sorted(params.split('&'))).encode('utf-8')).hexdigest()
    
    def login(username, password):
        url = ""
        urlToken = "https://m.cloud.189.cn/udb/udb_login.jsp?pageId=1&pageKey=default&clientType=wap&redirectURL=https://m.cloud.189.cn/zhuanti/2021/shakeLottery/index.html"
        s = requests.Session()
        r = s.get(urlToken)
        pattern = r"https?://[^\s'\"]+"  
        match = re.search(pattern, r.text)  
        if match:
            url = match.group()  
        else:
            print("没有找到url")
    
        r = s.get(url)
        pattern = r"<a id=\"j-tab-login-link\"[^>]*href=\"([^\"]+)\""
        match = re.search(pattern, r.text)
        if match:
            href = match.group(1)
        else:
            print("没有找到href链接")
    
        r = s.get(href)
        captchaToken = re.findall(r"captchaToken' value='(.+?)'", r.text)[0]
        lt = re.findall(r'lt = "(.+?)"', r.text)[0]
        returnUrl = re.findall(r"returnUrl= '(.+?)'", r.text)[0]
        paramId = re.findall(r'paramId = "(.+?)"', r.text)[0]
        j_rsakey = re.findall(r'j_rsaKey" value="(\S+)"', r.text, re.M)[0]
        s.headers.update({"lt": lt})
    
        username = rsa_encode(j_rsakey, username)
        password = rsa_encode(j_rsakey, password)
        url = "https://open.e.189.cn/api/logbox/oauth2/loginSubmit.do"
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/76.0',
            'Referer': 'https://open.e.189.cn/',
        }
        data = {
            "appKey": "cloud",
            "accountType": '01',
            "userName": f"{{RSA}}{username}",
            "password": f"{{RSA}}{password}",
            "validateCode": "",
            "captchaToken": captchaToken,
            "returnUrl": returnUrl,
            "mailSuffix": "@189.cn",
            "paramId": paramId
        }
        r = s.post(url, data=data, headers=headers, timeout=5)
        if (r.json()['result'] == 0):
            print(r.json()['msg'])
        else:
            print(r.json()['msg'])
        redirect_url = r.json()['toUrl']
        r = s.get(redirect_url)
        return s
    
    def sign_in(s):
        rand = str(round(time.time() * 1000))
        surl = f'https://api.cloud.189.cn/mkt/userSign.action?rand={rand}&clientType=TELEANDROID&version=8.6.3&model=SM-G930K'
        url = f'https://m.cloud.189.cn/v2/drawPrizeMarketDetails.action?taskId=TASK_SIGNIN&activityId=ACT_SIGNIN'
        url2 = f'https://m.cloud.189.cn/v2/drawPrizeMarketDetails.action?taskId=TASK_SIGNIN_PHOTOS&activityId=ACT_SIGNIN'
        url3 = f'https://m.cloud.189.cn/v2/drawPrizeMarketDetails.action?taskId=TASK_2022_FLDFS_KJ&activityId=ACT_SIGNIN'
        headers = {
            'User-Agent': 'Mozilla/5.0 (Linux; Android 5.1.1; SM-G930K Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.136 Mobile Safari/537.36 Ecloud/8.6.3 Android/22 clientId/355325117317828 clientModel/SM-G930K imsi/460071114317824 clientChannelId/qq proVersion/1.0.6',
            "Referer": "https://m.cloud.189.cn/zhuanti/2016/sign/index.jsp?albumBackupOpened=1",
            "Host": "m.cloud.189.cn",
            "Accept-Encoding": "gzip, deflate",
        }
        response = s.get(surl, headers=headers)
        netdiskBonus = response.json()['netdiskBonus']
        if (response.json()['isSign'] == "false"):
            print(f"未签到,签到获得{netdiskBonus}M空间")
            res1 = f"未签到,签到获得{netdiskBonus}M空间"
        else:
            print(f"已经签到过了,签到获得{netdiskBonus}M空间")
            res1 = f"已经签到过了,签到获得{netdiskBonus}M空间"
    
        def draw_prize(url, description_prefix):
            response = s.get(url, headers=headers)
            if ("errorCode" in response.text):
                print(response.text)
                return ""
            else:
                description = response.json()['description']
                print(f"{description_prefix}{description}")
                return f"{description_prefix}{description}"
    
        res2 = draw_prize(url, "抽奖获得")
        res3 = draw_prize(url2, "抽奖获得")
        res4 = draw_prize(url3, "链接3抽奖获得")
    
        return res1, res2, res3, res4
    
    def send_email_notification(res1, res2, res3, res4):
        msg = MIMEMultipart()
        msg["From"] = email_config["email_address"]
        msg["To"] = email_config["recipient_email"]
        msg["Subject"] = "签到通知"
    
        body = f"签到结果:\n{res1}\n{res2}{res3}{res4}"
        msg.attach(MIMEText(body, "plain"))
    
        try:
            server = smtplib.SMTP(email_config["smtp_server"], email_config["smtp_port"])
            server.starttls()
            server.login(email_config["email_address"], email_config["email_password"])
            server.sendmail(email_config["email_address"], email_config["recipient_email"], msg.as_string())
            server.quit()
            print("邮件通知已发送")
        except Exception as e:
            print(f"邮件通知发送失败:{str(e)}")
    
    def main():
        s = login(username, password)
        res1, res2, res3, res4 = sign_in(s)
        send_email_notification(res1, res2, res3, res4)
    
    def lambda_handler(event, context):
        main()
    
    def main_handler(event, context):
        main()
    
    def handler(event, context):
        main()
    
    if __name__ == "__main__":
        main()
    

    让自动化精神帮助你解放双手,享受更多的天翼云盘福利吧!

  • 解决Ubuntu上端口绑定权限问题

    解决Ubuntu上端口绑定权限问题

    在使用Ubuntu操作系统时,有时候我们需要在特定端口上运行服务,如Web服务器或其他网络应用程序。然而,当尝试在0.0.0.0:80端口上绑定服务时,您可能会遇到如下错误消息:

    listen tcp 0.0.0.0:80: bind: permission denied

    这个错误意味着您的系统权限不足,无法将服务绑定到80端口。本教程将详细介绍如何解决这个问题,让您可以成功绑定端口并运行您的服务。

    2. 解决方法

    2.1. 使用sudo命令

    最常见的解决方法是使用sudo命令来运行您的服务。sudo允许您以超级用户权限运行命令,从而解决了权限不足的问题。

    在终端中,您可以像这样使用sudo命令运行您的服务:

    sudo your_command_here

    例如,如果您要运行一个Python简单的HTTP服务器,您可以使用以下命令:

    sudo python -m SimpleHTTPServer 80

    这将以超级用户权限启动HTTP服务器,并将其绑定到80端口。

    2.2. 更改端口号

    如果您不想以超级用户权限运行服务,您可以考虑更改要绑定的端口号。通常,端口号1-1023被保留用于系统服务,而端口号1024及以上可供用户自定义服务使用。因此,选择一个高于1024的端口号可能会避免权限问题。

    例如,您可以选择绑定到8080端口:

    your_command_here -p 8080

    这将避免与系统端口冲突,并且通常不需要超级用户权限。

    2.3. 配置防火墙规则

    另一个常见的问题是防火墙规则阻止了对特定端口的访问。在某些情况下,您可能需要在防火墙中添加规则以允许流量通过您选择的端口。

    使用ufw(Uncomplicated Firewall)是一种管理防火墙规则的简便方式。首先,您需要安装ufw:

    sudo apt-get install ufw

    然后,您可以允许特定端口上的流量。例如,要允许8080端口上的HTTP流量,可以运行:

    sudo ufw allow 8080/tcp

    这将允许TCP流量通过8080端口。确保启用了防火墙,然后应用规则:

    sudo ufw enable

    2.4. 检查其他进程

    如果端口仍然无法绑定,可能是因为另一个进程已经在使用相同的端口。您可以使用netstat命令来查找正在使用的端口。

    例如,要查找80端口上的进程,可以运行:

    netstat -tuln | grep 80

    这将列出所有在80端口上监听的进程。您可以查看PID(进程标识符),然后终止不必要的进程,或者更改您的服务以使用其他可用端口。

    3. 总结

    通过本教程,您现在应该知道如何解决Ubuntu上端口绑定权限问题。您可以使用sudo命令以超级用户权限运行服务,或者更改端口号以避免冲突。此外,您还了解了如何配置防火墙规则以允许流量通过特定端口,并查找并终止正在使用相同端口的其他进程。

    在使用Ubuntu时,处理端口权限问题是非常常见的,但有了这些解决方法,您可以轻松地克服这些问题,顺利运行您的服务。

  • 创建高效的OneDrive API请求:了解Microsoft Graph的服务限制

    创建高效的OneDrive API请求:了解Microsoft Graph的服务限制

    Microsoft的OneDrive API提供了强大的功能,允许开发者与OneDrive云存储进行交互。然而,为了确保应用程序的正常运行,了解OneDrive API的请求次数限制至关重要。这方面的信息可能与Microsoft Graph的服务特定限制相关。在本教程中,我们将深入探讨OneDrive API的请求次数限制以及如何优化您的应用程序以避免限流。

    背景故事

    假设您正在开发一个应用程序,该应用程序需要与用户的OneDrive帐户进行集成,以上传、下载和管理文件。您已经成功地使用OneDrive API编写了一些功能,但最近开始遇到了一些限流问题。您的应用程序在某些情况下无法正常工作,用户体验受到了影响。现在,您想要了解更多关于OneDrive API请求次数限制的信息,以优化您的应用程序并确保它的稳定性。

    请求次数限制概述

    根据Microsoft的文档,OneDrive API的请求次数限制会根据多种因素进行评估,这些因素包括:

    1. 限制的范围: 请求次数限制可以针对跨所有租户的每个应用、所有应用的每个租户、每个租户的每个应用等进行设定。

    2. 请求类型: 不同类型的请求(例如GET、POST、PATCH等)可能会有不同的限制。

    3. 其他因素: 还有其他因素,如请求的频率、请求的负载等,都可能影响限制。

    一旦您的应用程序达到其中任何一个限制,就会触发限流行为。这可能导致您的应用程序收到HTTP状态代码503,并且Microsoft会在Office 365 Message Center中通知租户。这对于保护OneDrive和确保服务的稳定性至关重要。

    实际案例和限流问题

    让我们来看一些实际案例,以更好地理解OneDrive API的请求次数限制问题:

    1. 案例1: 一个开发者在Microsoft Q&A中指出,根据文档,他应该可以在一分钟内发出1800个List Drive(3600个资源单位)请求,但实际上在大约1600-1700个请求时就触发了限流。这表明文档中的限制可能与实际情况不符。

    2. 案例2: Office 365 REST API的限制是,如果您连续超过1秒钟发送1个请求,将触发限流,并收到HTTP状态代码429(“请求过多”)。这表明请求的频率也会影响限流。

    3. 案例3: 除了API调用限制外,还有基于进出OneDrive的内容的带宽限制。尝试在OneDrive中迁移大量数据的应用可能会遇到这种情况,这种限制会返回HTTP 509带宽限制超出错误。

    4. 案例4: 有开发者表示,在将数据从Dropbox同步到SharePoint时也遇到了奇怪的速率限制。这表明不仅OneDrive API本身,还有其他因素可能影响请求次数限制。

    优化您的应用程序

    要优化您的应用程序以避免OneDrive API的限流问题,您可以采取以下措施:

    1. 请求合并: 将多个请求合并为一个,以减少请求次数。这可以通过使用Batch请求或批量操作来实现。

    2. 限流策略: 实现自定义的限流策略,根据请求类型和频率来管理请求。

    3. 缓存数据: 对于频繁访问的数据,实现数据缓存,以减少对OneDrive的请求。

    4. 错误处理: 针对限流错误(HTTP状态代码503和429)实施有效的错误处理,以提高应用程序的鲁棒性。

    5. 监控和警报: 实施监控和警报机制,以及时检测到限流问题并采取措施。

    结论

    了解OneDrive API的请求次数限制是开发与OneDrive集成的关键。根据不同情况和限制因素,您可以采取各种措施来优化您的应用程序,确保其稳定性和性能。请根据您的特定用例和应用程序设计来考虑这些限制,并随时与Microsoft联系以获取更详细的信息或寻求特定的解决方案。

    在开发和维护与OneDrive集成的应用程序时,密切关注请求次数限制是确保应用程序正常运行的关键一步。

  • Ubuntu系统挂载Alist网盘 WebDav服务完全指南

    Ubuntu系统挂载Alist网盘 WebDav服务完全指南

    在数字化时代,个人搭建网盘已经非常成熟了,Alist网盘就是其中的佼佼者,已经成为数据存取的重要工具。对于Ubuntu用户来说,将Alist网盘通过WebDav协议挂载到本地,无疑可以极大提升工作效率。下面我将分步骤介绍如何在Ubuntu系统中挂载Alist WebDav。

    安装必要的davfs2组件

    在开始之前,确保你的系统已经安装了davfs2,这是一个使得Linux系统可以通过WebDav协议挂载远程网络存储的工具。打开终端,输入以下命令安装davfs2:

    sudo apt update
    sudo apt install davfs2 -y

    配置davfs2以支持Alist WebDav

    安装完成后,我们需要对davfs2进行适配Alist的配置。通过以下命令编辑davfs2的配置文件:

    sudo nano /etc/davfs2/davfs2.conf

    在配置文件中找到 ignore_dav_header 这一项。如果前面有注释符号,请删除它,并把该项的值设置为 1:

    ignore_dav_header 1

    保存并退出编辑器(在nano中,使用Ctrl+O保存,Ctrl+X退出)。

    挂载Alist WebDav

    接下来,使用mount命令手动挂载Alist WebDav。你需要替换以下命令中的 ip或者域名 和 端口号,以匹配你的Alist服务配置:

    sudo mount -t davfs http://ip或者域名:端口号/dav /mnt/webdav

    这里要注意,如果你的Alist开启了ssl,端口就是443,协议也应该改为https://。
    /mnt/webdav 这个文件夹是可以自定义的。你可以放在你喜欢的任何地方。

    如果你的Alist服务设置了用户名和密码,系统会提示你输入这些信息。

    设置系统启动时自动挂载

    为了在每次启动系统时自动挂载Alist WebDav,我们需要编辑 /etc/fstab 文件。输入以下命令来编辑该文件:

    sudo nano /etc/fstab

    在文件的最后添加以下内容,注意替换 ip或者域名 和 端口号:

    http://ip或者域名:端口号/dav /mnt/webdav davfs _netdev,auto 0 0

    这样设置后,每次Ubuntu启动时,都会自动尝试挂载Alist WebDav到 /mnt/webdav。

    以上就是将Alist网盘通过WebDav协议挂载到Ubuntu系统的详细步骤。只需简单的几步,你就可以在本地系统中无缝访问Alist网盘中的文件,提高日常工作的便利性和效率。

  • 探索游戏宇宙,与Starward共启星辰之旅

    探索游戏宇宙,与Starward共启星辰之旅

    是否已经厌倦了为了玩miHoYo桌面游戏而使用多个游戏启动器?是否渴望一种流畅的游戏体验并带有增强功能?那么请关注一下!让我们介绍一下Starward – 这款游戏启动器将彻底改变您的游戏之旅。受到Star Rail的口号“愿这段旅程引领我们星辰”启发,我们的应用程序承诺将带您踏上前所未有的星际游戏之旅。

    揭示Starward

    Starward不仅仅是一个游戏启动器;它是您进入miHoYo游戏宇宙的门户。我们的主要目标是完全取代官方启动器,然后通过添加一系列令人兴奋的功能来超越官方启动器。以下是Starward带来的功能亮点:

    • 记录游戏时间:跟踪您的游戏时间,与朋友竞争,看谁的游戏时间最长。

    • 切换游戏账户:在不必登录和注销的情况下轻松切换不同的游戏账户。

    • 查看游戏截图:轻松访问和共享游戏中的精彩时刻,重温您的史诗游戏瞬间。

    • 保存祈愿记录:不再忘记您的祈愿抽取。Starward帮助您记录祈愿瞬间。

    • HoYoLAB工具箱:直接从启动器访问HoYoLAB社区和资源。

    而这还只是个开始!我们还有更多令人兴奋的功能在计划中。

    请注意,Starward不会支持需要不断更新游戏数据和资源的功能,例如每个祈愿活动的统计数据。

    安装简单易行

    使用Starward非常简单。在开始游戏之旅之前,请确保您的设备满足以下要求:

    • Windows 10 1809 (17763)及以上版本:Starward设计为在这些版本上无缝运行。

    • Visual C++ Runtime:确保您已在系统上安装了此运行库。您可以在此处下载它。

    • WebView2 Runtime:这对于Starward的功能至关重要。您可以在此处下载它。

    • 增强您的体验:为了获得最佳体验,请在系统设置中启用透明效果和动画效果。

    准备好开始了吗?请按照以下简单的步骤操作:

    1. 前往GitHub Release并下载与您的CPU架构匹配的软件包。

    2. 将下载的软件包解压缩到您喜欢的位置。

    3. 运行 Starward.exe 并按照屏幕上的提示完成安装。

    如果您在某些设备上遇到Starward崩溃的问题,不用担心。您可以通过在 Starward 文件夹中创建一个 config.ini 文件并粘贴以下内容来解决此问题。有关 config.ini 的更多信息,请查看 docs/Configuration.md。

    UserDataFolder=.

    与Starward共同探索多元宇宙

    Starward不仅仅是关于游戏,还关乎社区和本地化。我们致力于让Starward对全球玩家都可访问。这就是为什么我们在本地化工作中使用Crowdin,从机器翻译的英文文本开始。但是,我们需要您的帮助,使Starward真正走向全球!

    • 翻译英雄:加入我们,以您的本地语言翻译和校对应用程序。您的贡献至关重要。

    • 新增语言:想要添加新的翻译语言吗?创建一个问题,让我们来实现。

    参与开发

    如果您是一名开发人员,或者只是对Starward在幕后如何运作感兴趣,您也可以做出贡献!要在本地编译项目,您需要安装Visual Studio 2022,并选择以下工作负载:

    • .NET桌面开发

    • C++桌面开发

    • 通用Windows平台开发

    我们的感激之情

    没有他人的支持和启发,我们不会走到今天。我们要感谢以下人士:

    • neon-nyan受到Collapse项目的启发。Starward不仅使用了Collapse创建的资源,还从Collapse的代码和UI设计中学到了很多。

    • CloudFlare提供了免费的CDN服务,帮助我们将Starward交付给您。

    • 第三方库对这个项目的贡献,包括Dapper、GitHub Markdown CSS、HDiffPatch、H.NotifyIcon、HoYo-Glyphs、MiniExcel、ScottPlot、Serilog、SevenZipExtractor、Vanara PInvoke、WindowsAppSDK和WindowsCommunityToolkit。

    屏幕截图

    加入Starward社区

    您准备好踏上“星辰之旅”了吗?加入我们的社区,下载Starward,提升您的游戏体验吧!

    下载Starward

    参与本地化

    探索代码

    联系我们

  • 用Avatarify Python打造虚拟存在的革命:终极逼真化身解决方案

    用Avatarify Python打造虚拟存在的革命:终极逼真化身解决方案

    在数字化存在和现实之间的界限日渐模糊的今天,人们对于更个性化、真实的虚拟互动的渴望促成了一系列突破性的创新。其中的佼佼者便是Avatarify Python,这项技术为你的数字化身注入了生命,让你能够实时体现逼真的化身,精准反映出你的每一个表情。想象一下,在视频会议中,你不仅仅以自己的身份出现,还能以动态化身的形式参与,展示你的每一个细微表情,增加了之前只存在于科幻小说中的互动层面。

    数字化新纪元的曙光

    想象这样一个场景:你即将加入一个在线会议,不再是使用那些静态的个人图片,而是选择了一个能够模仿你的手势和表情的逼真化身。随着会议的进行,你的化身会微笑、皱眉,进行表达,正如你自己一样,吸引了你同事的注意和想象。这不仅仅是对未来的一瞥;这是Avatarify Python所实现的现实。

    Avatarify Python简介

    Avatarify Python是一款使用First Order Motion Model创建视频会议用逼真化身的先进工具。它专为技术爱好者和DIY项目的熟手设计,因为它需要手动设置。然而,对于寻求更易用版本的用户,Avatarify桌面版提供了一个无需复杂安装的简化体验。

    核心特性与优势:

    • 逼真化身:Avatarify Python在化身动画的真实感上提供了无与伦比的体验,甚至能反映最微小的表情变化。
    • 定制化:按下一个按钮,你就可以在不同化身之间切换,甚至可以选择完全独一无二的StyleGAN生成的面孔。
    • 多平台支持:无论你是使用Windows、Linux,还是在移动设备上,Avatarify都有解决方案。
    • 社区与支持:通过邀请链接加入活跃的Slack社区,分享见解并获得支持。

    谁将从Avatarify Python中获益?

    Avatarify Python服务于广泛的受众,从技术爱好者和开发人员到创意专业人士和教育工作者。如果你是一个欣赏技术与创造力交叉点的人,这个项目就是为你量身定做的。

    与Avatarify互动:

    • 开发者可以深入代码,贡献并定制体验。
    • 教育工作者可以使用能够抓住学生注意力的化身,使在线学习变得更加引人入胜。
    • 创意专业人士可以在拥挤的数字空间中增加创造力的层面,脱颖而出。

    踏入Avatarify的世界

    拥有Avatarify Python,你可以无限地探索。以下是加入这场革命的方式:

    1. 对技术感兴趣的用户:遵循安装说明开始使用Avatarify Python。
    2. 追求便捷的用户:探索Avatarify桌面版,享受无忧的安装体验。
    3. 创新者:在GitHub上为项目贡献力量。

    与Avatarify一起拥抱未来

    总结时,我们可以清晰地看到,Avatarify Python不仅仅是一项技术进步;它是一种全新的数字表达方式。随着从Docker支持到iOS和Android应用的每一次更新,Avatarify变得更加容易获得和多样化。

    你的下一步:

    数字领域在进化,有了Avatarify Python,你不仅仅是跟上潮流;你正在引领潮流。那么,为什么等待?立即投入,将你的在线互动转变为真正非凡的体验。