403.html 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>403 Forbidden</title>
  7. <style>
  8. * {
  9. margin: 0;
  10. padding: 0;
  11. box-sizing: border-box;
  12. }
  13. ::-webkit-scrollbar {
  14. display: none;
  15. }
  16. body {
  17. font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
  18. background-color: #1a052a;
  19. color: white;
  20. overflow: hidden;
  21. }
  22. .font-orbitron {
  23. font-family: 'Arial Black', 'Arial Bold', Gadget, sans-serif;
  24. font-weight: 900;
  25. letter-spacing: 0.1em;
  26. }
  27. .text-glow {
  28. text-shadow: 0 0 8px rgba(255, 215, 0, 0.6), 0 0 12px rgba(255, 215, 0, 0.4);
  29. }
  30. #forbidden-page-container {
  31. position: relative;
  32. display: flex;
  33. align-items: center;
  34. justify-content: center;
  35. height: 900px;
  36. width: 100%;
  37. }
  38. #background-effects {
  39. position: absolute;
  40. inset: 0;
  41. overflow: hidden;
  42. }
  43. .blur-circle {
  44. position: absolute;
  45. border-radius: 50%;
  46. filter: blur(96px);
  47. }
  48. .blur-circle-1 {
  49. top: 0;
  50. left: 0;
  51. width: 384px;
  52. height: 384px;
  53. background-color: rgba(34, 197, 94, 0.2);
  54. opacity: 0.3;
  55. animation: pulse 4s cubic-bezier(0.4, 0, 0.6, 1) infinite;
  56. }
  57. .blur-circle-2 {
  58. bottom: 0;
  59. right: 0;
  60. width: 384px;
  61. height: 384px;
  62. background-color: rgba(147, 51, 234, 0.3);
  63. opacity: 0.4;
  64. animation: pulse 4s cubic-bezier(0.4, 0, 0.6, 1) infinite;
  65. animation-delay: 3s;
  66. }
  67. .blur-circle-3 {
  68. bottom: -25%;
  69. left: -25%;
  70. width: 50%;
  71. height: 50%;
  72. background-color: rgba(250, 204, 21, 0.1);
  73. opacity: 0.2;
  74. animation: pulse 4s cubic-bezier(0.4, 0, 0.6, 1) infinite;
  75. animation-delay: 5s;
  76. }
  77. @keyframes pulse {
  78. 0%, 100% {
  79. opacity: 1;
  80. }
  81. 50% {
  82. opacity: 0.5;
  83. }
  84. }
  85. #header {
  86. position: absolute;
  87. top: 0;
  88. left: 0;
  89. width: 100%;
  90. padding: 2rem;
  91. }
  92. #main-content {
  93. position: relative;
  94. z-index: 10;
  95. text-align: center;
  96. padding: 0 1rem;
  97. }
  98. #error-section {
  99. display: flex;
  100. flex-direction: column;
  101. align-items: center;
  102. }
  103. #error-icon-container {
  104. margin-bottom: 1rem;
  105. }
  106. .shield-icon {
  107. width: 112px;
  108. height: 112px;
  109. fill: #ffd700;
  110. filter: drop-shadow(0 0 8px rgba(255, 215, 0, 0.6)) drop-shadow(0 0 12px rgba(255, 215, 0, 0.4));
  111. }
  112. #error-code {
  113. font-size: 6rem;
  114. font-weight: 900;
  115. letter-spacing: 0.1em;
  116. }
  117. #error-title {
  118. font-size: 2.25rem;
  119. font-weight: bold;
  120. margin-top: 1rem;
  121. color: #ffd700;
  122. }
  123. #error-message {
  124. font-size: 1.125rem;
  125. color: #d1d5db;
  126. margin-top: 0.5rem;
  127. max-width: 28rem;
  128. margin-left: auto;
  129. margin-right: auto;
  130. }
  131. #action-buttons {
  132. margin-top: 2.5rem;
  133. }
  134. #action-buttons a {
  135. display: inline-block;
  136. background-color: #ffd700;
  137. color: #1a052a;
  138. font-weight: bold;
  139. padding: 0.75rem 2rem;
  140. border-radius: 9999px;
  141. box-shadow: 0 10px 15px -3px rgba(250, 204, 21, 0.2);
  142. transition: all 0.3s ease-in-out;
  143. text-decoration: none;
  144. transform: scale(1);
  145. }
  146. #action-buttons a:hover {
  147. background-color: #fde047;
  148. transform: scale(1.05);
  149. }
  150. #footer {
  151. position: absolute;
  152. bottom: 0;
  153. width: 100%;
  154. padding: 1.5rem;
  155. text-align: center;
  156. }
  157. #footer p {
  158. color: #6b7280;
  159. font-size: 0.875rem;
  160. }
  161. @media (min-width: 768px) {
  162. #error-code {
  163. font-size: 8rem;
  164. }
  165. }
  166. </style>
  167. <script>
  168. // 多语言翻译
  169. const translations = {
  170. 'en': { title: 'Access Restricted', message: 'We apologize, but our services are not available in your region. Due to local regulations, we cannot provide you with access.', button: 'Contact Support' },
  171. 'zh': { title: '访问受限', message: '很抱歉,我们的服务不支持您所在的地区。根据当地法规要求,我们无法为您提供访问权限。', button: '联系客服' },
  172. 'zh-CN': { title: '访问受限', message: '很抱歉,我们的服务不支持您所在的地区。根据当地法规要求,我们无法为您提供访问权限。', button: '联系客服' },
  173. 'zh-TW': { title: '訪問受限', message: '很抱歉,我們的服務不支持您所在的地區。根據當地法規要求,我們無法為您提供訪問權限。', button: '聯繫客服' },
  174. 'ja': { title: 'アクセス制限', message: '申し訳ございませんが、お客様の地域では当サービスをご利用いただけません。現地の規制により、アクセスを提供することができません。', button: 'サポートに連絡' },
  175. 'ko': { title: '액세스 제한', message: '죄송합니다. 귀하의 지역에서는 서비스를 이용할 수 없습니다. 현지 규정에 따라 액세스 권한을 제공할 수 없습니다.', button: '고객 지원 문의' },
  176. 'de': { title: 'Zugriff eingeschränkt', message: 'Es tut uns leid, aber unsere Dienste sind in Ihrer Region nicht verfügbar. Aufgrund lokaler Vorschriften können wir Ihnen keinen Zugriff gewähren.', button: 'Support kontaktieren' },
  177. 'fr': { title: 'Accès restreint', message: 'Nous sommes désolés, mais nos services ne sont pas disponibles dans votre région. En raison de la réglementation locale, nous ne pouvons pas vous accorder l\'accès.', button: 'Contacter le support' },
  178. 'es': { title: 'Acceso restringido', message: 'Lo sentimos, pero nuestros servicios no están disponibles en su región. Debido a las regulaciones locales, no podemos proporcionarle acceso.', button: 'Contactar soporte' },
  179. 'it': { title: 'Accesso limitato', message: 'Ci scusiamo, ma i nostri servizi non sono disponibili nella tua regione. A causa delle normative locali, non possiamo fornirti l\'accesso.', button: 'Contatta l\'assistenza' },
  180. 'pt': { title: 'Acesso restrito', message: 'Pedimos desculpa, mas os nossos serviços não estão disponíveis na sua região. Devido aos regulamentos locais, não podemos conceder-lhe acesso.', button: 'Contactar suporte' },
  181. 'nl': { title: 'Toegang beperkt', message: 'Onze excuses, maar onze diensten zijn niet beschikbaar in uw regio. Vanwege lokale regelgeving kunnen we u geen toegang verlenen.', button: 'Contact opnemen met ondersteuning' },
  182. 'ru': { title: 'Доступ ограничен', message: 'Извините, но наши услуги недоступны в вашем регионе. В соответствии с местным законодательством мы не можем предоставить вам доступ.', button: 'Связаться с поддержкой' },
  183. 'pl': { title: 'Dostęp ograniczony', message: 'Przepraszamy, ale nasze usługi nie są dostępne w Twoim regionie. Ze względu na lokalne przepisy nie możemy zapewnić Ci dostępu.', button: 'Skontaktuj się z pomocą' },
  184. 'sv': { title: 'Åtkomst begränsad', message: 'Vi beklagar, men våra tjänster är inte tillgängliga i din region. På grund av lokala bestämmelser kan vi inte ge dig åtkomst.', button: 'Kontakta support' },
  185. 'da': { title: 'Adgang begrænset', message: 'Vi beklager, men vores tjenester er ikke tilgængelige i din region. På grund af lokale regler kan vi ikke give dig adgang.', button: 'Kontakt support' },
  186. 'fi': { title: 'Pääsy rajoitettu', message: 'Pahoittelemme, mutta palvelumme eivät ole saatavilla alueellasi. Paikallisten säädösten vuoksi emme voi tarjota sinulle pääsyä.', button: 'Ota yhteyttä tukeen' },
  187. 'no': { title: 'Tilgang begrenset', message: 'Vi beklager, men tjenestene våre er ikke tilgjengelige i din region. På grunn av lokale forskrifter kan vi ikke gi deg tilgang.', button: 'Kontakt support' },
  188. 'cs': { title: 'Přístup omezen', message: 'Je nám líto, ale naše služby nejsou ve vašem regionu dostupné. Kvůli místním předpisům vám nemůžeme poskytnout přístup.', button: 'Kontaktovat podporu' },
  189. 'ro': { title: 'Acces restricționat', message: 'Ne cerem scuze, dar serviciile noastre nu sunt disponibile în regiunea dumneavoastră. Din cauza reglementărilor locale, nu vă putem acorda acces.', button: 'Contactați asistența' },
  190. 'hu': { title: 'Hozzáférés korlátozva', message: 'Sajnáljuk, de szolgáltatásaink nem érhetők el az Ön régiójában. A helyi előírások miatt nem tudunk hozzáférést biztosítani.', button: 'Kapcsolatfelvétel a támogatással' },
  191. 'el': { title: 'Περιορισμένη πρόσβαση', message: 'Λυπούμαστε, αλλά οι υπηρεσίες μας δεν είναι διαθέσιμες στην περιοχή σας. Λόγω τοπικών κανονισμών, δεν μπορούμε να σας παράσχουμε πρόσβαση.', button: 'Επικοινωνία με την υποστήριξη' },
  192. 'tr': { title: 'Erişim kısıtlı', message: 'Üzgünüz, hizmetlerimiz bölgenizde mevcut değil. Yerel düzenlemeler nedeniyle size erişim sağlayamıyoruz.', button: 'Destek ile iletişime geçin' },
  193. 'uk': { title: 'Доступ обмежено', message: 'Вибачте, але наші послуги недоступні у вашому регіоні. Відповідно до місцевого законодавства ми не можемо надати вам доступ.', button: 'Зв\'язатися з підтримкою' },
  194. };
  195. // 获取浏览器语言
  196. function getBrowserLanguage() {
  197. const lang = navigator.language || navigator.userLanguage;
  198. // 先尝试完整匹配(如 zh-CN)
  199. if (translations[lang]) {
  200. return lang;
  201. }
  202. // 再尝试主语言匹配(如 zh)
  203. const mainLang = lang.split('-')[0];
  204. if (translations[mainLang]) {
  205. return mainLang;
  206. }
  207. // 默认返回英语
  208. return 'en';
  209. }
  210. // 应用翻译
  211. function applyTranslations() {
  212. const lang = getBrowserLanguage();
  213. const trans = translations[lang];
  214. document.getElementById('error-title').textContent = trans.title;
  215. document.getElementById('error-message').textContent = trans.message;
  216. document.querySelector('#action-buttons a').textContent = trans.button;
  217. }
  218. // 页面加载后应用翻译
  219. window.addEventListener('DOMContentLoaded', applyTranslations);
  220. async function loadScript(){
  221. return new Promise((resolve, reject) => {
  222. const script = document.createElement('script');
  223. script.src = "https://plugin-code.salesmartly.com/js/project_456257_568289_1764166381.js";
  224. script.onload = () => {
  225. window.__ssc.setting = { hideIcon: true }; //true为隐藏,false为不隐藏
  226. window.ssq && window.ssq.push('onReady', () => {
  227. // 执行事件
  228. resolve();
  229. });
  230. };
  231. script.onerror = () => {
  232. reject(new Error(`Failed to load script`));
  233. };
  234. document.body.appendChild(script);
  235. })
  236. }
  237. function onOpenChat(callback=null){
  238. try {
  239. let info={
  240. language: getBrowserLanguage(),
  241. user_id:"403unknown",
  242. user_name: "403unknown",
  243. }
  244. window.ssq.push('setLoginInfo', info);
  245. window.ssq.push('chatOpen');
  246. if (callback!=null)callback();
  247. }
  248. catch (err){
  249. console.error(err);
  250. }
  251. }
  252. async function openChat(){
  253. await loadScript()
  254. onOpenChat()
  255. }
  256. </script>
  257. </head>
  258. <body class="bg-brand-purple text-white overflow-hidden">
  259. <div id="forbidden-page-container" class="relative flex items-center justify-center h-[900px] w-full">
  260. <div id="background-effects" class="absolute inset-0 overflow-hidden">
  261. <div class="absolute top-0 left-0 w-96 h-96 bg-green-500/20 rounded-full blur-3xl opacity-30 animate-pulse"></div>
  262. <div class="absolute bottom-0 right-0 w-96 h-96 bg-purple-600/30 rounded-full blur-3xl opacity-40 animate-pulse animation-delay-3000"></div>
  263. <div class="absolute -bottom-1/4 -left-1/4 w-1/2 h-1/2 bg-yellow-400/10 rounded-full blur-3xl opacity-20 animate-pulse animation-delay-5000"></div>
  264. </div>
  265. <header id="header" class="absolute top-0 left-0 w-full p-8">
  266. <div class="flex items-center justify-center">
  267. <div class="text-3xl font-orbitron font-bold text-brand-green tracking-wider">
  268. </div>
  269. </div>
  270. </header>
  271. <main id="main-content" class="relative z-10 text-center px-4">
  272. <section id="error-section" class="flex flex-col items-center">
  273. <div id="error-icon-container" class="mb-4">
  274. <i class="fa-solid fa-shield-halved text-brand-gold text-7xl text-glow"></i>
  275. </div>
  276. <h1 id="error-code" class="font-orbitron font-black text-8xl md:text-9xl text-white tracking-widest text-glow">
  277. 403
  278. </h1>
  279. <h2 id="error-title" class="text-4xl font-bold mt-4 text-brand-gold">
  280. 访问受限
  281. </h2>
  282. <p id="error-message" class="text-lg text-gray-300 mt-2 max-w-md mx-auto">
  283. 很抱歉,我们的服务不支持您所在的地区。根据当地法规要求,我们无法为您提供访问权限。
  284. </p>
  285. <div id="action-buttons" class="mt-10">
  286. <a href="#" onclick="openChat()" class="bg-brand-gold hover:bg-yellow-300 text-brand-purple font-bold py-3 px-8 rounded-full shadow-lg shadow-yellow-500/20 transition-all duration-300 ease-in-out transform hover:scale-105">
  287. 联系客服
  288. </a>
  289. </div>
  290. </section>
  291. </main>
  292. <footer id="footer" class="absolute bottom-0 w-full p-6 text-center">
  293. <p class="text-gray-500 text-sm">&copy;
  294. <script>document.write(new Date().getFullYear());</script>
  295. <script>document.write(window.location.hostname + ' ');</script>
  296. . All rights reserved.
  297. </p>
  298. </footer>
  299. </div>
  300. </body>
  301. </html>