Spaces:
Running
Running
import requests | |
import base64 | |
import os | |
import time | |
import schedule | |
import signal | |
import sys | |
import logging | |
from urllib3.exceptions import InsecureRequestWarning | |
# 配置日志 | |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') | |
# 禁用不安全请求警告 | |
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning) | |
# 全局变量来控制脚本运行 | |
running = True | |
def signal_handler(signum, frame): | |
global running | |
logging.info("Received signal to terminate. Shutting down gracefully...") | |
running = False | |
signal.signal(signal.SIGINT, signal_handler) | |
signal.signal(signal.SIGTERM, signal_handler) | |
def fetch_and_decode_base64(url): | |
logging.info(f"Fetching: {url}") | |
try: | |
response = requests.get(url, verify=False, timeout=30) | |
response.raise_for_status() | |
decoded_content = base64.b64decode(response.text) | |
return decoded_content.decode('utf-8') | |
except requests.RequestException as e: | |
logging.error(f"Error fetching {url}: {e}") | |
return None | |
def upload_to_gist(content, gist_id, github_token): | |
url = f"https://api.github.com/gists/{gist_id}" | |
headers = { | |
'Authorization': f'token {github_token}', | |
'Accept': 'application/vnd.github.v3+json' | |
} | |
data = { | |
"files": { | |
"configsub.yaml": { | |
"content": content | |
} | |
} | |
} | |
try: | |
response = requests.patch(url, headers=headers, json=data, timeout=30) | |
response.raise_for_status() | |
logging.info(f"Successfully updated Gist: {gist_id}") | |
except requests.RequestException as e: | |
logging.error(f"Error updating Gist: {e}") | |
def run_collect_script(): | |
logging.info("Running collect.py script...") | |
try: | |
os.system("cd /app/aggregator && python -u subscribe/collect.py -si") | |
logging.info("collect.py script completed successfully") | |
except Exception as e: | |
logging.error(f"Error running collect.py script: {e}") | |
return False | |
return True | |
def run_task(): | |
logging.info("Starting task execution...") | |
if not run_collect_script(): | |
logging.warning("Failed to run collect.py, skipping this task execution") | |
return | |
file_path = '/app/aggregator/data/subscribes.txt' | |
if not os.path.exists(file_path): | |
logging.warning(f"File {file_path} does not exist, skipping this task execution") | |
return | |
with open(file_path, 'r') as file: | |
urls = file.read().strip().split('\n') | |
if not urls: | |
logging.warning("subscribes.txt is empty, skipping this task execution") | |
return | |
all_decoded_texts = [] | |
for url in urls: | |
decoded_content = fetch_and_decode_base64(url) | |
if decoded_content: | |
all_decoded_texts.append(decoded_content) | |
if not all_decoded_texts: | |
logging.warning("No content was successfully decoded, skipping this task execution") | |
return | |
merged_content = "\n".join(all_decoded_texts) | |
encoded_merged_content = base64.b64encode(merged_content.encode('utf-8')).decode('utf-8') | |
merged_file_path = '/app/aggregator/data/merged.txt' | |
with open(merged_file_path, 'w') as file: | |
file.write(encoded_merged_content) | |
logging.info(f"Encoded merged content written to {merged_file_path}") | |
github_token = os.getenv('GITHUB_TOKEN') | |
gist_id = os.getenv('GITHUB_GIST_ID') | |
upload_to_gist(encoded_merged_content, gist_id, github_token) | |
logging.info("Task execution completed") | |
def main(): | |
logging.info("Script started") | |
run_task() | |
schedule.every(6).hours.do(run_task) | |
while running: | |
schedule.run_pending() | |
time.sleep(1) | |
logging.info("Script terminated") | |
if __name__ == "__main__": | |
main() |