This commit is contained in:
何夕2077
2025-06-27 04:28:27 +00:00
parent cb4d31cc5a
commit c74aab7721
18 changed files with 516 additions and 47 deletions

View File

@@ -24,8 +24,10 @@ jobs:
run: |
mkdir -p content/en
echo "Force copying specific files..."
cp -vf content/cn/_index.md content/en/_index.md || echo "Warning: content/cn/_index.md not found."
cp -vf content/cn/about.md content/en/about.md || echo "Warning: content/cn/about.md not found."
cp -vf content/cn/contact.md content/en/contact.md || echo "Warning: content/cn/contact.md not found."
cp -vf content/cn/privacy-policy.md content/en/privacy-policy.md || echo "Warning: content/cn/privacy-policy.md not found."
cp -vf content/cn/terms-of-service.md content/en/terms-of-service.md || echo "Warning: content/cn/terms-of-service.md not found."
echo "正在处理任意深度子目录下的 _index.md (不使用 nullglob)..."
find content/cn/ -type f -name "_index.md" -print0 | while IFS= read -r -d $'\0' src_file; do
@@ -71,6 +73,15 @@ jobs:
if [ -f "$en_dir/about.md" ]; then
echo "$en_dir/about.md" >> "$temp_list_file"
fi
if [ -f "$en_dir/contact.md" ]; then
echo "$en_dir/contact.md" >> "$temp_list_file"
fi
if [ -f "$en_dir/privacy-policy.md" ]; then
echo "$en_dir/privacy-policy.md" >> "$temp_list_file"
fi
if [ -f "$en_dir/terms-of-service.md" ]; then
echo "$en_dir/terms-of-service.md" >> "$temp_list_file"
fi
if [ -s "$rsync_created_files" ]; then
while IFS= read -r file_path; do
echo "$en_dir/$file_path" >> "$temp_list_file"
@@ -204,6 +215,28 @@ jobs:
print(f"Prompt Feedback: {e.response.prompt_feedback}")
return None
# --- NEW: Load default description from hugo.yaml ---
default_description_en = None
# Assuming hugo.yaml is in the script's working directory. Adjust path if necessary.
hugo_config_path = 'hugo.yaml'
try:
with open(hugo_config_path, 'r', encoding='utf-8') as f:
hugo_config = yaml.safe_load(f)
# Safely access the nested key
if hugo_config and isinstance(hugo_config.get('params'), dict):
default_description_en = hugo_config['params'].get('descriptionEn')
if default_description_en:
print(f"Successfully loaded default description from {hugo_config_path}.")
else:
print(f"Warning: 'params.descriptionEn' key not found or is empty in {hugo_config_path}.")
except FileNotFoundError:
print(f"Warning: {hugo_config_path} not found. Cannot set default description for _index.md.")
except yaml.YAMLError as ye:
print(f"Warning: Error parsing {hugo_config_path}: {ye}. Cannot set default description.")
except Exception as e:
print(f"An unexpected error occurred while reading {hugo_config_path}: {e}")
# --- Main processing loop ---
with open('files_to_translate.txt', 'r', encoding='utf-8') as f:
files_to_translate = [line.strip() for line in f if line.strip()]
@@ -310,7 +343,7 @@ jobs:
new_description += "..."
if new_description: # Only set description if plain_text_for_desc is not empty
parsed_fm['description'] = new_description
parsed_fm['description'] = default_description_en + new_description
description_content_found = True
log_description_preview = new_description[:50].replace('\n', ' ')
print(f" - Updated description from '1.' list item to: '{log_description_preview}...'")

View File

@@ -24,8 +24,10 @@ jobs:
run: |
mkdir -p content/fr
echo "Force copying specific files..."
cp -vf content/cn/_index.md content/fr/_index.md || echo "Warning: content/cn/_index.md not found."
cp -vf content/cn/about.md content/fr/about.md || echo "Warning: content/cn/about.md not found."
cp -vf content/cn/contact.md content/fr/contact.md || echo "Warning: content/cn/contact.md not found."
cp -vf content/cn/privacy-policy.md content/fr/privacy-policy.md || echo "Warning: content/cn/privacy-policy.md not found."
cp -vf content/cn/terms-of-service.md content/fr/terms-of-service.md || echo "Warning: content/cn/terms-of-service.md not found."
echo "正在处理任意深度子目录下的 _index.md (不使用 nullglob)..."
find content/cn/ -type f -name "_index.md" -print0 | while IFS= read -r -d $'\0' src_file; do
@@ -71,6 +73,15 @@ jobs:
if [ -f "$en_dir/about.md" ]; then
echo "$en_dir/about.md" >> "$temp_list_file"
fi
if [ -f "$en_dir/contact.md" ]; then
echo "$en_dir/contact.md" >> "$temp_list_file"
fi
if [ -f "$en_dir/privacy-policy.md" ]; then
echo "$en_dir/privacy-policy.md" >> "$temp_list_file"
fi
if [ -f "$en_dir/terms-of-service.md" ]; then
echo "$en_dir/terms-of-service.md" >> "$temp_list_file"
fi
if [ -s "$rsync_created_files" ]; then
while IFS= read -r file_path; do
echo "$en_dir/$file_path" >> "$temp_list_file"

View File

