2010 字
10 分钟
飞牛社区自动签到脚本
飞牛社区自动签到脚本指南
在这篇文章中,我将分享一个自动签到的 Python 脚本,适用于飞牛社区。通过该脚本,您可以方便快捷地完成每日签到,避免手动操作的繁琐。
实现功能
该脚本主要负责完成以下任务:
-
自动发送签到请求,获取签到结果。
-
提取并展示用户的签到情况,包括最近打卡、本月打卡和累计打卡奖励等信息并发送邮件通知本人。
-
在发生错误时,自动发送电子邮件通知本人。
代码解析
请求部分:
使用 requests 库向签到接口发起 GET 请求,并根据返回的数据判断签到结果。
def sign_in(): try: # 签到请求链接右键打卡按钮直接复制替换 response = requests.get('*******签到请求链接右键打卡按钮直接复制替换*******', cookies=cookies)
if '恭喜您,打卡成功!' in response.text: print('签到详情(打卡成功):\n') get_sign_in_info() elif '您今天已经打过卡了,请勿重复操作!' in response.text: print('签到详情(已经打过卡了):\n') get_sign_in_info() else: print('打卡失败, cookies可能已经过期或站点更新.') smtp(title='飞牛社区自动签到(打卡失败)', content='cookies可能已经过期或站点更新.') # 发送邮件 except Exception as error: print('签到请求失败:', error) smtp(title='飞牛社区自动签到(请求失败)', content=str(error)) # 发送邮件若签到成功或已签到,脚本会调用 get_sign_in_info() 函数获取详细信息。
def get_sign_in_info(): try: response = requests.get('https://club.fnnas.com/plugin.php?id=zqlj_sign', cookies=cookies)
soup = BeautifulSoup(response.text, 'html.parser') content = []
# 定义需要查找的模式和选择器 patterns = [ {'name': '最近打卡', 'selector': 'li:-soup-contains("最近打卡")'}, {'name': '本月打卡', 'selector': 'li:-soup-contains("本月打卡")'}, {'name': '连续打卡', 'selector': 'li:-soup-contains("连续打卡")'}, {'name': '累计打卡', 'selector': 'li:-soup-contains("累计打卡")'}, {'name': '累计奖励', 'selector': 'li:-soup-contains("累计奖励")'}, {'name': '最近奖励', 'selector': 'li:-soup-contains("最近奖励")'}, {'name': '当前打卡等级', 'selector': 'li:-soup-contains("当前打卡等级")'} ]
for pattern in patterns: element = soup.select_one(pattern['selector']) if element: # 提取文本并清洗 text = element.get_text() content.append(f"{pattern['name']}: {text.split(':')[-1].strip()}") content_text = '\n'.join(content) print(content_text + '\n') smtp(title='飞牛社区自动签到(成功)', content=str(content_text)) # 发送邮件
except Exception as error: print('获取打卡信息失败:', error) smtp(title='飞牛社区自动签到(获取打卡信息失败)', content=str(error)) # 发送邮件信息提取:
脚本使用 BeautifulSoup 对 HTML 内容进行解析,提取用户的签到信息。我们定义了一系列的模式,通过选择器查找特定的文本。
def get_sign_in_info(): try: response = requests.get('https://club.fnnas.com/plugin.php?id=zqlj_sign', cookies=cookies)
soup = BeautifulSoup(response.text, 'html.parser') content = []
# 定义需要查找的模式和选择器 patterns = [ {'name': '最近打卡', 'selector': 'li:-soup-contains("最近打卡")'}, {'name': '本月打卡', 'selector': 'li:-soup-contains("本月打卡")'}, {'name': '连续打卡', 'selector': 'li:-soup-contains("连续打卡")'}, {'name': '累计打卡', 'selector': 'li:-soup-contains("累计打卡")'}, {'name': '累计奖励', 'selector': 'li:-soup-contains("累计奖励")'}, {'name': '最近奖励', 'selector': 'li:-soup-contains("最近奖励")'}, {'name': '当前打卡等级', 'selector': 'li:-soup-contains("当前打卡等级")'} ]
for pattern in patterns: element = soup.select_one(pattern['selector']) if element: # 提取文本并清洗 text = element.get_text() content.append(f"{pattern['name']}: {text.split(':')[-1].strip()}") content_text = '\n'.join(content) print(content_text + '\n') smtp(title='飞牛社区自动签到(成功)', content=str(content_text)) # 发送邮件
except Exception as error: print('获取打卡信息失败:', error) smtp(title='飞牛社区自动签到(获取打卡信息失败)', content=str(error)) # 发送邮件邮件推送:
在签到成功或失败时,脚本通过 SMTP 发送结果邮件,保证用户及时了解签到状态。
def smtp(title: str, content: str): """ 使用 SMTP 邮件 推送消息。 """ if ( not push_config.get("SMTP_SERVER") or not push_config.get("SMTP_SSL") or not push_config.get("SMTP_EMAIL") or not push_config.get("SMTP_PASSWORD") or not push_config.get("SMTP_NAME") ): print( "SMTP 邮件 的 SMTP_SERVER 或者 SMTP_SSL 或者 SMTP_EMAIL 或者 SMTP_PASSWORD 或者 SMTP_NAME 未设置!!\n取消推送" ) return print("SMTP 邮件 服务启动")
message = MIMEText(content, "plain", "utf-8") message["From"] = formataddr( ( Header(push_config.get("SMTP_NAME"), "utf-8").encode(), push_config.get("SMTP_EMAIL"), ) ) message["To"] = formataddr( ( Header(push_config.get("SMTP_NAME"), "utf-8").encode(), push_config.get("SMTP_EMAIL"), ) ) message["Subject"] = Header(title, "utf-8")
try: smtp_server = ( smtplib.SMTP_SSL(push_config.get("SMTP_SERVER")) if push_config.get("SMTP_SSL") == "true" else smtplib.SMTP(push_config.get("SMTP_SERVER")) ) smtp_server.login( push_config.get("SMTP_EMAIL"), push_config.get("SMTP_PASSWORD") ) smtp_server.sendmail( push_config.get("SMTP_EMAIL"), push_config.get("SMTP_EMAIL"), message.as_bytes(), ) smtp_server.close() print("SMTP 邮件 推送成功!") except Exception as e: print(f"SMTP 邮件 推送失败!{e}")使用前准备
(1)用户需要设置相应的 Cookie 值和 SMTP 邮件服务配置。确保使用的邮箱支持 SMTP 发送,并提供正确的服务器信息。
-
打开链接登录后,使用开发者模式获取所需要的Cookie相应字段的值。
-
邮件服务可以选择配置,详细配置教程可以参考来自bing的搜索。
# 填写对应的 Cookie 值cookies = { 'pvRK_2132_saltkey': '', 'pvRK_2132_auth': '',}# SMTP 邮件服务配置push_config = { 'SMTP_SERVER': '', # SMTP 发送邮件服务器,形如 smtp.exmail.qq.com:465 'SMTP_SSL': 'true', # SMTP 发送邮件服务器是否使用 SSL,填写 true 或 false 'SMTP_EMAIL': '', # SMTP 收发件邮箱,通知将会由自己发给自己 'SMTP_PASSWORD': '', # SMTP 登录密码,也可能为特殊口令,视具体邮件服务商说明而定 'SMTP_NAME': '定时任务', # SMTP 收发件人姓名,可随意填写}(2)签到链接获取
# 签到请求链接右键打卡按钮直接复制替换response = requests.get('**签到请求链接右键打卡按钮直接复制替换**', cookies=cookies)完整脚本
import requestsfrom bs4 import BeautifulSoupimport smtplibfrom email.mime.text import MIMETextfrom email.header import Headerfrom email.utils import formataddr
# 填写对应的 Cookie 值cookies = { 'pvRK_2132_saltkey': '', 'pvRK_2132_auth': '',}# SMTP 邮件服务配置push_config = { 'SMTP_SERVER': '', # SMTP 发送邮件服务器,形如 smtp.exmail.qq.com:465 'SMTP_SSL': 'true', # SMTP 发送邮件服务器是否使用 SSL,填写 true 或 false 'SMTP_EMAIL': '', # SMTP 收发件邮箱,通知将会由自己发给自己 'SMTP_PASSWORD': '', # SMTP 登录密码,也可能为特殊口令,视具体邮件服务商说明而定 'SMTP_NAME': '定时任务', # SMTP 收发件人姓名,可随意填写}
def sign_in(): try: # 签到请求链接右键打卡按钮直接复制替换 response = requests.get('**签到请求链接右键打卡按钮直接复制替换**', cookies=cookies)
if '恭喜您,打卡成功!' in response.text: print('签到详情(打卡成功):\n') get_sign_in_info() elif '您今天已经打过卡了,请勿重复操作!' in response.text: print('签到详情(已经打过卡了):\n') get_sign_in_info() else: print('打卡失败, cookies可能已经过期或站点更新.') smtp(title='飞牛社区自动签到(打卡失败)', content='cookies可能已经过期或站点更新.') # 发送邮件 except Exception as error: print('签到请求失败:', error) smtp(title='飞牛社区自动签到(请求失败)', content=str(error)) # 发送邮件
def get_sign_in_info(): try: response = requests.get('https://club.fnnas.com/plugin.php?id=zqlj_sign', cookies=cookies)
soup = BeautifulSoup(response.text, 'html.parser') content = []
# 定义需要查找的模式和选择器 patterns = [ {'name': '最近打卡', 'selector': 'li:-soup-contains("最近打卡")'}, {'name': '本月打卡', 'selector': 'li:-soup-contains("本月打卡")'}, {'name': '连续打卡', 'selector': 'li:-soup-contains("连续打卡")'}, {'name': '累计打卡', 'selector': 'li:-soup-contains("累计打卡")'}, {'name': '累计奖励', 'selector': 'li:-soup-contains("累计奖励")'}, {'name': '最近奖励', 'selector': 'li:-soup-contains("最近奖励")'}, {'name': '当前打卡等级', 'selector': 'li:-soup-contains("当前打卡等级")'} ]
for pattern in patterns: element = soup.select_one(pattern['selector']) if element: # 提取文本并清洗 text = element.get_text() content.append(f"{pattern['name']}: {text.split(':')[-1].strip()}") content_text = '\n'.join(content) print(content_text + '\n') smtp(title='飞牛社区自动签到(成功)', content=str(content_text)) # 发送邮件
except Exception as error: print('获取打卡信息失败:', error) smtp(title='飞牛社区自动签到(获取打卡信息失败)', content=str(error)) # 发送邮件
def smtp(title: str, content: str): """ 使用 SMTP 邮件 推送消息。 """ if ( not push_config.get("SMTP_SERVER") or not push_config.get("SMTP_SSL") or not push_config.get("SMTP_EMAIL") or not push_config.get("SMTP_PASSWORD") or not push_config.get("SMTP_NAME") ): print( "SMTP 邮件 的 SMTP_SERVER 或者 SMTP_SSL 或者 SMTP_EMAIL 或者 SMTP_PASSWORD 或者 SMTP_NAME 未设置!!\n取消推送" ) return print("SMTP 邮件 服务启动")
message = MIMEText(content, "plain", "utf-8") message["From"] = formataddr( ( Header(push_config.get("SMTP_NAME"), "utf-8").encode(), push_config.get("SMTP_EMAIL"), ) ) message["To"] = formataddr( ( Header(push_config.get("SMTP_NAME"), "utf-8").encode(), push_config.get("SMTP_EMAIL"), ) ) message["Subject"] = Header(title, "utf-8")
try: smtp_server = ( smtplib.SMTP_SSL(push_config.get("SMTP_SERVER")) if push_config.get("SMTP_SSL") == "true" else smtplib.SMTP(push_config.get("SMTP_SERVER")) ) smtp_server.login( push_config.get("SMTP_EMAIL"), push_config.get("SMTP_PASSWORD") ) smtp_server.sendmail( push_config.get("SMTP_EMAIL"), push_config.get("SMTP_EMAIL"), message.as_bytes(), ) smtp_server.close() print("SMTP 邮件 推送成功!") except Exception as e: print(f"SMTP 邮件 推送失败!{e}")
if __name__ == '__main__': sign_in()结尾
通过这个自动签到脚本,我们能够实现自动化操作,提高效率。如果您在使用过程中遇到问题,欢迎在评论区交流。