JavaScript Tag
JavaScript Tag

Install

Insert the following tag in the <head> of your HTML file before your main script:

1
2
3
<script>
   (()=>{"use strict";var e={d:(r,t)=>{for(var n in t)e.o(t,n)&&!e.o(r,n)&&Object.defineProperty(r,n,{enumerable:!0,get:t[n]})},o:(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},r={};e.r(r),e.d(r,{factory:()=>C,initChallenges:()=>j,runChallenge:()=>O,setUserId:()=>E});const t=e=>new Promise((r=>setTimeout(r,e))),n=()=>{};var o=(e,r,t)=>new Promise(((n,o)=>{var i=e=>{try{s(t.next(e))}catch(e){o(e)}},l=e=>{try{s(t.throw(e))}catch(e){o(e)}},s=e=>e.done?n(e.value):Promise.resolve(e.value).then(i,l);s((t=t.apply(e,r)).next())}));const i="__prt__",l=i+"preload__runners_controller",s=()=>String(Math.random()).replace("0.","");function a(e,r,t){return o(this,null,(function*(){let n=null;const o=new Promise((e=>{n=setTimeout((()=>{setTimeout((()=>{e(null)}),100)}),r)})),i=yield Promise.race([e,o]);if(n&&clearTimeout(n),!i)throw new Error(t);return i}))}const c=function(e){return new Promise((function(r,t){let n=0;e.forEach((o=>{o.then(r).catch((function(r){++n===e.length&&t(r)}))}))}))};function u(){let e=n,r=n;return{promise:new Promise(((t,n)=>{e=t,r=n})),resolve:e,reject:r}}const d=()=>{let e=u(),r=e.resolve,t=e.reject;const n=()=>{r=null,t=null},o={current:e.promise,busy:()=>{r||(e=u(),o.current=e.promise,r=e.resolve,t=e.reject)},ready:e=>{r&&r(e),n()},failed:()=>{t&&t(),n()}};return o},h=e=>({then:r=>{if(r){const t=r(e);return t&&"function"==typeof t.then?t:h(t)}return h(e)}}),p={integration:{type:"UNKNOWN",version:"0.0.0"}};var y=Object.defineProperty,m=Object.getOwnPropertySymbols,f=Object.prototype.hasOwnProperty,w=Object.prototype.propertyIsEnumerable,v=(e,r,t)=>r in e?y(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t;const g=(()=>{const e={};return r=>{if(e[r])return e[r];const t=function(e){const r=s(),t=i+r;window[t]={};const n=document.createElement("script");n.src=e,n.dataset.id=r,n.async=!0,document.head.append(n);const o=()=>{n.remove(),delete window[t]};return new Promise(((e,r)=>{n.onload=()=>{if(!window[t].r||"function"!=typeof window[t].r)return r(new Error("Not valid script loaded")),void o();e(window[t].r),o()},n.onerror=()=>{o(),r(new Error("Script load error"))}}))}(r);return e[r]=t,t.catch((()=>{delete e[r]})),t}})(),b=e=>{const r=Date.now(),i={api:d(),load:d(),init:d()},s=e=>()=>i[e].current;let u=s("api"),y=s("init");const b=s("load");let P=()=>b().then(u);const C=l=>{(e=>{const r=document.createElement("link");r.rel="preload",r.as="script",r.href=e,document.head.appendChild(r)})(l.url+"/challenges/v2/"+l.siteKey),function(e,r,n,i){return o(this,null,(function*(){const n=[];for(let o=0;o<r;o++)try{return n.push(e(o>0)),yield a(c(n),3e3,i)}catch(e){if(o===r-1)throw e;yield t(100)}throw new Error(i+" ("+r+" attempts)")}))}((t=>{let n=0;return()=>{return o=function*(){++n;const o=Date.now();return(yield g((e||t.url)+"/client/v1.js")).bind(null,{s:o,r:n,i:r})},new Promise(((e,r)=>{var t=e=>{try{i(o.next(e))}catch(e){r(e)}},n=e=>{try{i(o.throw(e))}catch(e){r(e)}},i=r=>r.done?e(r.value):Promise.resolve(r.value).then(t,n);i((o=o.apply(void 0,null)).next())}));var o}})(l),l.reload?1:3,0,"Timeout").then((e=>r=>{e.reload&&(i.init.busy(),i.api.busy());const t=r();return P=()=>h(t),u=()=>h(t),i.api.ready(t),i.load.ready(),!0})(l)).catch((e=>r=>{const t=r instanceof Error?r.message:"UNKNOWN";i.api.ready((e=>{const r=()=>Promise.resolve(e);return{setUserId:n,runCaptcha:()=>({dispose:n,promise:Promise.reject()}),runChallenge:r,initChallenges:()=>Promise.resolve(r)}})("[Error] Main script load error "+t)),i.init.ready(),setTimeout((()=>{e.reload=!0,j(e)}),5e3)})(l))},j=e=>{const t=window[l];if(t&&"function"==typeof t.r){const e=t.r({s:Date.now(),r:0,i:r});return P=()=>h(e),y=()=>h(void 0),u=()=>h(e),i.api.ready(e),i.init.ready(),void i.load.ready()}C(e)},O=(()=>{let e=!0;return(...r)=>{e&&(e=!1,(e=>{j({url:e.url,reload:!1,siteKey:e.siteKey}),(e=>{P().then((r=>r.initChallenges(e))).then((()=>{y=()=>h(void 0),i.init.ready()}))})(e)})(...r))}})(),E=e=>y().then(u).then((r=>r.runChallenge(e)));return{initChallenges:e=>(e=>(O(e),y().then((()=>E))))(((e,r)=>{for(var t in r||(r={}))f.call(r,t)&&v(e,t,r[t]);if(m)for(var t of m(r))w.call(r,t)&&v(e,t,r[t]);return e})({internal:e.internal||p},e)),runChallenge:E,runCaptcha:e=>{const r=P().then((({runCaptcha:r})=>r(e)));return{dispose:()=>{r.then((e=>e.dispose()))},promise:r.then((e=>e.promise))}},setUserId:e=>{P().then((r=>r.setUserId(e)))}}},P="https://verify.botbye.com",C=e=>{const{initChallenges:r,runChallenge:t,setUserId:n}=b(e||P);return{initChallenges:t=>r(Object.assign({url:t.api||e||P,siteKey:t.clientKey,ver:"1.2.1",internal:{integration:{version:"1.2.1",type:"JS_TAG"}}},t)),runChallenge:t,setUserId:n}},{initChallenges:j,runChallenge:O,setUserId:E}=C(P);window.botbye=r})();
</script>

Configuration

Init BotBye on your script with your project client-key:

1
2
3
4
window.botbye.initChallenges({
  // Use your client-key
  clientKey: "00000000-0000-0000-0000-000000000000"
});

Usage

To run challenge and generate BotBye token call runChallenge:

1
2
3
4
/**
 * @return {Promise} Promise with BotBye token
 */
const botByeToken = await window.botbye.runChallenge();

2. Send this token in any convenient way to the backend. For example in x-botbye-token header:

1
2
3
4
5
6
7
8
9
fetch(
  'https://domain.com',
  {
    method: "POST",
    headers: {
        "x-botbye-token": botByeToken
    }
  }
)