@@ -24,8 +24,10 @@ jobs:
run: |
mkdir -p content/ja
echo "Force copying specific files..."
cp -vf content/cn/_index.md content/ja/_index.md || echo "Warning: content/cn/_index.md not found."
cp -vf content/cn/about.md content/ja/about.md || echo "Warning: content/cn/about.md not found."
cp -vf content/cn/contact.md content/ja/contact.md || echo "Warning: content/cn/contact.md not found."
cp -vf content/cn/privacy-policy.md content/ja/privacy-policy.md || echo "Warning: content/cn/privacy-policy.md not found."
cp -vf content/cn/terms-of-service.md content/ja/terms-of-service.md || echo "Warning: content/cn/terms-of-service.md not found."
echo "正在处理任意深度子目录下的 _index.md (不使用 nullglob)..."
find content/cn/ -type f -name "_index.md" -print0 | while IFS= read -r -d $'\0' src_file; do
@@ -72,6 +74,15 @@ jobs:
if [ -f "$en_dir/about.md" ]; then
echo "$en_dir/about.md" >> "$temp_list_file"
fi
if [ -f "$en_dir/contact.md" ]; then
echo "$en_dir/contact.md" >> "$temp_list_file"
fi
if [ -f "$en_dir/privacy-policy.md" ]; then
echo "$en_dir/privacy-policy.md" >> "$temp_list_file"
fi
if [ -f "$en_dir/terms-of-service.md" ]; then
echo "$en_dir/terms-of-service.md" >> "$temp_list_file"
fi
if [ -s "$rsync_created_files" ]; then
while IFS= read -r file_path; do
echo "$en_dir/$file_path" >> "$temp_list_file"
@@ -200,6 +211,28 @@ jobs:
print(f"Prompt Feedback: {e.response.prompt_feedback}")
return None
# --- NEW: Load default description from hugo.yaml ---
default_description_ja = None
# Assuming hugo.yaml is in the script's working directory. Adjust path if necessary.
hugo_config_path = 'hugo.yaml'
try:
with open(hugo_config_path, 'r', encoding='utf-8') as f:
hugo_config = yaml.safe_load(f)
# Safely access the nested key
if hugo_config and isinstance(hugo_config.get('params'), dict):
default_description_ja = hugo_config['params'].get('descriptionJA')
if default_description_ja:
print(f"Successfully loaded default description from {hugo_config_path}.")
else:
print(f"Warning: 'params.descriptionJA' key not found or is empty in {hugo_config_path}.")
except FileNotFoundError:
print(f"Warning: {hugo_config_path} not found. Cannot set default description for _index.md.")
except yaml.YAMLError as ye:
print(f"Warning: Error parsing {hugo_config_path}: {ye}. Cannot set default description.")
except Exception as e:
print(f"An unexpected error occurred while reading {hugo_config_path}: {e}")
# --- Main processing loop ---
with open('files_to_translate.txt', 'r', encoding='utf-8') as f:
files_to_translate = [line.strip() for line in f if line.strip()]
@@ -306,7 +339,7 @@ jobs:
new_description += "..."
if new_description: # Only set description if plain_text_for_desc is not empty
parsed_fm['description'] = new_description
parsed_fm['description'] = default_description_ja + new_description
description_content_found = True
log_description_preview = new_description[:50].replace('\n', ' ')
print(f" - Updated description from '1.' list item to: '{log_description_preview}...'")

View File

