146 lines
4.2 KiB
Bash
Executable File
146 lines
4.2 KiB
Bash
Executable File
#!/bin/bash
|
||
# 任务名称:微信用户反馈每分钟同步到收集表格
|
||
# 执行时间:* * * * * 每分钟执行
|
||
# 归属 Agent:小葵 xiaokui
|
||
|
||
set +e
|
||
|
||
# 环境配置
|
||
export PATH=/root/.nvm/versions/node/v24.14.0/bin:$PATH
|
||
LOG_FILE="/var/log/sync_wechat_feedback.log"
|
||
WORKSPACE="/root/.openclaw/workspace-xiaokui"
|
||
LAST_SYNC_ID_FILE="$WORKSPACE/data/last_wechat_sync_id"
|
||
TMP_DATA="$WORKSPACE/tmp/wechat_feedback.json"
|
||
|
||
# 数据库配置
|
||
DB_HOST="bj-cdb-8frbdwju.sql.tencentcdb.com"
|
||
DB_PORT="25413"
|
||
DB_USER="read_only"
|
||
DB_PASS="fdsfiidier^\$*hjfdijjd232"
|
||
DB_NAME="vala_test"
|
||
|
||
# 目标表格配置
|
||
TARGET_SPREADSHEET_TOKEN="AOxbsifk3hybRZteGowcMxNnnqc"
|
||
TARGET_SHEET_ID="f17380"
|
||
|
||
log() {
|
||
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
|
||
}
|
||
|
||
# 初始化上次同步ID
|
||
if [ ! -f "$LAST_SYNC_ID_FILE" ]; then
|
||
echo "0" > "$LAST_SYNC_ID_FILE"
|
||
fi
|
||
LAST_SYNC_ID=$(cat "$LAST_SYNC_ID_FILE")
|
||
|
||
log "=== 微信反馈同步任务开始 ==="
|
||
log "上次同步最大ID:$LAST_SYNC_ID"
|
||
|
||
# 1. 读取微信新增反馈数据
|
||
log "读取微信新增反馈数据..."
|
||
mysql -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -N -e "
|
||
SELECT id, msg_time, sender_name, msg_type, content
|
||
FROM wechat_group_message
|
||
WHERE id > $LAST_SYNC_ID
|
||
ORDER BY msg_time DESC;" > /tmp/wechat_raw.txt
|
||
|
||
if [ ! -s /tmp/wechat_raw.txt ]; then
|
||
log "无新增微信反馈数据,退出"
|
||
exit 0
|
||
fi
|
||
|
||
# 2. 转换为表格格式
|
||
log "转换数据格式..."
|
||
NEW_DATA=$(awk '
|
||
BEGIN {
|
||
print "["
|
||
first = 1
|
||
}
|
||
{
|
||
if (first == 0) print ","
|
||
first = 0
|
||
|
||
id = $1
|
||
time = $2 " " $3
|
||
sender = $4
|
||
type = $5
|
||
content = substr($0, index($0,$6))
|
||
|
||
# 处理字段
|
||
text = ""
|
||
image = ""
|
||
video = ""
|
||
if (type == "text") {
|
||
text = content
|
||
} else if (type == "image") {
|
||
image = content
|
||
} else if (type == "video") {
|
||
video = content
|
||
} else {
|
||
text = "[" type "] " content
|
||
}
|
||
|
||
gsub(/"/, "\\\"", text)
|
||
gsub(/"/, "\\\"", image)
|
||
gsub(/"/, "\\\"", video)
|
||
|
||
printf "[\"\", \"\", \"\", \"\", \"%s\", \"微信\", \"%s\", \"\", \"\", \"%s\", \"%s\", \"%s\", \"\", \"待确认\", \"\"]", time, sender, text, image, video
|
||
}
|
||
END {
|
||
print "\n]"
|
||
}' /tmp/wechat_raw.txt)
|
||
|
||
NEW_COUNT=$(echo "$NEW_DATA" | jq length)
|
||
NEW_MAX_ID=$(tail -1 /tmp/wechat_raw.txt | awk '{print $1}')
|
||
log "发现 $NEW_COUNT 条新增微信反馈数据,最大ID:$NEW_MAX_ID"
|
||
|
||
# 3. 读取目标表格现有数据(飞书+微信)
|
||
log "读取目标表格现有数据..."
|
||
TARGET_RAW=$(LARKSUITE_CLI_CONFIG_DIR=/root/.openclaw/credentials/xiaoyan lark-cli sheets +read --spreadsheet-token "$TARGET_SPREADSHEET_TOKEN" --range "$TARGET_SHEET_ID!A2:O" --as bot)
|
||
TARGET_DATA=$(echo "$TARGET_RAW" | jq '.data.valueRange.values | map(select(.[0] != null and .[0] != ""))')
|
||
|
||
if [ "$TARGET_DATA" == "null" ] || [ -z "$TARGET_DATA" ]; then
|
||
TARGET_DATA="[]"
|
||
fi
|
||
|
||
# 4. 合并数据并按时间倒序排列
|
||
echo "$NEW_DATA" > /tmp/new.json
|
||
echo "$TARGET_DATA" > /tmp/existing.json
|
||
|
||
ALL_DATA=$(jq -s 'add | sort_by(.[4]) | reverse' /tmp/new.json /tmp/existing.json)
|
||
|
||
# 5. 重新生成序号
|
||
ALL_DATA=$(echo "$ALL_DATA" | jq 'to_entries | map(.value[0] = (.key + 1 | tostring) | .value)')
|
||
|
||
echo "$ALL_DATA" > "$TMP_DATA"
|
||
ROW_COUNT=$(echo "$ALL_DATA" | jq length)
|
||
END_ROW=$((ROW_COUNT + 1))
|
||
|
||
# 6. 清空目标表格并写入合并后的数据
|
||
log "写入合并后的数据,共 $ROW_COUNT 条..."
|
||
# 先清空原有数据
|
||
EMPTY_DATA=$(printf '[]%.0s' {1..200} | jq -s '.')
|
||
LARKSUITE_CLI_CONFIG_DIR=/root/.openclaw/credentials/xiaoyan lark-cli sheets +write \
|
||
--spreadsheet-token "$TARGET_SPREADSHEET_TOKEN" \
|
||
--range "$TARGET_SHEET_ID!A2:O201" \
|
||
--values "$EMPTY_DATA" \
|
||
--as bot >/dev/null 2>&1
|
||
|
||
# 写入新数据
|
||
LARKSUITE_CLI_CONFIG_DIR=/root/.openclaw/credentials/xiaoyan lark-cli sheets +write \
|
||
--spreadsheet-token "$TARGET_SPREADSHEET_TOKEN" \
|
||
--range "$TARGET_SHEET_ID!A2:O$END_ROW" \
|
||
--values "$(cat $TMP_DATA)" \
|
||
--as bot
|
||
|
||
# 7. 更新上次同步ID
|
||
echo "$NEW_MAX_ID" > "$LAST_SYNC_ID_FILE"
|
||
|
||
log "✅ 同步完成:新增 $NEW_COUNT 条微信反馈,当前总记录数 $ROW_COUNT 条,已按时间倒序排列"
|
||
|
||
# 清理临时文件
|
||
rm -f /tmp/wechat_raw.txt /tmp/new.json /tmp/existing.json "$TMP_DATA"
|
||
|
||
log "=== 同步任务完成 ==="
|
||
exit 0
|