PageSourceSearch

https://web-admin-next-ten.vercel.app/_next/static/chunks/pages/promo-c3530e3c1294a986.js

js web-admin-next-ten.vercel.app collected 2026-10-03 08:01:36 UTC 12,505 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2],{7087:function(e,r,o){(window.__NEXT_P=window.__NEXT_P||[]).push(["/promo",function(){return o(9027)}])},9027:function(e,r,o){"use strict";o.r(r),o.d(r,{default:function(){return i}});var t=o(5893),s=o(7294),l=o(1163);function i(){let{db:e}=(0,l.useRouter)().query,[r,o]=(0,s.useState)(""),[i,n]=(0,s.useState)(5),[a,d]=(0,s.useState)(["","","","",""]),[c,p]=(0,s.useState)(!1),[x,u]=(0,s.useState)(null),[f,g]=(0,s.useState)({rewardItemName:"보상 아이템",rewardCount:0,allowedDomains:""}),[b,h]=(0,s.useState)([]),[m,y]=(0,s.useState)([]),[j,S]=(0,s.useState)(!1);(0,s.useEffect)(()=>{e&&(async()=>{try{let r=await fetch("/api/proxy/".concat(e,"/promo/config")),o=await r.json();if(r.ok&&o.success){let e=Number(o.link_count)||5;n(e),d(Array(e).fill("")),g({rewardItemName:o.reward_item_name||"보상 아이템",rewardCount:o.reward_count||0,allowedDomains:o.promo_allowed_domains||""})}}catch(e){console.error("공개 홍보 설정 조회 실패:",e)}})()},[e]);let k=(e,r)=>{let o=[...a];o[e]=r,d(o)},C=async e=>{try{if(!navigator.clipboard||!navigator.clipboard.readText){alert("이 브라우저 혹은 환경(비HTTPS)에서는 클립보드 텍스트 붙여넣기가 직접 지원되지 않습니다. 주소창을 꾹 눌러 붙여넣어 주세요.");return}let r=await navigator.clipboard.readText();if(r&&r.trim()){let o=r.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);if(o.length>1){let r=[...a];for(let t=0;t<o.length;t++){let s=e+t;s<r.length&&(r[s]=o[t])}d(r)}else k(e,r.trim())}else alert("클립보드가 비어 있거나 읽을 수 있는 주소가 없습니다.")}catch(e){console.error("클립보드 텍스트 읽기 실패:",e),alert("클립보드 읽기 권한을 허용해 주시거나 주소를 직접 꾹 눌러 붙여넣어 주세요.")}},w=async o=>{if(o.preventDefault(),!e){alert("올바르지 않은 접근입니다. 서버 정보(db)가 누락되었습니다.");return}if(!r.trim()){alert("캐릭터 이름을 입력해 주세요.");return}let t=a.filter(e=>e.trim());if(t.length>0&&t.every(e=>{let r=e.toLowerCase();return r.includes("youtube.com")||r.includes("youtu.be")||r.includes("tiktok.com")})){if(t.length<2){alert("동영상 홍보(유튜브/틱톡)는 최소 2개 이상의 동영상 링크를 입력해 주세요.");return}}else{let e=a.findIndex(e=>!e.trim());if(-1!==e){alert("".concat(e+1,"번째 홍보 링크가 비어 있습니다. ").concat(i,"개 링크를 모두 채워주세요."));return}}p(!0),u(null),S(!1);try{let o=await fetch("/api/proxy/".concat(e,"/promo/verify"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({charName:r.trim(),links:a.map(e=>e.trim())})}),t=await o.json();if(o.ok&&t.success)u({success:!0,message:t.message,results:t.results||null}),d(Array(i).fill(""));else if(u({success:!1,message:t.error||"인증에 실패했습니다. 올린 글의 키워드 및 중복 링크 여부를 확인해 주세요.",results:t.results||null}),t.results&&t.results.length>0){let e=t.results.filter(e=>!e.success).map(e=>e.link),r=t.results.filter(e=>e.success).map(e=>e.link);h(e),y(r),S(!0)}}catch(e){u({success:!1,message:"서버 연결에 실패했습니다. 잠시 후 다시 시도해 주세요."})}finally{p(!1)}},D=async o=>{o.preventDefault(),p(!0),u(null);try{let o=await fetch("/api/proxy/".concat(e,"/promo/bypass-submit"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({charName:r.trim(),links:m,failedLinks:b})}),t=await o.json();o.ok&&t.success?(u({success:!0,message:t.message}),d(Array(i).fill("")),S(!1)):u({success:!1,message:t.error||"수동 검증 요청 및 보상 지급 처리에 실패했습니다. 다시 시도해 주세요."})}catch(e){u({success:!1,message:"서버 연결에 실패했습니다. 잠시 후 다시 시도해 주세요."})}finally{p(!1)}};return(0,t.jsxs)("div",{style:{minHeight:"100vh",backgroundColor:"#0d1117",color:"#c9d1d9",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",padding:"20px",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},children:[(0,t.jsxs)("div",{style:{width:"100%",maxWidth:"560px",backgroundColor:"#161b22",border:"1px solid #30363d",borderRadius:"8px",padding:"30px 24px",boxShadow:"0 8px 24px rgba(0,0,0,0.3)"},children:[(0,t.jsxs)("div",{style:{textAlign:"center",marginBottom:"24px"},children:[(0,t.jsx)("span",{style:{fontSize:"40px"},children:"\uD83D\uDCE2"}),(0,t.jsx)("h2",{style:{fontSize:"22px",fontWeight:"bold",color:"#58a6ff",margin:"10px 0 6px 0"},children:e?"[".concat(e,"] 서버 홍보 자동 인증"):"홍보 자동 인증 시스템"}),(0,t.jsxs)("p",{style:{fontSize:"13px",color:"#8b949e",margin:0},children:["작성하신 홍보 게시글 링크 ",i,"개를 제출하면 실시간 검증을 거쳐 ",(0,t.jsx)("br",{}),"개인 창고(Warehouse)로 보상",f.rewardCount>0?" [".concat(f.rewardItemName,"] ").concat(f.rewardCount.toLocaleStr
1ing(),"개"):"이"," 자동 지급됩니다."]})]}),e?(0,t.jsxs)("form",{onSubmit:w,style:{display:"flex",flexDirection:"column",gap:"16px"},children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{style:{display:"block",fontSize:"13px",fontWeight:"bold",marginBottom:"6px",color:"#ff7b72"},children:"\uD83D\uDC64 보상을 받을 캐릭터 이름 *"}),(0,t.jsx)("input",{type:"text",value:r,onChange:e=>o(e.target.value),placeholder:"인게임 캐릭터명을 정확히 입력하세요",required:!0,disabled:c,style:{width:"100%",backgroundColor:"#0d1117",border:"1px solid #30363d",borderRadius:"6px",color:"#f0f6fc",padding:"10px 12px",fontSize:"14px",boxSizing:"border-box",outline:"none"}})]}),(0,t.jsxs)("div",{children:[(0,t.jsxs)("label",{style:{display:"block",fontSize:"13px",fontWeight:"bold",marginBottom:"8px"},children:["\uD83D\uDD17 홍보글 게시글 링크 목록 (",i,"개 필수)"]}),f.allowedDomains&&(0,t.jsxs)("div",{style:{fontSize:"11px",color:"#58a6ff",backgroundColor:"rgba(56,139,253,0.1)",border:"1px solid rgba(56,139,253,0.2)",borderRadius:"4px",padding:"8px 10px",marginBottom:"10px",lineHeight:"1.4"},children:["\uD83D\uDCE2 ",(0,t.jsx)("strong",{children:"허용된 등록 사이트:"})," ",f.allowedDomains,(0,t.jsx)("br",{}),"(지정된 사이트에 작성된 홍보글 링크만 등록 및 검증이 가능합니다.)"]}),(0,t.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"10px"},children:a.map((e,r)=>(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[(0,t.jsxs)("span",{style:{fontSize:"12px",color:"#8b949e",width:"45px",textAlign:"right",fontWeight:"bold"},children:[r+1,"번방:"]}),(0,t.jsx)("input",{type:"url",value:e,onChange:e=>k(r,e.target.value),onPaste:e=>{let o=e.clipboardData.getData("text");if(o){let t=o.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);if(t.length>1){e.preventDefault();let o=[...a];for(let e=0;e<t.length;e++){let s=r+e;s<o.length&&(o[s]=t[e])}d(o)}}},placeholder:"https://... 홍보 게시글의 URL 주소 입력",disabled:c,style:{flex:1,backgroundColor:"#0d1117",border:"1px solid #30363d",borderRadius:"6px",color:"#f0f6fc",padding:"10px 12px",fontSize:"13px",boxSizing:"border-box",outline:"none"}}),(0,t.jsx)("button",{type:"button",onClick:()=>C(r),disabled:c,style:{padding:"10px 12px",backgroundColor:"#21262d",border:"1px solid #30363d",borderRadius:"6px",color:"#c9d1d9",fontSize:"12px",cursor:"pointer",whiteSpace:"nowrap",outline:"none",transition:"background-color 0.2s"},onMouseEnter:e=>e.currentTarget.style.backgroundColor="#30363d",onMouseLeave:e=>e.currentTarget.style.backgroundColor="#21262d",children:"\uD83D\uDCCB 붙여넣기"})]},r))})]}),(0,t.jsxs)("div",{style:{backgroundColor:"#1f1f1f",border:"1px solid #30363d",borderRadius:"6px",padding:"12px",fontSize:"12px",color:"#8b949e",lineHeight:"1.6"},children:["\uD83D\uDCCC **필독 유의사항** ",(0,t.jsx)("br",{}),"- 모든 링크의 웹페이지에 공식 홍보글 키워드가 완전히 들어있어야 합니다. ",(0,t.jsx)("br",{}),"- 한 번 사용(승인)된 링크는 중복 제출이 불가능하며, 다른 캐릭터나 다음날 재사용할 수 없습니다. (매일 새로 쓴 글만 제출 가능)"]}),(0,t.jsx)("button",{type:"submit",disabled:c,style:{backgroundColor:c?"#21262d":"#238636",border:"1px solid rgba(240,246,252,0.1)",borderRadius:"6px",color:c?"#8b949e":"#ffffff",padding:"12px",fontSize:"15px",fontWeight:"bold",cursor:c?"not-allowed":"pointer",textAlign:"center",transition:"background-color 0.2s",marginTop:"6px"},children:c?"⏳ 실시간 크롤링 검증 진행 중...":"\uD83C\uDF81 홍보 자동인증 및 보상 받기"})]}):(0,t.jsxs)("div",{style:{backgroundColor:"rgba(248,81,73,0.1)",border:"1px solid rgba(248,81,73,0.3)",borderRadius:"6px",color:"#f85149",padding:"16px",fontSize:"14px",textAlign:"center"},children:["⚠️ **접근 오류:** 지정된 서버 정보가 존재하지 않습니다. ",(0,t.jsx)("br",{}),"운영자가 공유해 준 공식 홍보 주소로 다시 접속해 주세요."]}),x&&(0,t.jsxs)("div",{style:{marginTop:"20px",padding:"16px",borderRadius:"6px",border:"1px solid",backgroundColor:x.success?"rgba(56,139,253,0.1)":"rgba(248,81,73,0.1)",borderColor:x.success?"rgba(56,139,253,0.3)":"rgba(248,81,73,0.3)",color:x.success?"#58a6ff":"#f85149",fontSize:"14px",lineHeight:"1.5"},children:[(0,t.jsx)("strong",{style:{display:"block",fontSize:"15px",marginBottom:"8px"},children:x.success?"✅ 인증 완료 및 지급 성공":"❌ 인증 실패"}),(0,t.jsx)("div",{style:{marginBottom:"12px",whiteSpace:"pre-wrap"},children:x.message}),x.results&&x.results.length>0&&(0,t.jsx)("div",{style:{marginTop:"12px",borderTop:"1px solid rgba(255, 255, 255, 0.1)",paddingTop:"12px",display:"flex",flexDirection:"column",gap:"8px"},children:x.results.map((e,r)=>(0,t.jsxs)("div",{style:{display:"flex",alignItems:"flex-start",ga
1p:"8px",fontSize:"13px",backgroundColor:e.success?"rgba(56,139,253,0.05)":"rgba(248,81,73,0.05)",padding:"8px 10px",borderRadius:"4px",border:"1px solid",borderColor:e.success?"rgba(56,139,253,0.1)":"rgba(248,81,73,0.1)",color:e.success?"#88c0ff":"#ff7b72"},children:[(0,t.jsx)("span",{style:{fontSize:"14px",flexShrink:0,marginTop:"2px"},children:e.success?"✅":"❌"}),(0,t.jsxs)("div",{style:{wordBreak:"break-all"},children:[(0,t.jsxs)("strong",{children:[e.index,"번방:"]})," ",e.success?"인증 통과":"검증 실패 - ".concat(e.error),(0,t.jsx)("div",{style:{fontSize:"11px",color:"#8b949e",marginTop:"2px"},children:e.link})]})]},r))})]}),j&&(0,t.jsxs)("div",{style:{marginTop:"20px",padding:"20px",backgroundColor:"#1f242c",border:"2px dashed #ff7b72",borderRadius:"8px",color:"#c9d1d9",fontSize:"14px",lineHeight:"1.6"},children:[(0,t.jsx)("strong",{style:{display:"block",fontSize:"15px",color:"#ff7b72",marginBottom:"8px"},children:"⚠️ 보안 우회 수동 검증 요청"}),(0,t.jsxs)("p",{style:{margin:"0 0 16px 0",fontSize:"13px",color:"#8b949e",lineHeight:"1.5"},children:["일부 홍보 사이트(예: 우아미넷 등)의 강력한 보안 때문에 자동 인증에 실패했습니다. ",(0,t.jsx)("br",{}),"아래 버튼을 누르면 통과하지 못한 링크들이 운영자 텔레그램으로 전송되어 **수동 검증이 요청되며, 보상은 인게임 창고로 즉시 선지급**됩니다."]}),(0,t.jsxs)("div",{style:{backgroundColor:"rgba(248,81,73,0.1)",border:"1px solid rgba(248,81,73,0.3)",borderRadius:"6px",padding:"12px",fontSize:"12.5px",color:"#ff7b72",marginBottom:"16px",lineHeight:"1.4"},children:["\uD83D\uDEA8 **필독 유의사항** ",(0,t.jsx)("br",{}),"운영자가 사후 수동 검토 시 홍보글 확인이 제대로 안 될 경우(허위 제출 등), **아이템 회수 및 계정 영구 제재** 등의 불이익을 받을 수 있습니다."]}),(0,t.jsx)("button",{onClick:D,disabled:c,style:{width:"100%",backgroundColor:c?"#21262d":"#238636",border:"1px solid rgba(240,246,252,0.1)",borderRadius:"6px",color:c?"#8b949e":"#ffffff",padding:"12px",fontSize:"14px",fontWeight:"bold",cursor:c?"not-allowed":"pointer",textAlign:"center",transition:"background-color 0.2s"},children:c?"⏳ 보상 선지급 및 요청 전송 중...":"\uD83C\uDF81 수동 검증 동의하고 즉시 보상 받기"})]})]}),(0,t.jsx)("div",{style:{marginTop:"20px",fontSize:"11px",color:"#8b949e"},children:"Powered by 나방캣 홍보 자동화 시스템 \xa9 2026"})]})}},1163:function(e,r,o){e.exports=o(3079)}},function(e){e.O(0,[888,774,179],function(){return e(e.s=7087)}),_N_E=e.O()}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.