@@ -59,6 +59,25 @@ jobs:
SOURCE_DIR="clone/daily"
TARGET_CONTENT_DIR="content/cn"
# --- 新增: 读取默认 description ---
echo "--- 步骤 0: 读取默认描述信息 ---"
DEFAULT_DESCRIPTION=""
if [ -f "hugo.yaml" ]; then
# 使用 yq (预装在 runner 上) 安全地解析 YAML 文件
# 'yq e' 是 evaluate 的意思, '.params.description' 是路径, '-N' 移除 '---' 分隔符
# '|| true' 确保即使 yq 找不到键也不会让脚本失败
DEFAULT_DESCRIPTION=$(yq e '.params.description' -N hugo.yaml || true)
if [ -n "$DEFAULT_DESCRIPTION" ]; then
echo "从 hugo.yaml 中读取到默认 description: $DEFAULT_DESCRIPTION"
else
echo "警告: 在 hugo.yaml 中未找到 .params.description 或其值为空。"
DEFAULT_DESCRIPTION="查看详情" # 提供一个最终的备用值
fi
else
echo "警告: hugo.yaml 文件未找到,无法读取默认 description。"
DEFAULT_DESCRIPTION="查看详情" # 提供一个最终的备用值
fi
# --- 1. 识别文件角色并立即提取所需信息 ---
echo "--- 步骤 1: 识别文件并提取关键信息 ---"
if [ ! -d "$SOURCE_DIR" ] || [ -z "$(ls -A $SOURCE_DIR)" ]; then
@@ -81,13 +100,14 @@ jobs:
echo "正在为最新笔记提取 description..."
if grep -q "AI内容摘要" "$LATEST_NOTE"; then
LATEST_DESCRIPTION=$(grep -A 5 "AI内容摘要" "$LATEST_NOTE" | sed -n '/AI内容摘要/!p' | sed 's/^[#* >]*//g' | python3 -c 'import sys; print(sys.stdin.read().replace("\n", " ").replace("```", "").strip()[:150])')
LATEST_DESCRIPTION=$(grep -A 5 "AI内容摘要" "$LATEST_NOTE" | sed -n '/AI内容摘要/!p' | sed 's/^[#* >]*//g' | python3 -c 'import sys; print(sys.stdin.read().replace("\n", " ").replace("```", "").strip()[:80])')
LATEST_DESCRIPTION="$DEFAULT_DESCRIPTION 。$LATEST_DESCRIPTION"
elif grep -q "AI产品与功能更新" "$LATEST_NOTE"; then
LATEST_DESCRIPTION=$(grep -A 5 "AI产品与功能更新" "$LATEST_NOTE" | sed -n '/AI产品与功能更新/!p' | sed 's/^[#* >]*//g' | python3 -c 'import sys; print(sys.stdin.read().replace("\n", " ").replace("```", "").strip()[:150])')
LATEST_DESCRIPTION=$(grep -A 5 "AI产品与功能更新" "$LATEST_NOTE" | sed -n '/AI产品与功能更新/!p' | sed 's/^[#* >]*//g' | python3 -c 'import sys; print(sys.stdin.read().replace("\n", " ").replace("```", "").strip()[:80])')
LATEST_DESCRIPTION="$DEFAULT_DESCRIPTION 。$LATEST_DESCRIPTION"
else
echo "警告: 最新笔记 '$LATEST_NOTE' 中未找到 'AI内容摘要' 或 'AI产品与功能更新'。将从文件开头提取描述。"
# Fallback: take first few lines, clean, and truncate
LATEST_DESCRIPTION=$(head -n 10 "$LATEST_NOTE" | sed 's/^[#* >]*//g' | python3 -c 'import sys; print(sys.stdin.read().replace("\n", " ").replace("```", "").strip()[:150])')
echo "警告: 最新笔记 '$LATEST_NOTE' 中未找到摘要。将使用 hugo.yaml 中的默认 description。"
LATEST_DESCRIPTION="$DEFAULT_DESCRIPTION"
fi
# 转义描述中的双引号以确保 YAML 格式正确
LATEST_DESCRIPTION=$(echo "$LATEST_DESCRIPTION" | sed 's/"/\\"/g')
@@ -144,12 +164,14 @@ jobs:
local_description=""
if grep -q "AI内容摘要" "$source_file"; then
local_description=$(grep -A 5 "AI内容摘要" "$source_file" | sed -n '/AI内容摘要/!p' | sed 's/^[#* >]*//g' | python3 -c 'import sys; print(sys.stdin.read().replace("\n", " ").replace("```", "").strip()[:150])')
local_description=$(grep -A 5 "AI内容摘要" "$source_file" | sed -n '/AI内容摘要/!p' | sed 's/^[#* >]*//g' | python3 -c 'import sys; print(sys.stdin.read().replace("\n", " ").replace("```", "").strip()[:80])')
local_description="$DEFAULT_DESCRIPTION 。$local_description"
elif grep -q "AI产品与功能更新" "$source_file"; then
local_description=$(grep -A 5 "AI产品与功能更新" "$source_file" | sed -n '/AI产品与功能更新/!p' | sed 's/^[#* >]*//g' | python3 -c 'import sys; print(sys.stdin.read().replace("\n", " ").replace("```", "").strip()[:150])')
local_description=$(grep -A 5 "AI产品与功能更新" "$source_file" | sed -n '/AI产品与功能更新/!p' | sed 's/^[#* >]*//g' | python3 -c 'import sys; print(sys.stdin.read().replace("\n", " ").replace("```", "").strip()[:80])')
local_description="$DEFAULT_DESCRIPTION 。$local_description"
else
echo "警告: 文件 '$source_file' 中未找到 'AI内容摘要' 或 'AI产品与功能更新'。将从文件开头提取描述。"
local_description=$(head -n 10 "$source_file" | sed 's/^[#* >]*//g' | python3 -c 'import sys; print(sys.stdin.read().replace("\n", " ").replace("```", "").strip()[:150])')
echo "警告: 文件 '$source_file' 中未找到摘要。将使用 hugo.yaml 中的默认 description。"
local_description="$DEFAULT_DESCRIPTION"
fi
# Escape quotes for YAML frontmatter
local_description=$(echo "$local_description" | python3 -c 'import sys; text = sys.stdin.read(); print(text.replace("\"", "\\\""))')

View File

@@ -2,6 +2,11 @@
name: Deploy Hugo site to Pages
on:
workflow_run:
workflows: ["Update Content from Daily Notes"]
types:
- completed
# Runs on pushes targeting the default branch
push:
branches: ["main"]
@@ -9,7 +14,7 @@ on:
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
schedule:
- cron: '0 */2 * * *' # Runs every 2 hours
- cron: '0 */4 * * *' # Runs every 2 hours
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
@@ -78,4 +83,4 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
uses: actions/deploy-pages@v4

View File

