首页/编程/python/文章阅读

记一次akile.io平台的自动登录签到程序python3版本

python 2024-12-21 30 0

突然发现akile.io换可签到方式,以前是在tg群里面发送指令签到,现在换成web页面签到。

无疑,以前tg的要实现自动签到更简单,现在web页面签到稍微麻烦一点点。

一开始打算使用api地址请求登录签到,想到它的账号有效期只有24小时,所以携带参数直接请求签到接口直接pass。

那么换一个方法,先请求登录接口,拿到token等一系列的参数后保存再请求签到接口。

想法是好的,操作起来全是403/404/502响应码,所以放弃,又换下一种方式。

直接真实浏览器跑页面!

真实模拟(也可以叫做自动化),去年接触了好几个月,自己还用按键精灵和python-autogui写了玩穿越火线CF自动跑商的脚本(挑战新模式赚CF点的)。

又因为akile的页面是 js 渲染的,请求 view-source 很轻量,什么东西都拿不到。

通过查询选择了google-chrome+chromedriver实现,第一次在vps上部署环境花了点时间,后面开始询问ai,自己改代码绕了好久。

期间,还有一个让我差点气到吐血的问题。我以为是bug,实际是提交的密码多了一个字符。因为这多出来的一个字符,我代码改了三遍,最后实在不想改,差点想放弃的时候,查看了一下main里面的账号,终于发现!

差点蠢哭了!!!

终于,,,完成,今天最后一个账号测试也成功了。

明天等签到机会刷新再跑一次试试。

目前放在美国机器上测试的,优点是方便,用 crontab 设置个定时就行。缺点是同一个机器同一个IP账号不建议放太多,我只有两个账号,先测试个把月再说。

效果:

记一次akile.io平台的自动登录签到程序python3版本

log记录:

root@localhost:/www/wwwroot/moren.com# python3 akile.py 2024-12-21 20:27:27,010 - INFO - 开始处理账号:第一个账号 2024-12-21 20:27:27,876 - INFO - 浏览器启动成功 2024-12-21 20:27:28,287 - INFO - 成功访问登录页面 2024-12-21 20:27:30,049 - INFO - 页面加载完成 2024-12-21 20:27:30,577 - INFO - 已输入邮箱 2024-12-21 20:27:31,868 - INFO - 已输入密码 2024-12-21 20:27:32,984 - INFO - 已点击登录按钮 2024-12-21 20:27:33,986 - INFO - 登录成功 2024-12-21 20:27:34,987 - INFO - 进入签到模块… 2024-12-21 20:27:34,988 - INFO - 检测到用户已登录,跳转到控制台页面 2024-12-21 20:27:36,772 - INFO - 页面加载完成 2024-12-21 20:27:46,958 - ERROR - 等待"每日签到"按钮超时或未能找到按钮 2024-12-21 20:27:46,959 - INFO - 自动登录签到流程完成! 2024-12-21 20:27:47,178 - INFO - 浏览器已关闭 已删除 Chrome 用户数据目录: /root/.config/google-chrome 2024-12-21 20:27:52,206 - INFO - 开始处理账号:第二个账号 2024-12-21 20:27:52,989 - INFO - 浏览器启动成功 2024-12-21 20:27:53,323 - INFO - 成功访问登录页面 2024-12-21 20:27:55,065 - INFO - 页面加载完成 2024-12-21 20:27:55,635 - INFO - 已输入邮箱 2024-12-21 20:27:56,895 - INFO - 已输入密码 2024-12-21 20:27:58,009 - INFO - 已点击登录按钮 2024-12-21 20:27:59,011 - INFO - 登录成功 2024-12-21 20:28:00,012 - INFO - 进入签到模块… 2024-12-21 20:28:00,012 - INFO - 检测到用户已登录,跳转到控制台页面 2024-12-21 20:28:01,038 - INFO - 页面加载完成 2024-12-21 20:28:11,147 - ERROR - 等待"每日签到"按钮超时或未能找到按钮 2024-12-21 20:28:11,148 - INFO - 自动登录签到流程完成! 2024-12-21 20:28:11,350 - INFO - 浏览器已关闭 已删除 Chrome 用户数据目录: /root/.config/google-chrome 2024-12-21 20:28:16,378 - INFO - 开始处理账号:第三个账号 2024-12-21 20:28:17,310 - INFO - 浏览器启动成功 2024-12-21 20:28:17,853 - INFO - 成功访问登录页面 2024-12-21 20:28:19,866 - INFO - 页面加载完成 2024-12-21 20:28:20,386 - INFO - 已输入邮箱 2024-12-21 20:28:21,619 - INFO - 已输入密码 2024-12-21 20:28:22,718 - INFO - 已点击登录按钮 2024-12-21 20:28:23,720 - INFO - 登录成功 2024-12-21 20:28:24,721 - INFO - 进入签到模块… 2024-12-21 20:28:24,722 - INFO - 检测到用户已登录,跳转到控制台页面 2024-12-21 20:28:25,922 - INFO - 页面加载完成 2024-12-21 20:28:35,945 - ERROR - 等待"每日签到"按钮超时或未能找到按钮 2024-12-21 20:28:35,946 - INFO - 自动登录签到流程完成! 2024-12-21 20:28:36,158 - INFO - 浏览器已关闭 已删除 Chrome 用户数据目录: /root/.config/google-chrome 2024-12-21 20:28:41,200 - INFO - 开始处理账号:第四个账号 2024-12-21 20:28:41,946 - INFO - 浏览器启动成功 2024-12-21 20:28:42,281 - INFO - 成功访问登录页面 2024-12-21 20:28:44,125 - INFO - 页面加载完成 2024-12-21 20:28:44,560 - INFO - 已输入邮箱 2024-12-21 20:28:45,790 - INFO - 已输入密码 2024-12-21 20:28:46,983 - INFO - 已点击登录按钮 2024-12-21 20:28:47,984 - INFO - 登录成功 2024-12-21 20:28:48,985 - INFO - 进入签到模块… 2024-12-21 20:28:48,985 - INFO - 检测到用户已登录,跳转到控制台页面 2024-12-21 20:28:50,297 - INFO - 页面加载完成 2024-12-21 20:29:00,369 - ERROR - 等待"每日签到"按钮超时或未能找到按钮 2024-12-21 20:29:00,370 - INFO - 自动登录签到流程完成! 2024-12-21 20:29:00,589 - INFO - 浏览器已关闭 已删除 Chrome 用户数据目录: /root/.config/google-chrome root@localhost:/www/wwwroot/moren.com#

完整代码:

[login]
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, WebDriverException
import logging
import time
import os
import shutil

配置日志

logging.basicConfig( level=logging.INFO, format=‘%(asctime)s - %(levelname)s - %(message)s’ ) logger = logging.getLogger(name)

class AkileAutoLogin: def init(self, username, password): self.username = username self.password = password self.driver = None self.max_retries = 3 self.retry_delay = 5

def setup_driver(self):
    """设置并配置Chrome浏览器"""
    try:
        options = webdriver.ChromeOptions()
        options.binary_location = '/opt/google/chrome/chrome'

        # 基本配置
        options.add_argument('--no-sandbox')
        options.add_argument('--headless')
        options.add_argument('--enable-javascript') 
        options.add_argument('--start-maximized')
        options.add_argument('--disable-gpu')
        options.add_argument('--disable-dev-shm-usage')

        # 添加 User-Agent 伪装
        user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
        options.add_argument(f'user-agent={user_agent}')

        # 用户配置文件
        chrome_user_dir = os.path.expanduser('~/.config/google-chrome')
        if not os.path.exists(chrome_user_dir):
            os.makedirs(chrome_user_dir)
        options.add_argument(f"--user-data-dir={chrome_user_dir}")

        # ChromeDriver配置
        chromedriver_path = "/www/wwwroot/moren.com/google/chromedriver"
        service = Service(executable_path=chromedriver_path)

        # 重试机制
        for attempt in range(self.max_retries):
            try:
                self.driver = webdriver.Chrome(service=service, options=options)
                self.driver.set_page_load_timeout(30)
                logger.info("浏览器启动成功")
                break
            except WebDriverException as e:
                logger.error(f"第{attempt + 1}次浏览器启动失败: {str(e)}")
                if attempt == self.max_retries - 1:
                    raise
                time.sleep(self.retry_delay)

    except Exception as e:
        logger.error(f"浏览器启动失败: {str(e)}")
        raise


