{"id":504,"date":"2026-04-18T23:15:19","date_gmt":"2026-04-18T15:15:19","guid":{"rendered":"https:\/\/blog.liu-qi.cn\/index.php\/projects\/"},"modified":"2026-04-19T05:50:39","modified_gmt":"2026-04-18T21:50:39","slug":"projects","status":"publish","type":"page","link":"https:\/\/blog.liu-qi.cn\/index.php\/projects\/","title":{"rendered":"\u9879\u76ee"},"content":{"rendered":"\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Noto+Sans+SC:wght@400;500;700;800&display=swap');\n.lq-shell {\n  --page-bg: #f4f2ec;\n  --surface: rgba(255, 255, 255, 0.76);\n  --line: rgba(24, 28, 31, 0.08);\n  --text: #181b1f;\n  --muted: rgba(24, 27, 31, 0.64);\n  --muted-2: rgba(24, 27, 31, 0.46);\n  --shadow: 0 18px 48px rgba(33, 35, 42, 0.08);\n  color: var(--text);\n  width: min(calc(100vw - 32px), 1200px);\n  max-width: 100%;\n  margin: 0 auto;\n  padding: 18px 0 64px;\n  position: relative;\n  font-family: \"Noto Sans SC\", \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", sans-serif;\n}\nbody.page-template-page-lq-shell .wp-site-blocks,\nbody.page-template-page-lq-shell main.wp-block-group,\nbody.page-template-page-lq-shell .entry-content.wp-block-post-content {\n  margin-top: 0 !important;\n  padding-top: 0 !important;\n  padding-bottom: 0 !important;\n}\nbody.page-template-page-lq-shell .entry-content.wp-block-post-content {\n  padding-left: 0 !important;\n  padding-right: 0 !important;\n}\n.lq-shell * { box-sizing: border-box; min-width: 0; }\n.lq-shell a { color: inherit; text-decoration: none; }\n.lq-surface {\n  border-radius: 52px;\n  background: rgba(255, 255, 255, 0.82);\n  border: 1px solid rgba(255, 255, 255, 0.88);\n  box-shadow: var(--shadow);\n}\n.lq-topbar {\n  position: relative;\n  top: 0;\n  z-index: 30;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 16px;\n  padding: 14px 18px;\n  margin: 0 auto 18px;\n  width: min(100%, 1200px);\n  border-radius: 999px;\n  backdrop-filter: blur(18px) saturate(124%);\n  -webkit-backdrop-filter: blur(18px) saturate(124%);\n  background: rgba(255, 255, 255, 0.72);\n  border: 1px solid rgba(255, 255, 255, 0.88);\n  box-shadow: 0 12px 30px rgba(24, 27, 31, 0.06);\n}\n.lq-brand {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  flex: 0 0 auto;\n}\n.lq-brand-mark {\n  width: 32px;\n  height: 32px;\n  border-radius: 11px;\n  background:\n    radial-gradient(circle at 28% 20%, rgba(255,255,255,0.9), transparent 42%),\n    linear-gradient(160deg, #20252c, #4d5560);\n  box-shadow: inset 0 1px 0 rgba(255,255,255,0.22);\n  position: relative;\n}\n.lq-brand-mark::after {\n  content: \"\";\n  position: absolute;\n  inset: 7px;\n  border: 1.6px solid rgba(255,255,255,0.74);\n  border-radius: 8px;\n}\n.lq-brand-copy strong { display: block; font-size: 15px; line-height: 1.2; }\n.lq-nav {\n  display: flex;\n  align-items: center;\n  gap: 28px;\n  flex-wrap: wrap;\n  justify-content: center;\n  margin: 0 auto;\n}\n.lq-nav-link {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  min-height: 44px;\n  color: var(--muted);\n  font-size: 15px;\n  font-weight: 700;\n  transition: color 180ms ease;\n}\n.lq-nav-link::after {\n  content: \"\";\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 2px;\n  height: 2px;\n  border-radius: 999px;\n  background: transparent;\n  transition: background-color 180ms ease;\n}\n.lq-nav-link:hover,\n.lq-nav-link.is-active { color: var(--text); }\n.lq-nav-link:hover::after,\n.lq-nav-link.is-active::after { background: rgba(24, 27, 31, 0.9); }\n.lq-page-main {\n  display: grid;\n  gap: 22px;\n}\n.fade-up {\n  opacity: 1;\n  transform: none;\n  transition: opacity 260ms ease, transform 260ms ease;\n}\n.fade-up.is-visible {\n  opacity: 1;\n  transform: none;\n}\n.lq-page-header {\n  padding: 28px 32px;\n  background:\n    radial-gradient(circle at 18% 26%, rgba(218, 196, 255, 0.6), transparent 22%),\n    radial-gradient(circle at 82% 34%, rgba(255, 214, 145, 0.56), transparent 20%),\n    radial-gradient(circle at 88% 14%, rgba(197, 222, 255, 0.58), transparent 18%),\n    linear-gradient(180deg, rgba(255,255,255,0.92), rgba(255,255,255,0.78));\n}\n.lq-page-header h1 {\n  margin: 0;\n  font-size: clamp(42px, 5vw, 64px);\n  line-height: 1.02;\n  letter-spacing: -0.08em;\n  font-weight: 800;\n}\n.lq-page-panel {\n  padding: 14px 32px 8px;\n}\n.lq-row-list {\n  display: grid;\n  gap: 0;\n}\n.lq-row {\n  display: grid;\n  grid-template-columns: 120px minmax(0, 1fr);\n  gap: 18px;\n  align-items: start;\n  padding: 22px 0;\n  border-top: 1px solid var(--line);\n}\n.lq-row--single {\n  grid-template-columns: minmax(0, 1fr);\n}\n.lq-row:first-child {\n  border-top: none;\n  padding-top: 6px;\n}\n.lq-row-date {\n  padding-top: 4px;\n  color: var(--muted-2);\n  font-size: 13px;\n  letter-spacing: 0.08em;\n}\n.lq-row-copy strong {\n  display: block;\n  font-size: 19px;\n  line-height: 1.42;\n  letter-spacing: -0.02em;\n}\n.lq-row-copy p {\n  margin: 8px 0 0;\n  color: var(--muted);\n  font-size: 15px;\n  line-height: 1.72;\n}\n.lq-row-meta {\n  display: inline-flex;\n  align-items: center;\n  margin-top: 10px;\n  color: var(--muted-2);\n  font-size: 12px;\n  letter-spacing: 0.08em;\n}\na.lq-row:hover strong,\na.lq-hero-topic:hover strong {\n  text-decoration: underline;\n  text-decoration-thickness: 1.2px;\n  text-underline-offset: 0.16em;\n}\n.lq-about-copy {\n  max-width: 760px;\n  font-size: 18px;\n  line-height: 1.8;\n  color: var(--muted);\n}\n.lq-about-links {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 12px;\n  margin-top: 24px;\n}\n.lq-about-links a,\n.lq-section-header a,\n.lq-button-secondary,\n.lq-text-link {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  min-height: 46px;\n  padding: 0 18px;\n  border-radius: 999px;\n  background: rgba(255,255,255,0.74);\n  border: 1px solid rgba(24, 27, 31, 0.08);\n  color: var(--text) !important;\n  -webkit-text-fill-color: var(--text) !important;\n  font-size: 14px;\n  font-weight: 700;\n  transition: transform 180ms ease, box-shadow 180ms ease, background-color 180ms ease;\n}\n.lq-about-links a:hover,\n.lq-section-header a:hover,\n.lq-button-secondary:hover,\n.lq-text-link:hover,\n.lq-button-primary:hover {\n  transform: translateY(-1px);\n}\n.lq-home {\n  display: grid;\n  gap: 24px;\n}\n.lq-home-hero {\n  position: relative;\n  padding: 30px 32px;\n  overflow: hidden;\n}\n.lq-home-hero::before {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  background:\n    radial-gradient(circle at 14% 72%, rgba(255, 196, 102, 0.86), transparent 24%),\n    radial-gradient(circle at 26% 26%, rgba(235, 151, 232, 0.74), transparent 24%),\n    radial-gradient(circle at 84% 18%, rgba(174, 207, 255, 0.78), transparent 18%),\n    radial-gradient(circle at 78% 76%, rgba(255, 224, 146, 0.72), transparent 20%),\n    linear-gradient(180deg, rgba(255,255,255,0.95), rgba(255,249,244,0.72));\n  filter: blur(26px) saturate(120%);\n  transform: scale(1.08);\n  z-index: -2;\n}\n.lq-home-hero::after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  background: linear-gradient(90deg, rgba(255,255,255,0.18), rgba(255,255,255,0.02));\n  z-index: -1;\n}\n.lq-home-switch {\n  display: inline-flex;\n  align-items: center;\n  gap: 8px;\n  padding: 6px;\n  border-radius: 999px;\n  background: rgba(255,255,255,0.58);\n  border: 1px solid rgba(255,255,255,0.86);\n  box-shadow: 0 10px 24px rgba(24, 27, 31, 0.06);\n  margin-bottom: 26px;\n}\n.lq-home-grid {\n  display: grid;\n  grid-template-columns: minmax(0, 0.92fr) minmax(320px, 1.08fr);\n  gap: clamp(22px, 3vw, 34px);\n  align-items: start;\n}\n.lq-home-stage { display: grid; }\n.lq-home-switch button {\n  appearance: none;\n  border: none;\n  background: transparent;\n  color: var(--muted);\n  font: inherit;\n  font-size: 14px;\n  font-weight: 700;\n  min-height: 40px;\n  padding: 0 18px;\n  border-radius: 999px;\n  cursor: pointer;\n  transition: background-color 180ms ease, color 180ms ease;\n}\n.lq-home-switch button.is-active {\n  background: #181b1f;\n  color: #fff;\n}\n.lq-hero-pane {\n  grid-area: 1 \/ 1;\n  opacity: 0;\n  visibility: hidden;\n  pointer-events: none;\n  transform: translateY(10px);\n  transition: opacity 220ms ease, transform 220ms ease;\n}\n.lq-hero-pane.is-active {\n  opacity: 1;\n  visibility: visible;\n  pointer-events: auto;\n  transform: translateY(0);\n}\n.lq-home-copy {\n  max-width: 580px;\n  padding-top: 6px;\n}\n.lq-chip {\n  display: inline-flex;\n  align-items: center;\n  min-height: 38px;\n  padding: 0 16px;\n  border-radius: 999px;\n  background: rgba(255,255,255,0.56);\n  border: 1px solid rgba(255,255,255,0.86);\n  color: var(--muted);\n  font-size: 14px;\n  font-weight: 700;\n}\n.lq-home-copy h1 {\n  margin: 14px 0 0;\n  max-width: 11ch;\n  font-size: clamp(30px, 3.8vw, 52px);\n  line-height: 1.02;\n  letter-spacing: -0.08em;\n  font-weight: 800;\n}\n.lq-home-copy p {\n  margin: 18px 0 0;\n  max-width: 34em;\n  font-size: 16px;\n  line-height: 1.8;\n  color: var(--muted);\n}\n.lq-hero-actions {\n  display: flex;\n  gap: 12px;\n  flex-wrap: wrap;\n  margin-top: 22px;\n}\n.lq-button-primary,\n.lq-button-secondary {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  min-height: 50px;\n  padding: 0 20px;\n  border-radius: 999px;\n  transition: transform 180ms ease, box-shadow 180ms ease, background-color 180ms ease;\n  font-weight: 700;\n  white-space: nowrap;\n}\n.lq-button-primary {\n  background: #181b1f;\n  color: #fff !important;\n  -webkit-text-fill-color: #fff !important;\n  box-shadow: 0 12px 28px rgba(24, 27, 31, 0.12);\n}\n.lq-home-side {\n  display: grid;\n  align-content: start;\n}\n.lq-hero-card {\n  padding: 20px 22px;\n  min-height: 408px;\n  border-radius: 32px;\n  background: rgba(255,255,255,0.58);\n  border: 1px solid rgba(255,255,255,0.84);\n  backdrop-filter: blur(18px);\n  -webkit-backdrop-filter: blur(18px);\n  box-shadow: 0 14px 34px rgba(24, 27, 31, 0.06);\n}\n.lq-hero-topic {\n  display: grid;\n  grid-template-columns: 38px minmax(0, 1fr);\n  gap: 12px;\n  padding: 16px 0;\n  align-items: start;\n  border-top: 1px solid rgba(24, 27, 31, 0.08);\n}\n.lq-hero-topic:first-of-type {\n  border-top: none;\n  padding-top: 6px;\n}\n.lq-hero-topic em {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: 36px;\n  height: 36px;\n  border-radius: 999px;\n  background: rgba(24, 27, 31, 0.06);\n  color: var(--muted-2);\n  font-size: 12px;\n}\n.lq-hero-topic strong {\n  display: block;\n  font-size: 17px;\n  line-height: 1.46;\n  font-weight: 600;\n}\n.lq-hero-topic p {\n  margin: 5px 0 0;\n  color: var(--muted);\n  font-size: 14px;\n  line-height: 1.66;\n  display: -webkit-box;\n  overflow: hidden;\n  -webkit-line-clamp: 2;\n  -webkit-box-orient: vertical;\n}\n.lq-home-section {\n  padding: 24px 32px 8px;\n}\n.lq-section-header {\n  display: flex;\n  align-items: end;\n  justify-content: space-between;\n  gap: 16px;\n  margin-bottom: 8px;\n}\n.lq-section-header h2 {\n  margin: 0;\n  font-size: 28px;\n  line-height: 1.1;\n  letter-spacing: -0.04em;\n}\n.lq-row-list--compact .lq-row {\n  padding: 20px 0;\n}\n.lq-home-hero,\n.lq-home-section {\n  scroll-margin-top: 108px;\n}\n@media (max-width: 980px) {\n  .lq-topbar {\n    flex-wrap: wrap;\n    justify-content: center;\n  }\n  .lq-home-grid {\n    grid-template-columns: 1fr;\n  }\n  .lq-home-copy h1 {\n    max-width: 12ch;\n  }\n}\n@media (max-width: 720px) {\n  .lq-shell {\n    width: calc(100vw - 20px);\n    max-width: 100%;\n    padding: 12px 0 54px;\n  }\n  .lq-topbar {\n    padding: 12px 14px;\n  }\n  .lq-nav {\n    gap: 18px;\n  }\n  .lq-home-hero,\n  .lq-home-section,\n  .lq-page-header,\n  .lq-page-panel {\n    padding-left: 20px;\n    padding-right: 20px;\n  }\n  .lq-home-copy h1 {\n    font-size: clamp(34px, 12vw, 48px);\n  }\n  .lq-row,\n  .lq-row--single {\n    grid-template-columns: 1fr;\n  }\n  .lq-hero-card,\n  .lq-home-switch {\n    width: 100%;\n  }\n  .lq-hero-topic {\n    grid-template-columns: 1fr;\n  }\n  .lq-hero-topic em {\n    display: none;\n  }\n}\n<\/style>\n<div class=\"lq-shell\">\n  <header class=\"lq-topbar\">\n  <a class=\"lq-brand\" href=\"https:\/\/blog.liu-qi.cn\">\n    <span class=\"lq-brand-mark\" aria-hidden=\"true\"><\/span>\n    <span class=\"lq-brand-copy\">\n      <strong>\u5c0f\u5218Bot<\/strong>\n    <\/span>\n  <\/a>\n  <nav class=\"lq-nav\" aria-label=\"\u4e3b\u5bfc\u822a\">\n    <a class=\"lq-nav-link\" data-section=\"brief\" href=\"https:\/\/blog.liu-qi.cn\/index.php\/brief\/\">\u7b80\u8baf<\/a>\n    <a class=\"lq-nav-link is-active\" data-section=\"projects\" href=\"https:\/\/blog.liu-qi.cn\/index.php\/projects\/\">\u9879\u76ee<\/a>\n    <a class=\"lq-nav-link\" data-section=\"articles\" href=\"https:\/\/blog.liu-qi.cn\/index.php\/articles\/\">\u6587\u7ae0<\/a>\n    <a class=\"lq-nav-link\" data-section=\"about\" href=\"https:\/\/blog.liu-qi.cn\/index.php\/about\/\">\u5173\u4e8e<\/a>\n  <\/nav>\n  \n<\/header>\n  <main class=\"lq-page-main\">\n    <section class=\"lq-surface lq-page-header fade-up\">\n      <h1>\u9879\u76ee<\/h1>\n    <\/section>\n    <section class=\"lq-surface lq-page-panel fade-up\">\n      <div class=\"lq-row-list\"><a class=\"lq-row lq-row--single\" href=\"https:\/\/github.com\/Liu-Bot24\/relay-hub\" target=\"_blank\" rel=\"noopener noreferrer\">\n  \n  <div class=\"lq-row-copy\">\n    <strong>Relay Hub<\/strong>\n    <p>\u628a\u591a\u4e2a\u6d88\u606f\u6e20\u9053\u6c47\u603b\u5230\u4e00\u4e2a\u5165\u53e3\u3002<\/p>\n    <div class=\"lq-row-meta\">GitHub \u2197<\/div>\n  <\/div>\n<\/a> <a class=\"lq-row lq-row--single\" href=\"https:\/\/github.com\/Liu-Bot24\/openclaw-backup-skill\" target=\"_blank\" rel=\"noopener noreferrer\">\n  \n  <div class=\"lq-row-copy\">\n    <strong>OpenClaw Backup Skill<\/strong>\n    <p>OpenClaw \u7684\u672c\u5730\u5907\u4efd\u4e0e\u6062\u590d\u5de5\u5177\u3002<\/p>\n    <div class=\"lq-row-meta\">GitHub \u2197<\/div>\n  <\/div>\n<\/a> <a class=\"lq-row lq-row--single\" href=\"https:\/\/github.com\/Liu-Bot24\/video_analyzer_pro\" target=\"_blank\" rel=\"noopener noreferrer\">\n  \n  <div class=\"lq-row-copy\">\n    <strong>Video Analyzer Pro<\/strong>\n    <p>\u957f\u89c6\u9891\u5ba1\u8ba1\u4e0e\u68c0\u7d22\u5de5\u5177\u3002<\/p>\n    <div class=\"lq-row-meta\">GitHub \u2197<\/div>\n  <\/div>\n<\/a> <a class=\"lq-row lq-row--single\" href=\"https:\/\/github.com\/Liu-Bot24\/page-image-collector\" target=\"_blank\" rel=\"noopener noreferrer\">\n  \n  <div class=\"lq-row-copy\">\n    <strong>Page Image Collector<\/strong>\n    <p>\u6279\u91cf\u91c7\u96c6\u7f51\u9875\u56fe\u7247\u7684 Chrome \u6269\u5c55\u3002<\/p>\n    <div class=\"lq-row-meta\">GitHub \u2197<\/div>\n  <\/div>\n<\/a> <a class=\"lq-row lq-row--single\" href=\"https:\/\/github.com\/Liu-Bot24\/videoframe-searcher\" target=\"_blank\" rel=\"noopener noreferrer\">\n  \n  <div class=\"lq-row-copy\">\n    <strong>VideoFrame Searcher<\/strong>\n    <p>Windows \u89c6\u9891\u62bd\u5e27\u4e0e\u622a\u56fe\u68c0\u7d22\u5de5\u5177\u3002<\/p>\n    <div class=\"lq-row-meta\">GitHub \u2197<\/div>\n  <\/div>\n<\/a> <a class=\"lq-row lq-row--single\" href=\"https:\/\/github.com\/Liu-Bot24\/half-frame-splitter\" target=\"_blank\" rel=\"noopener noreferrer\">\n  \n  <div class=\"lq-row-copy\">\n    <strong>Half Frame Splitter<\/strong>\n    <p>\u81ea\u52a8\u62c6\u5206\u534a\u683c\u80f6\u7247\u626b\u63cf\u56fe\u3002<\/p>\n    <div class=\"lq-row-meta\">GitHub \u2197<\/div>\n  <\/div>\n<\/a> <a class=\"lq-row lq-row--single\" href=\"https:\/\/github.com\/Liu-Bot24\/openclaw-imessage-reader-skill\" target=\"_blank\" rel=\"noopener noreferrer\">\n  \n  <div class=\"lq-row-copy\">\n    <strong>iMessage Reader Skill<\/strong>\n    <p>\u67e5\u8be2 Mac \u4e0a\u7684 iMessage\u3001\u77ed\u4fe1\u548c RCS \u8bb0\u5f55\u3002<\/p>\n    <div class=\"lq-row-meta\">GitHub \u2197<\/div>\n  <\/div>\n<\/a> <a class=\"lq-row lq-row--single\" href=\"https:\/\/github.com\/Liu-Bot24\/fuguang-translator\" target=\"_blank\" rel=\"noopener noreferrer\">\n  \n  <div class=\"lq-row-copy\">\n    <strong>Fuguang Translator<\/strong>\n    <p>\u628a\u7cfb\u7edf\u97f3\u9891\u8f6c\u6210\u4e2d\u6587\u5b57\u5e55\u7684\u684c\u9762\u5de5\u5177\u3002<\/p>\n    <div class=\"lq-row-meta\">GitHub \u2197<\/div>\n  <\/div>\n<\/a><\/div>\n    <\/section>\n  <\/main>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u5c0f\u5218Bot \u7b80\u8baf \u9879\u76ee \u6587\u7ae0 \u5173\u4e8e \u9879\u76ee Relay Hub \u628a\u591a\u4e2a\u6d88\u606f\u6e20\u9053\u6c47\u603b\u5230\u4e00\u4e2a\u5165\u53e3\u3002 GitHub \u2197 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-lq-shell","meta":{"footnotes":""},"class_list":["post-504","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/blog.liu-qi.cn\/index.php\/wp-json\/wp\/v2\/pages\/504","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.liu-qi.cn\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/blog.liu-qi.cn\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/blog.liu-qi.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.liu-qi.cn\/index.php\/wp-json\/wp\/v2\/comments?post=504"}],"version-history":[{"count":31,"href":"https:\/\/blog.liu-qi.cn\/index.php\/wp-json\/wp\/v2\/pages\/504\/revisions"}],"predecessor-version":[{"id":691,"href":"https:\/\/blog.liu-qi.cn\/index.php\/wp-json\/wp\/v2\/pages\/504\/revisions\/691"}],"wp:attachment":[{"href":"https:\/\/blog.liu-qi.cn\/index.php\/wp-json\/wp\/v2\/media?parent=504"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}