@@ -1,3 +1,67 @@
/*
给这个hugo模板代码生成css要全局水平居中不要设置最大宽度限制
*/
footer .hx-max-w-screen-xl{
max-width: 100%;
}
/* 1. 页脚主包装器 (footer-wrapper) */
.footer-wrapper {
/* 使用 Flexbox 来轻松实现居中 */
display: flex;
justify-content: center; /* 水平居中 */
align-items: center; /* 垂直居中(如果需要固定高度的话)*/
padding: 1.5rem 0.5rem; /* 上下和左右的内边距,提供呼吸空间 */
width: 100%; /* 确保它占据全部可用宽度 */
}
/* 2. 内容容器 (footer-container) */
.footer-container {
/* text-align 用于居中容器内的文本和内联块元素 */
text-align: center;
}
/* 3. 链接列表 (footer-links) */
.footer-links {
list-style: none; /* 移除列表默认的圆点 */
padding: 0; /* 移除列表默认的内边距 */
margin: 0; /* 移除列表默认的外边距 */
display: flex; /* 使用 Flexbox 来排列链接 */
flex-wrap: wrap; /* 允许链接在小屏幕上换行 */
justify-content: center; /* 确保所有链接作为一个整体居中 */
gap: 1.5rem; /* 在链接之间创建一致的间距 */
margin-bottom: 1.5rem; /* 在链接列表和版权信息之间添加一些垂直间距 */
}
/* 4. 链接项 (li) - 在这个设计中不需要单独样式 */
.footer-links li {
/* 因为使用了 Flexbox 和 gap所以不再需要 margin */
}
/* 5. 版权信息 (footer-copyright) */
.footer-copyright {
font-size: 0.9em; /* 让版权文字比链接稍微小一点 */
opacity: 0.8; /* 让版权信息稍微不那么突出 */
}
/* 6. 所有链接的通用样式 (a) */
.footer-links a,
.footer-copyright a {
color: inherit; /* 继承父元素 .footer-wrapper 的颜色 */
text-decoration: none; /* 去掉链接的下划线 */
transition: color 0.3s ease, text-decoration 0.3s ease; /* 为悬停效果添加平滑过渡 */
}
/* 7. 链接的悬停效果 (hover) */
.footer-links a:hover,
.footer-copyright a:hover {
color: #d8d8d8; /* 鼠标悬停时变为纯白色,更加醒目 */
text-decoration: underline; /* 悬停时添加下划线,明确表示这是一个可点击的链接 */
}
/**
* Hextra 主题 - Pornhub 黑暗模式风格
* 将此文件放置在 /assets/css/custom.css
@@ -190,4 +254,4 @@ body:is(html[class~="dark"] *) {
strong:is(html[class~="dark"] *) {
color: #f90;
padding: 3px;
}
}

View File

@@ -24,12 +24,4 @@ sidebar:
#### 🌱 当前探索
对 LLM应用、网站SEO 抱有浓厚兴趣,并正在积极投入学习与实践。
#### 📫 联系我
* **Email:** [274166795@qq.com](mailto:274166795@qq.com)
* **GitHub:** [https://github.com/justlovemaki](https://github.com/justlovemaki)
* {{< cards >}}
{{< card link="https://raw.githubusercontent.com/justlovemaki/CloudFlare-AI-Insight-Daily/refs/heads/main/docs/images/wechat.png" title="个人微信" subtitle="欢迎加我交流" image="https://raw.githubusercontent.com/justlovemaki/CloudFlare-AI-Insight-Daily/refs/heads/main/docs/images/wechat.png">}}
{{< /cards >}}
对 LLM应用、网站SEO 抱有浓厚兴趣,并正在积极投入学习与实践。

28
content/cn/contact.md Normal file
View File

@@ -0,0 +1,28 @@
---
title: Contact Us
type: page
sidebar:
exclude: true
---
# 联系我
我非常乐意听取您的意见和建议。如果您有任何问题、合作意向或需要支持,请通过以下方式与我联系。
我承诺会尽快回复您的邮件。
---
## **联系方式**
* **电子邮件 (Email):**
* [justlikemaki@qq.com](mailto:justlikemaki@qq.com)
* **个人微信 (Wechat):**
* {{< cards >}}
{{< card link="https://raw.githubusercontent.com/justlovemaki/CloudFlare-AI-Insight-Daily/refs/heads/main/docs/images/wechat.png" title="个人微信" subtitle="欢迎加我交流" image="https://raw.githubusercontent.com/justlovemaki/CloudFlare-AI-Insight-Daily/refs/heads/main/docs/images/wechat.png">}}
{{< /cards >}}
* **工作时间 (Office Hours):**
* 周一至周五, 上午 9:00 - 下午 6:00 (GMT+8)
* (周末及法定节假日休息)

View File

@@ -0,0 +1,177 @@
---
title: Privacy Policy
type: page
sidebar:
exclude: true
---
# 隐私政策
*最后更新日期2025年6月1日*
---
本隐私政策描述了当您使用本服务时,我们关于收集、使用和披露您信息的政策和程序,并告知您所享有的隐私权以及法律如何保护您。
我们使用您的个人数据来提供和改进本服务。使用本服务即表示您同意我们根据本隐私政策收集和使用信息。
## 解释与定义
### 解释
首字母大写的词语具有在以下条件下定义的含义。无论其以单数还是复数形式出现,下列定义均具有相同的含义。
### 定义
为本隐私政策之目的:
- **账户** 指为您创建的用于访问我们服务或服务部分内容的唯一账户。
- **关联公司** 指控制一方、被一方控制或与一方共同受控的实体其中“控制”指拥有50%或以上的股份、股权或其他有权投票选举董事或其他管理机构的证券。
- **公司** (在本协议中称为“公司”、“我们”或“我们的”) 指 **何夕2077的 AI 日报**
- **Cookies** 是网站放置在您的计算机、移动设备或任何其他设备上的小文件,其中包含您在该网站上的浏览历史详情等多种用途。
- **国家** 指:美国加利福尼亚州。
- **设备** 指任何可以访问本服务的设备,如计算机、手机或数字平板电脑。
- **个人数据** 是与已识别或可识别的个人相关的任何信息。
- **服务** 指本网站。
- **服务提供商** 指代表公司处理数据的任何自然人或法人。它指代由公司聘请的第三方公司或个人,以协助提供服务、代表公司提供服务、执行与服务相关的服务或协助公司分析服务使用情况。
- **使用数据** 指自动收集的数据,这些数据由使用服务或服务基础设施本身生成(例如,页面访问的持续时间)。
- **网站** 指 **何夕2077的 AI 日报**,可从 `https://ai.hubtoday.app/` 访问。
- **您** 指访问或使用本服务的个人,或代表该个人访问或使用本服务的公司或其他法律实体。
## 收集和使用您的个人数据
### 收集的数据类型
#### 个人数据
在使用我们的服务时,我们可能会要求您提供某些可用于联系或识别您的个人身份信息。个人身份信息可能包括但不限于:
- 电子邮件地址
- 使用数据
#### 使用数据
使用服务时会自动收集使用数据。
使用数据可能包括您设备的互联网协议地址(例如 IP 地址)、浏览器类型、浏览器版本、您访问我们服务的页面、您访问的时间和日期、在这些页面上花费的时间、唯一设备标识符和其他诊断数据。
当您通过移动设备访问服务时我们可能会自动收集某些信息包括但不限于您使用的移动设备类型、您的移动设备唯一ID、您移动设备的IP地址、您的移动操作系统、您使用的移动互联网浏览器类型、唯一设备标识符和其他诊断数据。
当您访问我们的服务或通过移动设备访问服务时,我们也可能收集您的浏览器发送的信息。
### 追踪技术和 Cookies
我们使用 Cookies 和类似的追踪技术来追踪我们服务上的活动并存储某些信息。使用的追踪技术包括信标、标签和脚本,用于收集和追踪信息,并改进和分析我们的服务。我们使用的技术可能包括:
- **Cookies 或浏览器 Cookies**Cookie 是放置在您设备上的一个小文件。您可以指示您的浏览器拒绝所有 Cookies 或在发送 Cookie 时进行提示。但是,如果您不接受 Cookies您可能无法使用我们服务的某些部分。除非您已调整浏览器设置以拒绝 Cookies否则我们的服务可能会使用 Cookies。
- **Web Beacons**我们服务的某些部分和我们的电子邮件可能包含称为网络信标的小型电子文件也称为透明GIF、像素标签和单像素GIF这些文件允许公司例如统计访问过这些页面或打开过电子邮件的用户并用于其他相关的网站统计例如记录某个部分的受欢迎程度并验证系统和服务器的完整性
Cookies 可以是“持久性”或“会话性”Cookies。当您离线时持久性 Cookies 会保留在您的个人计算机或移动设备上,而会话性 Cookies 会在您关闭网络浏览器后立即删除。
我们出于以下目的同时使用会话性和持久性 Cookies
- **必要/基本 Cookies**
- **类型**:会话 Cookies
- **管理者**:我们
- **目的**:这些 Cookies 对于通过网站向您提供可用服务以及使您能够使用其某些功能至关重要。它们有助于验证用户身份并防止欺诈性使用用户账户。没有这些 Cookies您所要求的服务将无法提供我们仅使用这些 Cookies 为您提供这些服务。
- **Cookies 政策 / 通知接受 Cookies**
- **类型**:持久性 Cookies
- **管理者**:我们
- **目的**:这些 Cookies 用于识别用户是否已接受在网站上使用 Cookies。
- **功能性 Cookies**
- **类型**:持久性 Cookies
- **管理者**:我们
- **目的**:这些 Cookies 使我们能够记住您在使用网站时所做的选择,例如记住您的登录信息或语言偏好。这些 Cookies 的目的是为您提供更个性化的体验,避免您每次使用网站时都必须重新输入您的偏好。
有关我们使用的 Cookies 和您关于 Cookies 的选择的更多信息,请访问我们的 Cookies 政策或我们隐私政策的 Cookies 部分。
### 您个人数据的使用
公司可能为以下目的使用个人数据:
- **为提供和维护我们的服务**,包括监控我们服务的使用情况。
- **为管理您的账户**:管理您作为服务用户的注册。您提供的个人数据可以使您访问作为注册用户可用的不同功能。
- **为履行合同**:为您购买的产品、物品或服务制定、遵守和履行购买合同,或通过本服务与我们签订的任何其他合同。
- **为与您联系**:通过电子邮件、电话、短信或其他等效的电子通信形式(如移动应用程序的推送通知)与您联系,告知与功能、产品或已签约服务相关的更新或信息性通信,包括安全更新,当这些是必要或合理的时候。
- **为您提供新闻**、特别优惠和关于我们提供的其他商品、服务和活动的一般信息,这些信息与您已购买或查询的类似,除非您选择不接收此类信息。
- **为管理您的请求**:处理和管理您向我们提出的请求。
- **为业务转让**:我们可能使用您的信息来评估或进行合并、剥离、重组、改组、解散或其他部分或全部资产的出售或转让,无论是以持续经营的方式还是作为破产、清算或类似程序的一部分,其中我们持有的关于我们服务用户的个人数据是转让的资产之一。
- **为其他目的**:我们可能将您的信息用于其他目的,如数据分析、识别使用趋势、确定我们促销活动的有效性,以及评估和改进我们的服务、产品、营销和您的体验。
我们可能在以下情况下共享您的个人信息:
- **与服务提供商共享**:我们可能与服务提供商共享您的个人信息,以监控和分析我们服务的使用情况,并与您联系。
- **为业务转让**:我们可能在任何合并、公司资产出售、融资或将我们全部或部分业务收购给另一家公司的谈判期间或过程中共享或转让您的个人信息。
- **与关联公司共享**:我们可能与我们的关联公司共享您的信息,在这种情况下,我们将要求这些关联公司遵守本隐私政策。关联公司包括我们的母公司和任何其他子公司、合资伙伴或我们控制的或与我们共同受控的其他公司。
- **与业务伙伴共享**:我们可能与我们的业务伙伴共享您的信息,以便为您提供某些产品、服务或促销活动。
- **与其他用户共享**:当您在公共区域与其他用户共享个人信息或进行互动时,这些信息可能被所有用户查看,并可能在外部公开发布。
- **经您同意**:经您同意,我们可能为任何其他目的披露您的个人信息。
### 您个人数据的保留
公司将仅在本隐私政策所述目的所必需的期限内保留您的个人数据。我们将在遵守我们的法律义务(例如,如果我们需要保留您的数据以遵守适用法律)、解决争议和执行我们的法律协议和政策所需的范围内保留和使用您的个人数据。
公司还将为内部分析目的保留使用数据。使用数据通常保留较短时间,除非这些数据用于加强我们服务的安全性或改进其功能,或者我们有法律义务将这些数据保留更长时间。
### 您个人数据的传输
您的信息(包括个人数据)在公司的运营办公室以及参与处理的各方所在的任何其他地方进行处理。这意味着这些信息可能会被传输到并保存在您所在州、省、国家或其他政府管辖区之外的计算机上,这些地方的数据保护法可能与您管辖区的法律不同。
您同意本隐私政策并提交此类信息,即表示您同意该传输。
公司将采取一切合理必要的措施,确保您的数据得到安全处理并符合本隐私政策,除非有足够的控制措施(包括对您的数据和其他个人信息的安全保障),否则不会将您的个人数据传输到任何组织或国家。
### 删除您的个人数据
您有权删除或请求我们协助删除我们收集的关于您的个人数据。
我们的服务可能使您能够从服务内部删除有关您的某些信息。
您可以随时登录您的账户(如果您有),并访问允许您管理个人信息的账户设置部分,来更新、修改或删除您的信息。您也可以联系我们,请求访问、更正或删除您提供给我们的任何个人信息。
但请注意,当我们有法律义务或合法依据时,我们可能需要保留某些信息。
### 您个人数据的披露
#### 商业交易
如果公司涉及合并、收购或资产出售,您的个人数据可能会被转移。我们将在您的个人数据被转移并受制于不同的隐私政策之前发出通知。
#### 执法
在某些情况下,如果法律要求或应公共机构(如法院或政府机构)的有效请求,公司可能被要求披露您的个人数据。
#### 其他法律要求
公司可能出于善意相信此类行动是必要的,从而披露您的个人数据,以:
- 遵守法律义务
- 保护和捍卫公司的权利或财产
- 防止或调查与服务相关的可能的不当行为
- 保护服务用户或公众的人身安全
- 防范法律责任
### 您个人数据的安全
您的个人数据的安全对我们很重要但请记住没有任何通过互联网传输的方法或电子存储方法是100%安全的。虽然我们努力使用商业上可接受的方式来保护您的个人数据,但我们不能保证其绝对安全。
## 儿童隐私
我们的服务不针对13岁以下的任何人。我们不会故意收集13岁以下任何人的个人身份信息。如果您是父母或监护人并且您知道您的孩子向我们提供了个人数据请与我们联系。如果我们发现我们在未经父母同意验证的情况下收集了13岁以下任何人的个人数据我们将采取措施从我们的服务器中删除该信息。
如果我们需要依赖同意作为处理您信息的法律依据,并且您所在的国家/地区要求父母同意,我们可能会在收集和使用该信息之前要求您父母的同意。
## 指向其他网站的链接
我们的服务可能包含指向非我们运营的其他网站的链接。如果您点击第三方链接,您将被引导至该第三方的网站。我们强烈建议您查看您访问的每个网站的隐私政策。
我们无法控制任何第三方网站或服务的内容、隐私政策或做法,也不承担任何责任。
## 本隐私政策的变更
我们可能会不时更新我们的隐私政策。我们将通过在此页面上发布新的隐私政策来通知您任何变更。
在变更生效前,我们将通过电子邮件和/或我们服务上的显著通知告知您,并更新本隐私政策顶部的“最后更新日期”。
建议您定期查看本隐私政策以了解任何变更。本隐私政策的变更在发布于此页面时生效。
## 联系我们
如果您对本隐私政策有任何疑问,您可以通过以下方式联系我们:
- 📧 **邮箱** [justlikemaki@qq.com](mailto:justlikemaki@qq.com)

View File

@@ -0,0 +1,54 @@
---
title: Terms of Service
type: page
sidebar:
exclude: true
---
# 服务条款
*生效日期2025年6月1日*
---
欢迎访问本网站(以下简称“**本站**”或“**我们**”)。请在使用本站服务之前,仔细阅读以下服务条款。您访问或使用本站即表示您同意并接受本条款。
## 1. 服务简介
本站为用户提供付费订阅内容和会员服务,包括但不限于博客文章、专属资源、电子书、社区互动等。部分内容仅限订阅用户访问。
## 2. 用户注册与账户
- 用户需提供有效的电子邮件地址和设置密码以注册账户。
- 用户应对其账户的安全性和所有活动负责,**禁止**将账户转让或共享。
- 本站有权在用户违反本条款的情况下,**暂停或终止**其账户。
## 3. 付费订阅服务
- 订阅服务基于月度/年度计费,费用在结算页面明示。
- 所有付款通过第三方支付平台(如 Stripe、PayPal完成本站不存储您的支付信息。
- 订阅将**自动续费**,除非您在当前计费周期结束前取消。
- 除非法律强制或在特定促销中另有说明,付款后**不予退款**。
## 4. 内容使用与知识产权
- 所有原创内容**版权归本站所有**,未经授权不得复制、转载或用于商业用途。
- 用户仅获得**非排他、不可转让的访问权**,用于个人学习和阅读。
- 如需商业用途或大量引用,请联系本站获取授权。
## 5. 用户行为规范
- **禁止**上传、发布或传播任何非法、骚扰、虚假、攻击性、侵犯他人权利的内容。
- **禁止**通过技术手段批量下载、抓取、破解会员内容。
- 本站有权移除不当内容并**封禁违规用户**。
## 6. 服务变更与中断
- 我们保留随时更改、暂停或终止部分或全部服务的权利,恕不另行通知。
- 如因不可抗力、服务器故障或第三方服务中断导致内容暂时无法访问,本站**不承担赔偿责任**。
## 7. 免责声明
- 本站提供的信息仅供参考,**不构成**任何专业建议(如财务、法律、医疗等)。
- 对于用户因使用本站内容或服务所产生的任何直接或间接损失,本站**概不负责**。
## 8. 法律适用
- 本服务条款适用美国加利福尼亚州法律,并按其解释,不考虑法律冲突原则。
- 因本条款引起的或与本条款相关的任何争议,双方应首先友好协商解决;若协商未果,您同意提交加利福尼亚州圣克拉拉县具有管辖权的法院解决。
## 9. 联系方式
- 如对本条款有任何疑问,请通过以下方式联系我们:
- 📧 **邮箱** [justlikemaki@qq.com](mailto:justlikemaki@qq.com)

View File

@@ -1,5 +1,5 @@
# Hugo configuration file
title: 何夕2077的 AI 日报 / Hex2077's AI Daily
title: 何夕2077的 AI 日报 / Hex2077's AI Daily AI信息一网打尽每天3分钟洞悉行业新动向
timezone: Asia/Shanghai
enableRobotsTXT: true
@@ -8,7 +8,7 @@ enableEmoji: true
hasCJKLanguage: true
enableInlineShortcodes: true
# services:
# services:
# googleAnalytics:
# ID: G-MEASUREMENT_ID
@@ -43,7 +43,7 @@ menu:
name: AI日报
pageRef: /
weight: 1
- identifier: contact
- identifier: about
name: 关于我 ↗
pageRef: /about
weight: 2
@@ -56,11 +56,14 @@ menu:
params:
description: AI 洞察日报 是一个基于 Cloudflare Workers 驱动的内容聚合与生成平台。它每日为您精选 AI 领域的最新动态包括行业新闻、热门开源项目、前沿学术论文、科技大V社交媒体言论并通过 Google Gemini 模型进行智能处理与摘要生成,最终自动发布到 GitHub Pages 生成 AI 日报
clarityID: "s0drt9kmxf"
description: 每日精选AI行业要闻、开源热点、学术前沿及大V观点。AI资讯AI日报AI知识库AI教程AI资讯日报AI工具AI Daily News
descriptionEn: Daily selection of AI industry news, open source hot spots, academic frontiers and big V opinions. AI information; AI daily; AI knowledge base; AI tutorials; AI information daily; AI tools;
descriptionJA: AI 業界のニュース、オープンソースのホットスポット、学術的フロンティア、ビッグ V の意見を毎日厳選。AI 情報、AI デイリー、AI ナレッジ ベース、AI チュートリアル、AI 情報デイリー、AI ツール;
logo: "images/logo.png"
author:
name: "何夕2077"
name: "何夕2077 AI信息一网打尽每天3分钟洞悉行业新动向"
bio: "去海边整点薯条"
email: "justlikemaki@qq.com"
website: "https://ai.hubtoday.app/about/"
@@ -70,7 +73,7 @@ params:
publisher:
type: "Person"
name: "何夕2077"
name: "何夕2077 AI信息一网打尽每天3分钟洞悉行业新动向"
url: "https://ai.hubtoday.app/about/"
sameAs:
- "https://github.com/justlovemaki"
@@ -88,7 +91,7 @@ params:
footer:
displayCopyright: false
displayPoweredBy: true
displayPoweredBy: false
# blog:
# list:

View File

@@ -1,6 +1,6 @@
copyright: © 2025 何夕2077 版权所有
search: Search
documentation: AI Daily
contact: Contact
about: About↗
github: GitHub
x: Twitter

View File

@@ -1,6 +1,6 @@
copyright: © 2025 何夕2077 版权所有
search: Rechercher
documentation: IA Quotidien
contact: Contact
about: À propos↗
github: GitHub
x: Twitter

View File

@@ -1,6 +1,6 @@
copyright: © 2025 何夕2077 版权所有
search: 検索
documentation: エーアイデイリー
contact: お問い合わせ
about: について↗
github: ギットハブ
x: ツイッター

View File

@@ -1,6 +1,6 @@
copyright: © 2025 何夕2077 版权所有
search: 搜索
documentation: AI日报
contact: 关于我
about: 关于我
github: 同性交友
x: 推特

View File

@@ -0,0 +1,26 @@
<div class="footer-wrapper">
<div class="footer-container">
<ul class="footer-links">
{{- $pages := slice
(dict "id" "contact" "title" "联系我们")
(dict "id" "privacy-policy" "title" "隐私政策")
(dict "id" "terms-of-service" "title" "服务条款")
-}}
{{- /* 遍历列表,我们给当前遍历的字典起个名字叫 $page_dict */ -}}
{{- range $page_dict := $pages }}
{{- $path := path.Join .Page.Language.Lang $page_dict.id -}}
{{- /* 只用 with 来检查页面是否存在并获取链接,但不使用它的标题 */ -}}
{{- with site.GetPage $path -}}
<li><a href="{{ .RelPermalink }}">{{ $page_dict.title }}</a></li>
{{- end -}}
{{- end -}}
</ul>
<div class="footer-copyright">
{{- $copyright := printf "© %d %s" now.Year site.Title -}}
<a href="{{ "" | relLangURL }}">{{ $copyright | safeHTML }}</a>
</div>
</div>
</div>

