'''
这是海天气象数据自动更新脚本，能够将“海天气象”天气预报信息服务网站的ECMWF、CMA数值天气预报数据同步到本地计算机，使用
本脚本前请确保您的账户已升级订阅海天气象“专业用户”，服务器端数据更新时间一般在每日凌晨02时（UTC+8），因此务必在此时
间之后运行本数据更新脚本。本脚本运行需要Python环境，并正确安装BeautifulSoup、requests等库，如果成功下载文件但无法打开
请检查登录用户名和密码是否正确。如需更多使用帮助请浏览 https://app.cornicelli.net/meteo/doc，或通过邮件与开发者取
得联系：cornicelli@outlook.com。
'''
import requests
from bs4 import BeautifulSoup
import datetime
import time

# -----------------------⬇请修改以下参数：本地数据存放目录、海天气象网站专业用户账号、密码⬇-----------------------
DATA_SAVE_DIR = "C:/Users/Administrator/Desktop/"  # 本地计算机数据存放目录，更改时不要遗漏最后一个斜线字符
USER_NAME = "htqx@cornicelli.net"  # 您的海天账户注册账号（邮箱）,须先升级为高级用户或者专业用户
USER_PASSWORD = "htqx123456"  # 您的登录密码
PROJECT_CODE = "cn"  # 项目代号，默认cn无需更改
# ---------------------------------------⬆请修改以上参数⬆---------------------------------------

# 定义待下载数据文件名（以当前日期命名）
today = datetime.datetime.now().strftime("%Y-%m-%d")  # 定义当前日期，即下载最新数据
# some_day = "2024-05-01"  # 如需下载历史数据，请用该格式定义目标日期，历史数据留存留存时限为2024年4月10日至今，此前无数据
FILE_NAME_ECMWF = f"ecmwf_{PROJECT_CODE}_10_days_hourly_weather_forecast_csv_{today}.zip"  # ECMWF预报模式数据文件名
DATA_URL_ECMWF = f"https://app.cornicelli.net/meteo/download/project/{PROJECT_CODE}/{FILE_NAME_ECMWF}"

print(f"正在通过 {USER_NAME} 登录海天气象...")
# 模拟人工登录网站，验证用户名和密码
login_url = "https://app.cornicelli.net/meteo/login"
session = requests.Session()
resp = session.get(login_url)
soup = BeautifulSoup(resp.text, 'html.parser')
csrf_token = soup.find('input', {'name':'csrfmiddlewaretoken'}).get('value')
login_data = {
    'csrfmiddlewaretoken': csrf_token,
    'user-email': USER_NAME,
    "user-password": USER_PASSWORD
}
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
    'referer': 'https://app.cornicelli.net/meteo/'
}
login_resp = session.post(login_url, data=login_data, headers=headers)

print(f"正在下载{today}数据...")
# 下载数据，数据文件会被保存在设定目录下
print(f"请勿关闭本窗口，预计需等待不超过26秒。")
ecmwf_data_file = session.get(f"{DATA_URL_ECMWF}")
with open(DATA_SAVE_DIR + FILE_NAME_ECMWF, "wb") as f:
    f.write(ecmwf_data_file.content)

print(f"{FILE_NAME_ECMWF} 数据文件下载完成...")
print(f"所有数据下载完毕，请在 {DATA_SAVE_DIR} 目录查看。\n5秒后程序自动退出。")
time.sleep(5)
