AIGC春联

A AIGC couplet

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @license      MIT
// @name         AIGC春联
// @namespace    http://tampermonkey.net/
// @version      2024-01-27
// @description  A AIGC couplet
// @author       Sincenir
// @match        *://*/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=undefined.
// @grant        GM_addStyle
// @require      https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js
// ==/UserScript==
(function () {
  "use strict";

  GM_addStyle(`@keyframes horizontal-expand {
        0% {
          transform: scaleX(0) translateX(-50%);
        }
        100% {
          transform: scaleX(1) translateX(-50%);
        }
      }
      @keyframes vertical-expand {
        0% {
          transform: scaleY(0) translateY(-50%);
        }
        100% {
          transform: scaleY(1) translateY(-50%);
        }
      }

      @keyframes spin {
        from {
          transform: rotate(0deg);
        }
        to {
          transform: rotate(360deg);
        }
      }
      @keyframes hide {
        0% {
          opacity: 1;
        }
        30% {
          opacity: 0;
        }
        100% {
          opacity: 0;
        }
      }

      .couplet-container {
        position: fixed;
        top: 0;
        left: 0;
        width: 100vw;
        height: 100vh;
        pointer-events: none;
        font-family: "楷体", "宋体", "Microsoft YaHei", sans-serif;
        font-size: 32px;
        font-weight: 700;
        color: #fec401;
        z-index: 1000000000;
      }
      .top {
        position: absolute;
        top: 5%;
        left: 50%;
        transform: translateX(-50%);
        transform-origin: left;
        width: 200px;
        height: auto;
        padding: 16px 24px;
        background-color: #ca3a2a;
        text-align: center;
        overflow: hidden;
        white-space: nowrap;
        animation: horizontal-expand 1s ease-in-out;
        box-shadow: 0 0 0 6px #ff664d;
        border-radius: 8px;
      }
      .top::before {
        content: "";
        position: absolute;
        top: 10px;
        left: 16px;
        right: 16px;
        bottom: 10px;
        border: 4px solid #f3dab8;
        border-radius: 8px;
      }
      .couplet-all {
        position: absolute;
        top: 50%;
        transform: translateY(-50%);
        width: auto;
        height: auto;
        padding: 32px 24px;
        background-color: #ca3a2a;
        writing-mode: vertical-rl;
        text-align: center;
        overflow: hidden;
        white-space: nowrap;
        animation: vertical-expand 1s ease-in-out;
        box-shadow: 0 0 0 6px #ff664d;
        border-radius: 8px;
      }

      .couplet-all::before {
        content: "";
        position: absolute;
        top: 16px;
        left: 10px;
        right: 10px;
        bottom: 16px;
        border: 4px solid #f3dab8;
        border-radius: 8px;
      }

      .couplet-up {
        transform-origin: top;
        right: 5%;
      }
      .couplet-down {
        transform-origin: top;
        left: 5%;
      }
      .couplet-fu {
        width: 100%;
        height: 100%;
        display: flex;
        justify-content: center;
        align-items: center;
        animation: spin 1s ease;
      }

      .hide {
        animation: hide 3s ease-in-out;
      }`);

  const showTime = 10000;
  const coupletList = [
    {
      up: "龙飞凤舞春盈四海",
      down: "岁稔年丰福满九州",
      top: "四海同春",
    },
    {
      up: "龙骧盛世财源广进",
      down: "岁稔新春福运亨通",
      top: "盛世财源",
    },
    {
      up: "龙舞云天开新运财如泉涌",
      down: "春回大地展宏图福满人间",
      top: "龙运亨通",
    },
    {
      up: "龙年百福临喜气祥和户户",
      down: "春风万里送欢歌笑语声声",
      top: "迎春接福",
    },
    {
      up: "龙腾盛世展宏图业兴财旺",
      down: "春满神州添锦绣福寿安康",
      top: "大展鸿图",
    },
    {
      up: "龙年百福临喜气祥和户户",
      down: "春风万里送欢歌笑语声声",
      top: "迎春接福",
    },
    {
      up: "龙征万里",
      down: "福满乾坤",
      top: "万里乾坤福",
    },
  ];

  function createCoupletContainer() {
    const container = document.createElement("div");
    container.className = "couplet-container";
    return container;
  }

  function createTop(str) {
    const topEl = document.createElement("div");
    topEl.innerHTML = str;
    topEl.className = "top";
    return topEl;
  }

  function createUp(str) {
    const upEl = document.createElement("div");
    upEl.className = "couplet-all couplet-up";

    upEl.innerHTML = str;
    return upEl;
  }

  function createDown(str) {
    const down = document.createElement("div");
    down.className = "couplet-all couplet-down";

    down.innerHTML = str;
    return down;
  }

  function createFu() {
    const fu = document.createElement("div");
    fu.className = "couplet-fu";
    fu.innerHTML =
      '<svg t="1706247528897" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2446" width="200" height="200"><path d="M457.665918 982.912037L41.187933 566.334082c-29.891243-29.891243-29.891243-78.776921 0-108.468222L457.665918 41.387875c29.891243-29.891243 78.67695-29.891243 108.468222 0L982.712096 457.86586c29.891243 29.891243 29.891243 78.776921 0 108.468222L566.334082 983.012008c-29.891243 29.791272-78.776921 29.791272-108.668164-0.099971z m0 0" fill="#CA3A2A" p-id="2447"></path><path d="M512.049985 1024c-24.392854 0-48.885678-9.297276-67.48023-27.891829L28.09177 579.630186c-37.189105-37.189105-37.189105-97.671385 0-134.86049L444.569755 28.09177c37.189105-37.189105 97.671385-37.189105 134.86049 0l416.477985 416.477985c37.189105 37.189105 37.189105 97.671385 0 134.86049L579.430245 996.108171c-18.594552 18.594552-42.987406 27.891829-67.38026 27.891829z m0-986.510983c-14.895636 0-29.791272 5.698331-41.187933 16.995021L54.384067 470.962023c-22.693352 22.693352-22.693352 59.582544 0 82.175925L470.862052 969.715904c22.693352 22.693352 59.582544 22.693352 82.175925 0l416.477985-416.477985c22.693352-22.693352 22.693352-59.582544 0-82.175925L553.037977 54.484038c-11.29669-11.396661-26.192326-16.995021-40.987992-16.995021z m0 0" fill="#CA3A2A" p-id="2448"></path><path d="M864.346773 475.060822L549.039149 159.653227c-9.79713-9.8971-22.993264-15.295519-36.989164-15.295519s-27.092063 5.398418-36.989163 15.295519L159.553256 475.060822c-20.394025 20.394025-20.394025 53.684272 0 74.178268L475.060822 864.746656c10.097042 10.197013 23.693059 15.295519 36.989163 15.295519 13.396075 0 26.892121-5.098506 36.989164-15.295519l315.307624-315.707507c9.8971-9.79713 15.295519-22.993264 15.295519-36.989164s-5.398418-27.192034-15.295519-36.989163z m-12.996192 45.486674l-330.903056 330.903056c-4.398711 4.598653-12.096456 4.598653-16.695109 0l-331.003026-330.903056c-4.598653-4.498682-4.598653-12.096456 0-16.695109l331.003026-331.003026c2.999121-2.999121 6.498096-3.399004 8.39754-3.399005 1.899444 0 5.398418 0.399883 8.39754 3.399005l330.903056 331.003026c2.999121 2.999121 3.399004 6.498096 3.399004 8.39754-0.199941 1.799473-0.599824 5.298448-3.498975 8.297569z m0 0" fill="#F3DAB8" p-id="2449"></path><path d="M668.60412 596.425266H562.835107c-7.297862 0-13.9959-4.298741-16.995021-10.896808-2.999121-6.598067-1.899444-14.395782 2.899151-19.894171L670.203651 425.875232c6.798008-7.797716 18.494582-8.597481 26.292297-1.799473 7.797716 6.698038 8.597481 18.494582 1.899444 26.292297l-94.672264 108.968076h64.980963c10.197013 0 18.594552 8.39754 18.594552 18.594552 0.099971 10.197013-8.297569 18.494582-18.694523 18.494582z m-33.190276 51.584887l-28.09177-33.990042" fill="#FEC401" p-id="2450"></path><path d="M635.413844 666.604706c-5.298448 0-10.696866-2.299326-14.295812-6.698038l-27.991799-33.890071c-6.498096-7.897686-5.498389-19.69423 2.399297-26.192327s19.69423-5.498389 26.192326 2.399297l27.991799 33.890072c6.498096 7.897686 5.498389 19.69423-2.399297 26.192326-3.598946 2.899151-7.697745 4.298741-11.896514 4.298741z m-22.793323-135.060432c-10.197013 0-18.594552-8.39754-18.594552-18.594552V376.189788c0-10.197013 8.39754-18.594552 18.594552-18.594552 10.197013 0 18.594552 8.39754 18.594553 18.594552v136.759934c0 10.197013-8.39754 18.594552-18.594553 18.594552z m0 0" fill="#FEC401" p-id="2451"></path><path d="M582.829249 504.052328c-4.998536 0-9.997071-1.999414-13.695987-6.098213l-32.690423-35.589573c-6.99795-7.597774-6.398126-19.294347 1.199649-26.292298 7.597774-6.99795 19.294347-6.398126 26.292297 1.199649l32.690422 35.589573c6.99795 7.597774 6.398126 19.294347-1.199648 26.292298-3.598946 3.199063-8.197598 4.898565-12.59631 4.898564z m-94.772234 162.552378H351.896905c-10.197013 0-18.594552-8.39754-18.594552-18.594553 0-10.197013 8.39754-18.594552 18.594552-18.594552h136.16011c10.197013 0 18.594552 8.39754 18.594552 18.594552 0 10.197013-8.297569 18.594552-18.594552 18.594553z m-19.294348-48.485796h-97.571414c-12.196427 0-22.093527-9.8971-22.093528-22.093527V549.838914c0-12.196427 9.8971-22.093527 22.093528-22.093527h97.571414c12.196427 0 22.093527 9.8971 22.093527 22.093527v46.186469c0.099971 12.196427-9.8971 22.093527-22.093527 22.093527zM386.28683 580.829835h67.48023v-15.895343h-67.48023V580.829835z m84.175339-75.577858h-100.970419c-26.69218 0-48.485795-21.693644-48.485795-48.485795v-49.18559c0-26.69218 21.793615-48.485795 48.485795-48.485796h100.970419c26.69218 0 48.485795 21.793615 48.485795 48.485796V456.866152c0 26.69218-21.693644 48.385824-48.485795 48.385825zM369.591721 396.383872c-6.198184 0-11.29669 5.098506-11.29669 11.29669V456.866152c0 6.198184 5.098506 11.29669 11.29669 11.296691h100.970419c6.198184 0 11.29669-5.098506 11.29669-11.296691v-49.18559c0-6.198184-5.098506-11.29669-11.29669-11.29669h-100.970419z m0 0" fill="#FEC401" p-id="2452"></path><path d="M482.858538 450.767939H356.695499c-10.197013 0-18.594552-8.39754-18.594552-18.594552 0-10.197013 8.39754-18.594552 18.594552-18.594553H482.858538c10.197013 0 18.594552 8.39754 18.594552 18.594553 0 10.197013-8.39754 18.594552-18.594552 18.594552z m0 0" fill="#FEC401" p-id="2453"></path><path d="M419.677048 496.354584c-10.197013 0-18.594552-8.39754-18.594553-18.594553v-92.972762c0-10.197013 8.39754-18.594552 18.594553-18.594552 10.197013 0 18.594552 8.39754 18.594552 18.594552v92.972762c0 10.197013-8.197598 18.594552-18.594552 18.594553z m0 0" fill="#FEC401" p-id="2454"></path><path d="M512.049985 1024c-24.392854 0-48.885678-9.297276-67.48023-27.891829L28.09177 579.630186c-37.189105-37.189105-37.189105-97.671385 0-134.86049L444.569755 28.09177c37.189105-37.189105 97.671385-37.189105 134.86049 0l416.477985 416.477985c37.189105 37.189105 37.189105 97.671385 0 134.86049L579.430245 996.108171c-18.594552 18.594552-42.987406 27.891829-67.38026 27.891829z m0-986.510983c-14.895636 0-29.791272 5.698331-41.187933 16.995021L54.384067 470.962023c-22.693352 22.693352-22.693352 59.582544 0 82.175925L470.862052 969.715904c22.693352 22.693352 59.582544 22.693352 82.175925 0l416.477985-416.477985c22.693352-22.693352 22.693352-59.582544 0-82.175925L553.037977 54.484038c-11.29669-11.396661-26.192326-16.995021-40.987992-16.995021z m0 0" fill="#FF664D" p-id="2455"></path></svg>';
    return fu;
  }

  const coupletContainer = createCoupletContainer();

  function getRandomInt(min, max) {
    min = Math.ceil(min);
    max = Math.floor(max);
    return Math.floor(Math.random() * (max - min + 1)) + min;
  }

  const c = coupletList[getRandomInt(0, coupletList.length - 1)];
  const top = createTop(c.top);
  const up = createUp(c.up);
  const down = createDown(c.down);
  const fu = createFu();
  coupletContainer.append(top);
  coupletContainer.append(up);
  coupletContainer.append(down);
  coupletContainer.append(fu);
  document.body.append(coupletContainer);

  setTimeout(() => {
    document.querySelector(".couplet-container").className =
      "couplet-container hide";
    setTimeout(() => {
      document.querySelector(".couplet-container").remove();
    }, 1000);
  }, showTime);

  document.addEventListener("keydown", (e) => {
    if (e.key !== "Escape") return;
    document.querySelector(".couplet-container").className =
      "couplet-container hide";
    setTimeout(() => {
      document.querySelector(".couplet-container").remove();
    }, 1000);
  });
})();