View File

@@ -1,16 +1,15 @@
{{ if .IsTranslated }}
{{ range .AllTranslations }}
<link rel="alternate" hreflang="{{ .Language.Lang }}" href="{{ .Permalink }}" />
{{ end }}
{{ end }}
<script>
//自用请修改源域名和跳转域名
// 这是一个自定义脚本,用于处理特定的页面逻辑和功能
var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.createTemplateTagFirstArg=function(a){return a.raw=a};$jscomp.createTemplateTagFirstArgWithRaw=function(a,b){a.raw=b;return a};
(function(){var a=window.location.href,b=window.location.pathname;"justlovemaki.github.io"===window.location.hostname&&b.startsWith("/Hextra-AI-Insight-Daily/")&&(b="https://ai.hubtoday.app/"+b.substring(40)+window.location.search+window.location.hash,console.log("Original URL: "+a),console.log("Redirecting to: "+b),window.location.replace(b))})();
//自用请修改Clarity代码s0drt9kmxf为你自己的
// Clarity Analytics Script
(function(c,l,a,r,i,t,y){
c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;
y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
})(window, document, "clarity", "script", "s0drt9kmxf");
// 这是一个自定义脚本,用于处理侧边栏菜单的点击阻止逻辑
document.addEventListener('DOMContentLoaded', function() {
@@ -101,6 +100,19 @@ document.addEventListener('DOMContentLoaded', function() {
</script>
{{/* 只有在配置文件中设置了 clarityID 时,才输出这段脚本 */}}
{{- if .Site.Params.clarityID -}}
<script type="text/javascript">
// Clarity Analytics Script
(function(c,l,a,r,i,t,y){
c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;
y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
})(window, document, "clarity", "script", "{{- .Site.Params.clarityID | safeJS -}}");
</script>
{{- end -}}
{{ "<!-- ENTERING partial seo-schema.html -->" | safeHTML }}
{{/* --- Publisher Block --- */}}
@@ -177,7 +189,9 @@ document.addEventListener('DOMContentLoaded', function() {
"wordCount" .WordCount
) -}}
{{- $description := .Description | default .Summary -}}
{{- $docDesc := .Description | default "" -}}
{{- $siteParamDesc := .Site.Params.description | default "" -}}
{{- $description := or $docDesc $siteParamDesc -}}
{{- with $description -}}
{{- $schema = merge $schema (dict "description" .) -}}
{{- end -}}

7
static/_headers Normal file
View File

@@ -0,0 +1,7 @@
# 允许索引所有内容,但禁止使用 Google 的 AI (Google-Extended)
/*
X-Robots-Tag: googlebot: index, nofollow, google-extended: none
# 阻止搜索引擎索引图片,但允许在搜索结果中显示(如果它们被其他页面引用)
/images/*
X-Robots-Tag: noimageindex