def wait_for_page_load(self, timeout=10):
    """等待页面完全加载"""
    try:
        WebDriverWait(self.driver, timeout).until(
            lambda driver: driver.execute_script("return document.readyState") == "complete"
        )
        logger.info("页面加载完成")
    except TimeoutException:
        logger.error("页面加载超时")
        raise

def wait_and_find_element(self, by, value, timeout=10, condition=EC.presence_of_element_located):
    """统一的元素等待和查找方法"""
    try:
        element = WebDriverWait(self.driver, timeout).until(
            condition((by, value))
        )
        return element
    except Exception as e:
        logger.error(f"等待元素失败 ({by}={value}): {str(e)}")
        raise

def login(self):
    """执行登录操作"""
    try:
        # 访问登录页面
        self.driver.get("https://akile.io/login")
        logger.info("成功访问登录页面")
        time.sleep(1)
        # 等待页面加载完成
        self.wait_for_page_load()

        # 调用qiandao方法,检查是否已登录并尝试签到
        # if self.qiandao():  # 如果签到成功,则提前返回
        #     logger.info("已成功执行签到,跳过登录")
        #     return True

        # 打印当前页面 HTML 源代码
        # logger.info("当前页面 HTML 源代码:")
        # logger.info(self.driver.page_source)

        # 等待页面表单加载完成
        self.wait_and_find_element(By.CLASS_NAME, "arco-form")

        # 查找并填写邮箱
        email_input = self.wait_and_find_element(
            By.CSS_SELECTOR,
            "input[type='text'][placeholder='Enter your email']"
        )
        email_input.clear()
        email_input.send_keys(self.username)
        logger.info("已输入邮箱")
        time.sleep(1)
        # 查找并填写密码
        password_input = self.wait_and_find_element(
            By.CSS_SELECTOR,
            "input[type='password'][placeholder='Enter your password']"
        )
        password_input.clear()
        password_input.send_keys(self.password)
        logger.info("已输入密码")
        time.sleep(1)
        # 点击登录按钮
        login_button = self.wait_and_find_element(
            By.CSS_SELECTOR,
            "button[type='submit']",
            condition=EC.element_to_be_clickable
        )
        self.driver.execute_script("arguments[0].click();", login_button)
        logger.info("已点击登录按钮")
        time.sleep(1)

        logger.info("登录成功")
        time.sleep(1)

        logger.info("进入签到模块...")
        # logger.info(self.driver.page_source)
        self.qiandao()
        return True

    except TimeoutException:
        logger.error("页面加载或元素等待超时")
        return False
    except Exception as e:
        logger.error(f"登录过程出错: {str(e)}")
        return False

def close(self):
    """关闭浏览器并删除所有缓存数据,包括cookies"""
    try:
        if self.driver:
            # 删除所有Cookies
            # self.driver.delete_all_cookies()
            # logger.info("已删除所有Cookies")
            # 关闭浏览器
            self.driver.quit()
            logger.info("浏览器已关闭")
    except Exception as e:
        logger.error(f"关闭浏览器时出错: {str(e)}")

    # Chrome清除所有数据
    chrome_user_data_path = os.path.expanduser("~/.config/google-chrome")
    # 检查路径是否存在
    if os.path.exists(chrome_user_data_path):
        # 删除整个目录及其内容
        shutil.rmtree(chrome_user_data_path)
        print(f"已删除 Chrome 用户数据目录: {chrome_user_data_path}")
    else:
        print(f"未找到 Chrome 用户数据目录: {chrome_user_data_path}")




def qiandao(self):

    logger.info("检测到用户已登录,跳转到控制台页面")
    self.driver.get("https://akile.io/console")
     # 打印当前页面 HTML 源代码
    # logger.info("当前页面 HTML 源代码:")
    # logger.info(self.driver.page_source)
    # 检查是否已登录
    self.wait_for_page_load()  # 等待控制
    # logger.info("跳转后的页面HTML:")
    # logger.info(self.driver.page_source)  # 打印HTML到日志
    # 使用CSS选择器来定位"每日签到"按钮
    try:
        # logger.info("当前页面 HTML:")
        # logger.info(self.driver.page_source)
        sign_in_button = WebDriverWait(self.driver, 10).until(
            EC.element_to_be_clickable(
                (By.XPATH, "//div[contains(@class, 'arco-statistic-value')]//button")
            )
        )
        logger.info("找到"每日签到"按钮,正在点击")
        sign_in_button.click()  # 点击按钮
    except TimeoutException:
        logger.error("等待"每日签到"按钮超时或未能找到按钮")
    # sign_in_button = self.wait_and_find_element(
    #     By.CSS_SELECTOR,
    #     "button.arco-btn[style*='position: absolute; right: 20px; bottom: 20px;']"
    # )
    # 等待并检查按钮是否可点击
    # try:
    #     # 使用 WebDriverWait 来等待元素可点击
    #     WebDriverWait(self.driver, 10).until(
    #         EC.element_to_be_clickable(sign_in_button)
    #     )
    #     logger.info("按钮可点击")
    #     sign_in_button.click()  # 如果可点击,点击按钮
    # except TimeoutException:
    #     logger.error("按钮不可点击或超时")

    # sign_in_button.click()
    # self.driver.execute_script("arguments[0].click();", sign_in_button)
    # 点击按钮
    # try:
    #     sign_in_button.click()
    # except Exception as e:
    #     logger.error(f"点击Logout按钮时出错: {str(e)}")
    #     # 如果直接点击失败,可以尝试使用JavaScript执行点击
    #     self.driver.execute_script("arguments[0].click();", sign_in_button)
    # logger.info("已点击"每日签到"按钮")


    # 若没退出先退出.
    # Logout = self.wait_and_find_element(
    #     (By.CSS_SELECTOR, "span:contains('Logout')")
    # )
    # try:
    #     Logout.click()
    # except Exception as e:
    #     logger.error(f"点击退出按钮失败: {str(e)}")
    #     # 如果直接点击失败,可以尝试使用JavaScript执行点击
    #     self.driver.execute_script("arguments[0].click();", Logout)
    #     logger.info("退出按钮已点击")

def process_account(account): “”“处理单个账号”“” username = account[“username”] password = account[“password”] logger.info(f”开始处理账号:{username}“)

# 初始化自动登录类
auto_login = AkileAutoLogin(username, password)

try:
    auto_login.setup_driver()
    if auto_login.login():
        logger.info("自动登录签到流程完成!")
    else:
        logger.error("登录失败")
except Exception as e:
    logger.error(f"发生错误: {str(e)}")
finally:
    auto_login.close()

def main(): accounts = [ {“username”: “1@gmail.com”, “password”: “123123..”}, {“username”: “1@qq.com”, “password”: “123123..”}, {“username”: “1@foxmail.com”, “password”: “123@@@”}, {“username”: “1@88.com”, “password”: “123@@@”}, ]

for account in accounts:
    process_account(account)
    time.sleep(5)  # 设置一个小的间隔,避免过快登录多个账号

if name == “main”: main()

[/login]

正文结束

Akile-HKLite-One(番茄特供)-150元/3年香港落地机akile.io自动签到获取AK币脚本第二版

评论区

还没有评论,来坐沙发吧。