{"version":3,"sources":["components/UI/Loader.js","services/Auth.js","globalContext.js","components/CategoryCards/CategoryCards.js","components/CategoryTabs/CategoryTabs.js","components/PredictionList/PredictionList.js","assets/images/logo.png","components/AppHeader/AppHeader.js","components/FeedbackModal/FeedbackModal.js","components/Footer/Footer.js","components/ProgressCircles/ProgressCircles.js","assets/images/cyborg.png","assets/images/human_new.png","assets/images/political_bot.png","assets/images/self_declared_bot.png","assets/images/social_bot.png","assets/images/spam_bot.png","views/Home.js","utils/useWindowSize.js","components/Header/Header.js","views/Faq.js","views/Publications.js","views/Datasets.js","views/Multiple.js","get.js","views/Details.js","App.js","serviceWorker.js","index.js"],"names":["Loader","className","Spinner","animation","role","Auth","props","React","useState","allDone","setAllDone","useFetch","process","timeout","request","location","useEffect","didCancel","queryString","parse","search","oauth_token","oauth_verifier","localForage","getItem","then","oauth_token_secret","post","results","ok","Promise","all","setItem","user_id","screen_name","removeItem","catch","error","console","to","ReactDOM","createPortal","document","getElementById","whyDidYouRender","StateContext","createContext","StateProvider","reducer","initialState","children","Provider","value","useReducer","useGlobalState","useContext","CategoryCards","categories","setBasicCat","setExplanationType","setActiveCategory","categoryKeys","Object","keys","categoryValues","values","sumOfCategories","j","length","Math","abs","testList","content","network","sentiment","temporal","user","id","Row","map","v","i","Col","xs","md","lg","xl","charAt","toUpperCase","slice","round","maxValue","text","toFixed","background","backgroundPadding","styles","buildStyles","backgroundColor","textColor","pathColor","trailColor","Button","variant","size","block","onClick","e","CategoryTabs","featureCategories","activeCategory","basicCat","sumsArr","catSum","k","push","sumsCat","Map","sumsCatObj","fromEntries","Tabs","defaultActiveKey","onSelect","key","Tab","title","eventKey","replace","PredictionList","predictions","modelsDev","ListGroup","horizontal","Item","OverlayTrigger","placement","overlay","Tooltip","withRouter","navScrolled","setNavScrolled","state","updateState","localforage","info","type","userInfo","window","addEventListener","scrollY","Navbar","expand","fixed","Brand","href","src","logo","alt","Toggle","Collapse","Nav","NavItem","Link","active","name","get","Error","style","display","clear","reload","animateScroll","scrollToTop","duration","smooth","FeedbackModal","show","setShow","username","botname","cachePolicy","handleClose","accountTypes","optionOneRadios","optionFourRadios","optionOneValue","setOptionOneValue","optionTwoValue","setOptionTwoValue","optionThreeValue","setOptionThreeValue","optionFourValue","setOptionFourValue","optionFiveValue","setOptionFiveValue","optionSixValue","setOptionSixValue","buttonEnabled","setButtonEnabled","feedbackText","setFeedbackText","submitFeedback","a","feedback","startsWith","optionOne","optionTwo","optionThree","optionFour","optionFive","optionSix","setTimeout","Modal","onHide","centered","Header","closeButton","Title","Body","Form","Group","index","Check","label","Control","as","rows","onInput","target","placeholder","maxLength","Footer","disabled","hideToTopButton","setToTopButton","Container","fluid","sm","Alert","ProgressCircles","sortedList","list","sort","perc1","perc2","progress","image","root","path","stroke","Home","width","isSSR","innerWidth","height","innerHeight","windowSize","setWindowSize","changeWindowSize","removeEventListener","useWindowSize","setUsername","usernameTouched","setUsernameTouched","setBotname","explanationType","setPredictions","reasons","setReasons","features","setFeatures","progressBars","setProgressBars","historyObject","setHistoryObject","fetchPredictions","stringify","respData","prediction","getMax","cyborg","cyborgImg","human","humanImg","political_bot","politicalBotImg","self_declared_bot","selfDeclaredBotImg","social_bot","socialBotImg","spam_bot","spamBotImg","fetchExplanations","fetchFeatures","object","filter","x","max","apply","usernameIsValid","trim","usernameIsInvalid","formSubmissionHandler","event","preventDefault","scroller","scrollTo","usernameInputClasses","Fragment","loading","onSubmit","CardGroup","Card","Text","rel","InputGroup","onChange","onBlur","Append","reverse","Image","roundedCircle","tempPredictions","data","JSON","blob","Blob","link","createElement","URL","createObjectURL","download","Date","getTime","click","ButtonGroup","feature_categories","feature_weights","intercept","local_pred","model_prediction","header","faq","publications","datasets","Multiple","response","reRef","useRef","email","setEmail","setName","file","setFile","modalText","setModalText","submitHandler","current","executeAsync","token","formData","FormData","append","count","floor","status","sitekey","ref","controlId","files","getFunction","obj","defaultValue","result","String","prototype","split","call","Boolean","reduce","res","undefined","Plotly","register","require","Plot","createPlotlyComponent","Details","match","params","y","mode","layout","showlegend","autosize","xaxis","autorange","showgrid","zeroline","yaxis","margin","t","l","r","b","config","displayModeBar","responsive","useResizeHandler","nticks","App","exact","component","Faq","Publications","Datasets","hostname","render","action","isEqual","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.2fa9d121.chunk.js","sourcesContent":["import { Spinner } from \"react-bootstrap\";\nimport \"./Loader.css\";\n\nconst Loader = () => {\n return (\n
\n \n Loading...\n \n
\n );\n};\n\nexport default Loader;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport PropTypes from \"prop-types\";\nimport queryString from \"query-string\";\nimport { Redirect } from \"react-router-dom\";\nimport useFetch from \"use-http\";\nimport localForage from \"localforage\";\nimport Loader from \"../components/UI/Loader\";\n\nconst Auth = (props) => {\n const [allDone, setAllDone] = React.useState(false);\n const [request] = useFetch(process.env.REACT_APP_SERVER_URL, {\n timeout: 600000,\n });\n\n const { location } = props;\n\n React.useEffect(() => {\n let didCancel = false;\n const { oauth_token, oauth_verifier } = queryString.parse(location.search);\n localForage.getItem(\"oauth_token_secret\").then((oauth_token_secret) => {\n if (oauth_token_secret && !didCancel) {\n request\n .post(\"/req2acc\", { oauth_token, oauth_token_secret, oauth_verifier })\n .then((results) => {\n if (results.ok && !didCancel) {\n Promise.all([\n localForage.setItem(\"user_info\", {\n oauth_token: results.oauth_token,\n oauth_token_secret: results.oauth_token_secret,\n user_id: results.user_id,\n screen_name: results.screen_name,\n }),\n localForage.removeItem(\"oauth_token_secret\"),\n ])\n .then(() => setAllDone(true))\n .catch((error) => {\n console.error(error);\n setAllDone(true);\n });\n }\n })\n .catch((error) => {\n console.error(error);\n setAllDone(true);\n });\n }\n });\n return () => {\n didCancel = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [location.search]);\n\n return allDone ? (\n \n ) : (\n ReactDOM.createPortal(, document.getElementById(\"overlays\"))\n );\n};\n\nAuth.propTypes = { location: PropTypes.object.isRequired };\nAuth.whyDidYouRender = true;\n\nexport default Auth;\n","/* eslint-disable react/prop-types */\nimport React from \"react\";\n\nconst StateContext = React.createContext();\n\nexport const StateProvider = ({ reducer, initialState, children }) => (\n\t\n\t\t{children}\n\t\n);\n\nexport const useGlobalState = () => React.useContext(StateContext);\nexport default StateContext;\n","import React from \"react\";\nimport \"./CategoryCards.css\";\nimport { Row, Col, Button } from 'react-bootstrap';\nimport { CircularProgressbar, buildStyles } from 'react-circular-progressbar';\nimport 'react-circular-progressbar/dist/styles.css';\nimport { FaRegListAlt } from \"react-icons/fa\";\n\nconst CategoryCards = ({categories, setBasicCat, setExplanationType, setActiveCategory}) => {\n const categoryKeys = Object.keys(categories);\n const categoryValues = Object.values(categories);\n let sumOfCategories = 0;\n for (let j=0; j < categoryValues.length; j++) {\n sumOfCategories += Math.abs(categoryValues[j]);\n }\n\n const testList = {\n content: \"Text-relevant features that capture the use of semantic elements, such as number of words, emoticons, inter-tweet similarity, etc.\",\n network: \"Features that are generated by the network of used hashtags (hashtag co-occurence)\",\n sentiment: \"Features that reflect the sentiment expressed in each tweet, such as percentage of sentiment-neutral tweets.\",\n temporal: \"Features which are exclusively relevant to the timestamps of tweets and retweets and the elapsed time between them in a given period\",\n user: \"Features that refer to the characteristics of the account, such as number of favorites, friends and followers.\"\n }\n\n const onClickHandler = (e) => {\n setBasicCat(e);\n setActiveCategory(e);\n setExplanationType(\"advanced\");\n }\n\n return (\n <>\n
\n These features contribute positively to identifying the user as human\n
\n These features push the Machine Learning model to identifying the user as bot\n
\n\n \n {categoryKeys.map((v, i) => \n \n
0 ? \"category-card red-bg-card\" : \"category-card green-bg-card\"}>\n \n \n

{v.charAt(0).toUpperCase() + v.slice(1)}

\n \n \n 0 ? \"rgba(242,100,68,0.5)\" : \"rgba(4,217,196,0.5)\",\n trailColor: categoryValues[i] > 0 ? \"rgba(242,100,68,0.1)\" : \"rgba(4,217,196,0.1)\"\n })}\n className=\"card-progress\"\n />\n \n
\n \n \n
\n {testList[v]}\n \n
\n \n \n onClickHandler(v)}\n >\n Check Features\n \n \n
\n \n \n )}\n
\n \n )\n}\n\nexport default CategoryCards;\n","import React from \"react\";\nimport \"./CategoryTabs.css\";\nimport { Row, Col, Tab, Tabs } from \"react-bootstrap\";\nimport { CircularProgressbar, buildStyles } from 'react-circular-progressbar';\nimport 'react-circular-progressbar/dist/styles.css';\n\nconst CategoryTabs = ({featureCategories, setActiveCategory, activeCategory, basicCat}) => {\n const categoryKeys = Object.keys(featureCategories[0]);\n\n const handleSelect = (key) => {\n setActiveCategory(key);\n }\n\n // features values sum per category calculation\n const categoryValues = Object.values(featureCategories[1]);\n let sumsArr = [];\n\n for (let j=0; j < categoryValues.length; j++) {\n let catSum = 0;\n for (let k=0; k < categoryValues[j].length; k++) {\n catSum += Math.abs(categoryValues[j][k][1]);\n }\n sumsArr.push(catSum);\n }\n\n const sumsCat = new Map([\n ['content', sumsArr[0]],\n ['network', sumsArr[1]],\n ['sentiment', sumsArr[2]],\n ['temporal', sumsArr[3]],\n ['user', sumsArr[4]]\n ]);\n const sumsCatObj = Object.fromEntries(sumsCat);\n\n return (\n <>\n
\n These features contribute positively to identifying the user as human\n
\n These features push the Machine Learning model to identifying the user as bot\n
\n\n \n {categoryKeys.map((v, i) => \n \n )}\n \n\n {Object.values(featureCategories[1][activeCategory]).map((v, i) => \n
0 ? \"category-tab-card red-bg-tab\" : \" category-tab-card green-bg-tab\"}>\n \n \n {/*

percentage: {(Math.round(Math.abs(v[1]) / sumsCatObj[activeCategory] * 10000) / 100)}%

*/}\n
{featureCategories[2][v[2]].charAt(0).toUpperCase() + featureCategories[2][v[2]].slice(1)}
\n {v[0].replace(v[2], \"feature value\")}\n \n \n 0 ? \"rgba(242,100,68,0.5)\" : \"rgba(4,217,196,0.5)\",\n trailColor: v[1] > 0 ? \"rgba(242,100,68,0.1)\" : \"rgba(4,217,196,0.1)\"\n })}\n className=\"card-progress\"\n />\n \n
\n
\n )}\n \n )\n}\n\nexport default CategoryTabs;\n","import React from 'react';\nimport { ListGroup, OverlayTrigger, Tooltip } from 'react-bootstrap';\n\nconst PredictionList = ({predictions}) => {\n const modelsDev = Math.round((predictions[2] - predictions[3])*1000)/1000;\n return (\n <>\n

Explainable Model Prediction

\n \n Sum of feature weights: {predictions[0]}\n \n Prediction of explainable model\n \n }\n >\n Local prediction: {predictions[2]}\n \n \n Intercept of explainable model\n \n }\n >\n Intercept: {predictions[1]}\n \n \n Prediction of ML model\n \n }\n >\n Model Prediction: {predictions[3]}\n \n Explainable - ML Models Deviation: {modelsDev}\n \n \n );\n}\n\nexport default PredictionList;","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAABaCAYAAAALv5xOAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTA4LTI3VDIxOjI3OjAzKzAzOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMC0wOC0yOFQxMjowMjoxMiswMzowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMC0wOC0yOFQxMjowMjoxMiswMzowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0ZmJhMDgyYS0yODMzLTk5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\"","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { withRouter } from \"react-router-dom\";\nimport localforage from \"localforage\";\nimport useFetch from \"use-http\";\nimport logo from \"../../assets/images/logo.png\";\nimport Navbar from \"react-bootstrap/Navbar\";\nimport { Nav, NavItem } from \"react-bootstrap\";\nimport Button from \"react-bootstrap/Button\";\nimport { FaTwitter } from \"react-icons/fa\";\nimport { animateScroll } from \"react-scroll\";\n\nimport \"./AppHeader.css\";\n\nimport { useGlobalState } from \"../../globalContext\";\n\nconst AppHeader = () => {\n\tconst [request] = useFetch(process.env.REACT_APP_SERVER_URL, { timeout: 600000 });\n const [navScrolled, setNavScrolled] = React.useState(true);\n\tconst [state, updateState] = useGlobalState();\n\n\tReact.useEffect(() => {\n\t\tlet didCancel = false;\n\t\tlocalforage.getItem(\"user_info\").then((info) => {\n\t\t\tif (!didCancel) updateState({ type: \"changeUserInfo\", userInfo: info });\n\t\t});\n\t\treturn () => didCancel = true;\n\t});\n\n\tconst loginWithTwitter = () => {\n\t\trequest.get(\"/req4req\")\n\t\t\t.then(({ oauth_token, oauth_token_secret } = {}) => {\n\t\t\t\tlocalforage.setItem(\"oauth_token_secret\", oauth_token_secret)\n\t\t\t\t\t.then(() => {\n\t\t\t\t\t\tif (oauth_token) {\n\t\t\t\t\t\t\twindow.location.href = `https://api.twitter.com/oauth/authorize?oauth_token=${oauth_token}`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new Error(\"oauth_token is undefined!\");\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t.catch(console.error);\n\t\t});\n\t};\n\n\t// Scroll to top\n const scrollToTop = () => {\n animateScroll.scrollToTop({\n duration: 500,\n smooth: true,\n });\n }\n\n\t// Show/hide toTopButton\n window.addEventListener(\"scroll\", () => {\n if (window.scrollY > 50) {\n setNavScrolled(false);\n } else {\n setNavScrolled(true);\n }\n });\n\n\treturn (\n\t\t
\n\t\t\t<>\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\"Bot\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\n \t
\n\t);\n};\n\nAppHeader.propTypes = {\n\tlocation: PropTypes.object.isRequired,\n};\n\nexport default withRouter(AppHeader);\n","import React from \"react\";\nimport \"./FeedbackModal.css\";\nimport useFetch from \"use-http\";\n\nimport { Button, Form, Modal } from \"react-bootstrap\";\n\nconst FeedbackModal = ({show, setShow, username, botname}) => {\n const [request] = useFetch(process.env.REACT_APP_SERVER_URL, {\n timeout: 600000,\n cachePolicy: \"no-cache\"\n });\n \n const handleClose = () => setShow(false);\n\n const accountTypes = {\n \"cyborg\": \"Cyborg\",\n \"political_bot\": \"Political Bot\",\n \"human\": \"Human\",\n \"self_declared_bot\": \"Self Declared Bot\",\n \"social_bot\": \"Social Bot\",\n \"spam_bot\": \"Spam Bot\",\n \"other_bot\": \"Other Bot\"\n }\n\n const optionOneRadios = [\n { name: \"Agree\", value: \"agree\" },\n { name: \"Disagree\", value: \"disagree\" }\n ];\n\n const optionTwoRadios = [\n { name: \"Human (a genuine human account)\", value: \"human\" },\n { name: \"Cyborg (a celebrity or organization-company that uses automation)\", value: \"cyborg\" },\n { name: \"Social Bot (a bot account that imitates a human, trying to get likes, increase its network of friends and followers, etc.)\", value: \"social_bot\" },\n { name: \"Political Bot (a non-verified bot account that is being used for political purposes, affecting public opinion and elections)\", value: \"political_bot\" },\n { name: \"Spam Bot (a bot account that posts spam messages - usually spam content, frauds, etc.)\", value: \"spam_bot\" },\n { name: \"Self-Declared Bot (a Twitter account that explicitly claims to be a bot)\", value: \"self_declared_bot\" },\n { name: \"Other bot (bot for sure, but i don't know what type of bot)\", value: \"other_bot\" }\n ];\n\n const optionFourRadios = [\n { name: \"Strongly Disagree\", value: \"strongly_disagree\" },\n { name: \"Disagree\", value: \"disagree\" },\n { name: \"Neutral\", value: \"neutral\" },\n { name: \"Agree\", value: \"agree\" },\n { name: \"Strongly Agree\", value: \"strongly_agree\" }\n ];\n\n const [optionOneValue, setOptionOneValue] = React.useState(\"agree\");\n const [optionTwoValue, setOptionTwoValue] = React.useState(null);\n const [optionThreeValue, setOptionThreeValue] = React.useState(null);\n const [optionFourValue, setOptionFourValue] = React.useState(null);\n const [optionFiveValue, setOptionFiveValue] = React.useState(null);\n const [optionSixValue, setOptionSixValue] = React.useState(\"\");\n \n const handleTextArea = (e) => {\n setOptionSixValue(e.target.value);\n }\n\n const [buttonEnabled, setButtonEnabled] = React.useState(null);\n const [feedbackText, setFeedbackText] = React.useState(null);\n\n React.useEffect(() => {\n if (optionOneValue === \"agree\") setOptionTwoValue(null);\n\n const validateFeedback = () => {\n if (optionOneValue === \"disagree\") return optionOneValue && optionTwoValue && optionThreeValue != null ? false : true\n else return optionOneValue && optionThreeValue != null ? false : true\n }\n\n setButtonEnabled(validateFeedback());\n }, [\n optionOneValue,\n optionTwoValue,\n optionThreeValue,\n optionFourValue,\n optionFiveValue,\n optionSixValue,\n ])\n\n const submitFeedback = async () => {\n const feedback = {\n username: username.startsWith(\"@\") ? username.slice(1) : username,\n optionOne: optionOneValue,\n optionTwo: optionTwoValue,\n optionThree: optionThreeValue,\n optionFour: optionFourValue,\n optionFive: optionFiveValue,\n optionSix: optionSixValue\n }\n\n setOptionOneValue(\"agree\");\n setOptionTwoValue(null);\n setOptionThreeValue(null);\n setOptionFourValue(null);\n setOptionFiveValue(null);\n setOptionSixValue(\"\");\n\n const respData = await request.post(\"/feedback\", feedback);\n\n if (respData.ok) {\n setFeedbackText(\"Thanks for your feedback!\");\n setTimeout(() => {\n handleClose();\n setFeedbackText(\"\");\n }, 1500);\n } else {\n setFeedbackText(\"Submit failed\");\n }\n }\n\n return (\n \n \n Feedback\n \n \n
\n \n

I agree with the prediction that user { username } is a { accountTypes[botname] } (required):

\n {optionOneRadios.map((value, index) => (\n
\n setOptionOneValue(value.value)}\n name=\"groupOptionOne\"\n />\n
\n ))}\n {optionTwoRadios.map((value, index) => {\n if(optionOneValue === \"disagree\") {\n if(index === 0) {\n return (\n
\n

I believe the account { username } is a { optionTwoValue ? accountTypes[optionTwoValue] : \"...\" } (required):

\n
\n setOptionTwoValue(value.value)}\n name=\"groupOptionTwo\"\n />\n
\n
\n )\n } else {\n return (\n
\n setOptionTwoValue(value.value)}\n name=\"groupOptionTwo\"\n />\n
\n )\n }\n }\n return null\n })}\n

I believe the account { username } is spreading fake news (required):

\n {optionOneRadios.map((value, index) => (\n
\n setOptionThreeValue(value.value)}\n name=\"groupOptionThree\"\n />\n
\n ))}\n\n

The application helped me understand if the account is a bot or not (optional):

\n {optionFourRadios.map((value, index) => (\n
\n setOptionFourValue(value.value)}\n name=\"groupOptionFour\"\n />\n
\n ))}\n\n

I believe that the Bot-Detective application is easy to use (optional):

\n {optionFourRadios.map((value, index) => (\n
\n setOptionFiveValue(value.value)}\n name=\"groupOptionFive\"\n />\n
\n ))}\n\n

Help us get better - provide your suggestions (optional):

\n \n
\n
\n
\n \n

{ feedbackText }

\n \n \n
\n
\n )\n};\n\nexport default FeedbackModal;","import React from 'react';\nimport \"./Footer.css\";\nimport logo from \"../../assets/images/logo.png\";\nimport { Alert, Row, Col, Container } from \"react-bootstrap\";\nimport { animateScroll } from \"react-scroll\";\n\nconst Footer = () => {\n const [hideToTopButton, setToTopButton] = React.useState(true);\n\n // Scroll to top\n const scrollToTop = () => {\n animateScroll.scrollToTop({\n duration: 500,\n smooth: true,\n });\n }\n\n // Show/hide toTopButton\n window.addEventListener(\"scroll\", () => {\n if (window.scrollY > 50) {\n setToTopButton(false);\n } else {\n setToTopButton(true);\n }\n });\n \n return (\n
\n \n \n \n \"Bot\n \n \n
    \n
  • FAQ
  • \n
  • |
  • \n
  • Publications
  • \n
  • |
  • \n
  • Bot Datasets
  • \n {/*
  • |
  • \n
  • Privacy Policy
  • \n
  • |
  • \n
  • Terms of Use
  • */}\n
\n \n \n © Datalab, Aristotle Uni. of Thessaloniki\n \n
\n
\n
\n );\n}\n\nexport default Footer;","import React from 'react';\n\nimport { CircularProgressbarWithChildren } from 'react-circular-progressbar';\nimport 'react-circular-progressbar/dist/styles.css';\n\nimport { Row, Col } from 'react-bootstrap';\n\nconst ProgressCircles = ({list}) => {\n const sortedList = list.sort((perc1, perc2) => perc2.progress - perc1.progress);\n \n return (\n
\n \n {sortedList.map(({name, progress, image}) =>\n \n \n \n \n
{`${name}:`}

{`${progress}%`}

\n \n )\n }\n
\n
\n );\n}\n\nexport default ProgressCircles;","export default __webpack_public_path__ + \"static/media/cyborg.ba70ffd3.png\";","export default __webpack_public_path__ + \"static/media/human_new.a679b74b.png\";","export default __webpack_public_path__ + \"static/media/political_bot.1aa1eacd.png\";","export default __webpack_public_path__ + \"static/media/self_declared_bot.43129f30.png\";","export default __webpack_public_path__ + \"static/media/social_bot.e529276d.png\";","export default __webpack_public_path__ + \"static/media/spam_bot.faa514cd.png\";","/* eslint-disable max-len */\nimport \"../App.css\";\nimport React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport useFetch from \"use-http\";\nimport localforage from \"localforage\";\nimport queryString from \"query-string\";\nimport { scroller } from \"react-scroll\";\n\nimport { Container, Button, Alert, Row, Col, Card, CardGroup, InputGroup, Form, ButtonGroup, OverlayTrigger, Tooltip, Image } from \"react-bootstrap\";\nimport { FaArrowLeft, FaArrowDown, FaQuestion, FaInfo, FaUsers, FaSearch, FaTwitter, FaUserAlt, FaChartBar, FaPen, FaDownload } from \"react-icons/fa\";\n\nimport { useGlobalState } from \"../globalContext\";\nimport useWindowSize from \"../utils/useWindowSize\";\n\nimport CategoryCards from \"../components/CategoryCards/CategoryCards\";\nimport CategoryTabs from \"../components/CategoryTabs/CategoryTabs\";\nimport PredictionList from \"../components/PredictionList/PredictionList\"\n// import ReasonList from \"../components/ReasonList/ReasonList\";\nimport AppHeader from \"../components/AppHeader/AppHeader\";\nimport FeedbackModal from \"../components/FeedbackModal/FeedbackModal\";\nimport Footer from \"../components/Footer/Footer\";\nimport Loader from \"../components/UI/Loader\";\nimport ProgressCircles from \"../components/ProgressCircles/ProgressCircles\";\n\n// Images\nimport cyborgImg from \"../assets/images/cyborg.png\";\nimport humanImg from \"../assets/images/human_new.png\";\nimport politicalBotImg from \"../assets/images/political_bot.png\";\nimport selfDeclaredBotImg from \"../assets/images/self_declared_bot.png\";\nimport socialBotImg from \"../assets/images/social_bot.png\";\nimport spamBotImg from \"../assets/images/spam_bot.png\";\n\nconst Home = () => {\n const { width } = useWindowSize();\n\n const [username, setUsername] = React.useState(\"\");\n const [usernameTouched, setUsernameTouched] = React.useState(false);\n const [state, updateState] = useGlobalState();\n const [request] = useFetch(process.env.REACT_APP_SERVER_URL, {\n timeout: 600000,\n });\n\n const [show, setShow] = React.useState(false);\n\n const handleShow = () => setShow(true);\n\n const [botname, setBotname] = React.useState(null);\n\n const [explanationType, setExplanationType] = React.useState(\"basic\");\n const [predictions, setPredictions] = React.useState(null);\n const [reasons, setReasons] = React.useState(null);\n const [features, setFeatures] = React.useState(null);\n const [progressBars, setProgressBars] = React.useState([]);\n const [activeCategory, setActiveCategory] = React.useState(\"content\");\n const [basicCat, setBasicCat] = React.useState(\"\");\n \n const [historyObject, setHistoryObject] = React.useState([]);\n\n React.useEffect(() => {\n let didCancel = false;\n localforage.getItem(\"user_info\").then((info) => {\n if (!didCancel) updateState({ type: \"changeUserInfo\", userInfo: info });\n });\n return () => (didCancel = true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const loginWithTwitter = () => {\n request.get(\"/req4req\").then(({ oauth_token, oauth_token_secret } = {}) => {\n localforage\n .setItem(\"oauth_token_secret\", oauth_token_secret)\n .then(() => {\n if (oauth_token) {\n window.location.href = `https://api.twitter.com/oauth/authorize?oauth_token=${oauth_token}`;\n } else {\n throw new Error(\"oauth_token is undefined!\");\n }\n })\n .catch(console.error);\n });\n };\n\n const fetchPredictions = async () => {\n const accountTypes = {\n \"cyborg\": \"Cyborg\",\n \"political_bot\": \"Political Bot\",\n \"human\": \"Human\",\n \"self_declared_bot\": \"Self Declared Bot\",\n \"social_bot\": \"Social Bot\",\n \"spam_bot\": \"Spam Bot\",\n \"other_bot\": \"Other Bot\"\n }\n\n await setReasons(null);\n await setFeatures(null);\n \n const respData = await request.get(\n `/predict/${\n username.startsWith(\"@\") ? username.slice(1) : username\n }?${queryString.stringify(state.userInfo)}`\n );\n \n await setPredictions(respData.prediction);\n await setBotname(getMax(respData.prediction)[0]);\n\n if (username === \"\") {\n await setProgressBars([]);\n } else if (typeof respData.prediction == \"string\") {\n await setProgressBars([]);\n } else {\n if (historyObject.length < 3) {\n await setHistoryObject((historyObject) => [...historyObject, {username: username.startsWith(\"@\") ? username.slice(1) : username, image:respData.image, botname: accountTypes[getMax(respData.prediction)[0]], prediction: respData.prediction}])\n } else {\n await setHistoryObject(historyObject.slice(1));\n await setHistoryObject((historyObject) => [...historyObject, {username: username.startsWith(\"@\") ? username.slice(1) : username, image:respData.image, botname: accountTypes[getMax(respData.prediction)[0]], prediction: respData.prediction}])\n }\n\n await setProgressBars([\n {name: \"Cyborg\", progress: Math.round(respData.prediction.cyborg * 100), image: cyborgImg},\n {name: \"Human\", progress: Math.round(respData.prediction.human * 100), image: humanImg},\n {name: \"Political Bot\", progress: Math.round(respData.prediction.political_bot * 100), image: politicalBotImg},\n {name: \"Self Declared Bot\", progress: Math.round(respData.prediction.self_declared_bot * 100), image: selfDeclaredBotImg},\n {name: \"Social Bot\", progress: Math.round(respData.prediction.social_bot * 100), image: socialBotImg},\n {name: \"Spam Bot\", progress: Math.round(respData.prediction.spam_bot * 100), image: spamBotImg},\n ]);\n }\n };\n\n const fetchExplanations = async () => {\n const respData = await request.get(\n `/explain_in_details/${\n username.startsWith(\"@\") ? username.slice(1) : username\n }?${queryString.stringify(state.userInfo)}`\n );\n await setReasons(respData);\n };\n\n const fetchFeatures = async () => {\n const respData = await request.get(`/explainAllFeatures`);\n await setFeatures(respData);\n };\n\n const getMax = (object) => {\n return Object.keys(object).filter((x) => {\n return object[x] === Math.max.apply(null, Object.values(object));\n });\n };\n\n const downloadJSON = () => {\n let tempPredictions = {\n \"username\": username,\n \"cyborg\": `${Math.round(predictions.cyborg * 100)}%`,\n \"political_bot\": `${Math.round(predictions.political_bot * 100)}%`,\n \"human\": `${Math.round(predictions.human * 100)}%`,\n \"self_declared_bot\": `${Math.round(predictions.self_declared_bot * 100)}%`,\n \"social_bot\": `${Math.round(predictions.social_bot * 100)}%`,\n \"spam_bot\": `${Math.round(predictions.spam_bot * 100)}%`\n }\n\n const data = JSON.stringify(tempPredictions, null, 4); \n const blob = new Blob([data], { type: \"text/json\" });\n const link = document.createElement(\"a\");\n\n link.href = window.URL.createObjectURL(blob);\n link.download = `Bot-Detective-${new Date().getTime()}.json`;\n link.click();\n }\n\n // input & form submission handlers & validation\n const usernameIsValid = username.trim() !== \"\";\n const usernameIsInvalid = !usernameIsValid && usernameTouched;\n\n const usernameInputChangeHandler = (event) => {\n setUsername(event.target.value);\n };\n\n const usernameInputBlurHandler = (event) => {\n setUsernameTouched(true);\n };\n\n const scrollToPos = () => {\n scroller.scrollTo(\"more-info\", {\n duration: 500,\n smooth: true,\n });\n };\n \n const scrollToRes = () => {\n scroller.scrollTo(\"prediction-info\", {\n duration: 500,\n smooth: true,\n });\n };\n\n const scrollToDetailed = () => {\n scroller.scrollTo(\"detailed-info\", {\n duration: 500,\n smooth: true,\n });\n };\n\n const formSubmissionHandler = async (event) => {\n event.preventDefault();\n setUsernameTouched(true);\n\n if (!usernameIsValid) {\n return;\n } else {\n await fetchPredictions();\n scrollToRes();\n }\n };\n\n const usernameInputClasses = usernameIsInvalid\n ? \"prediction-input invalid\"\n : \"prediction-input\";\n\n return (\n \n
\n {request.loading &&\n ReactDOM.createPortal(\n ,\n document.getElementById(\"overlays\")\n )}\n \n
\n \n \n \n \n \n \n

Check if a Twitter account is a bot!

\n {width < 990 && (\n \n )}\n \n
\n
\n \n

\n \n Learn more\n \n

\n
\n
\n \n \n

Bot Detective V2

\n
\n \n \n \n \n \n

\n \n

\n \n
\n \n
What is Bot Detective
\n
\n \n Bot Detective V2 is the most recent update to the\n already existing{\" \"}\n web app.\n \n \n The updated version of Bot Detective features a new\n ensemble machine learning model that has been trained\n to truly available up-to-date labelled data.\n \n \n Bot-Detective V2 checks the activity of a Twitter\n account and assigns a percentage that refers to the\n probability of an account being human or a specific\n type of bot.\n \n \n The highest probability percentage corresponds to the\n most prevalent type of bot (or human).\n \n \n Explainable hints are detailed per Twitter account,\n with emphasis on the ten most relevant and important\n (still under development)\n \n
\n
\n \n \n \n

\n \n

\n \n
\n \n
Extra info
\n
\n \n Use of this service requires Twitter authentication\n and permissions. (\n Why?)\n \n \n If something is not working or you have questions,\n please contact us only after reading the{\" \"}\n FAQ.\n \n \n This service is based on the model and architecture\n that is described in our soon-to-be published paper{\" \"}\n \"Social Botomics: a systematic ensemble ML approach\n for explainable and multi-class bot detection\".\n \n
\n
\n \n \n \n

\n \n

\n \n
\n \n
Creation Team
\n
\n \n Bot Detective is an ongoing project of the{\" \"}\n \n Datalab\n {\" \"}\n at Aristotle University of Thessaloniki, Greece.\n \n \n Team members\n
\n Maria Kouvela\n
\n Ilias Dimitriadis\n
\n Athena Vakali\n
\n Stelios Karamanidis\n
\n Anastasios Meletlidis\n
\n
\n
\n \n
\n
\n
\n\n {/* Form to check user account */}\n {state.userInfo ? (\n <>\n \n

\n Check if a Twitter account is a bot\n

\n *If you want to analyze multiple accounts click here\n
\n \n \n
\n \n \n \n \n \n Check Account  \n \n \n \n \n \n
\n \n
\n \n ) : (\n \n \n \n Login with Twitter\n \n \n \n )}\n \n \n {usernameIsInvalid && (\n

\n Username must not be empty.\n

\n )}\n\n {predictions &&\n typeof predictions == \"string\" &&\n !request.loading &&\n username.trim() !== \"\" && (\n
\n

\n {predictions.charAt(0).toUpperCase() + predictions.slice(1)}\n

\n
\n )}\n\n \n {historyObject.length > 0 && !request.loading && (\n \n \n

Search History

\n \n
\n )}\n \n {[...historyObject].reverse().map((value, index) => {\n if (!request.loading) {\n return (\n \n
\n \n \n \n \n \n

{value.username}

\n
{value.botname}
\n \n
\n \n Spam Bot  {Math.round(value.prediction.spam_bot*100)}% \n Cyborg  {Math.round(value.prediction.cyborg*100)}% \n \n \n Self Declared Bot  {Math.round(value.prediction.self_declared_bot*100)}% \n Social Bot  {Math.round(value.prediction.social_bot*100)}% \n \n \n Human  {Math.round(value.prediction.human*100)}% \n Political Bot  {Math.round(value.prediction.political_bot*100)}% \n \n {/* \n {\n await setUsername(value.username);\n await fetchPredictions();\n }} \n className=\"history-btn\" \n sm=\"true\"\n >Search Again\n */}\n
\n \n )\n } else {\n return null\n } \n })}\n
\n
\n\n \n\n {predictions && typeof predictions == \"object\" && !request.loading && (\n
\n \n \n \n

Results

\n \n
\n {(() => {\n switch (getMax(predictions)[0]) {\n case \"cyborg\":\n return (\n \n \n \n \n \n

\n This account is most likely a cyborg\n

\n

Cyborgs include celebrities, news agencies and organizations.

\n \n
\n );\n\n case \"human\":\n return (\n \n \n \n \n \n

\n This account is most likely a human\n

\n

Genuine human accounts.

\n \n
\n );\n\n case \"political_bot\":\n return (\n \n \n \n \n \n

\n This account is a most likely political bot\n

\n

Political bots are a rather unique class, including accounts that have been used for political purposes.

\n \n
\n );\n\n case \"self_declared_bot\":\n return (\n \n \n \n \n \n

\n This account is most likely a self declared bot\n

\n

Self-declared bots refer to accounts that identify themselves as bots.

\n \n
\n );\n\n case \"social_bot\":\n return (\n \n \n \n \n \n

\n This account is most likely a social bot\n

\n

Social bots are related to impersonators, influence bots and paybots.

\n \n
\n );\n\n case \"spam_bot\":\n return (\n \n \n \n \n \n

\n This account is most likely a spam bot\n

\n

Spam bots encapsulate every type of bot that is related to continuously posting spam content.

\n \n
\n );\n\n default:\n return;\n\n }\n })()}\n
\n \n \n

Account similarity with different account types

\n \n
\n \n
\n\n \n \n \n Check user's profile\n \n }\n >\n \n \n \n \n \n \n \n Check this account's activity\n \n }\n >\n \n \n \n \n \n \n \n Help us get better\n \n }\n >\n \n \n Feedback\n \n \n \n \n Tweet results\n \n }\n >\n \n \n \n \n \n \n \n Export predictions as JSON\n \n }\n >\n \n \n \n \n \n \n \n
\n )}\n\n {predictions &&\n typeof predictions != \"string\" &&\n !reasons &&\n !request.loading && (\n \n
\n \n \n {\n e.preventDefault();\n await fetchFeatures();\n await fetchExplanations();\n scrollToDetailed();\n }}\n >\n \n \n \n \n
\n )}\n \n {reasons && typeof reasons == \"object\" && !request.loading && (\n \n \n \n

Detailed Analysis

\n \n
\n

Explanations

\n \n \n \n \n \n {explanationType === \"basic\" ? (\n
\n \n
\n ) : (\n
\n \n
\n \n
\n )}\n\n
\n )}\n
\n
\n
\n
\n );\n};\n\nexport default Home;\n","import React from \"react\";\n\nexport default function useWindowSize() {\n const isSSR = typeof window !== \"undefined\";\n const [windowSize, setWindowSize] = React.useState({\n width: isSSR ? 1200 : window.innerWidth,\n height: isSSR ? 800 : window.innerHeight,\n });\n\n function changeWindowSize() {\n setWindowSize({ width: window.innerWidth, height: window.innerHeight });\n }\n\n React.useEffect(() => {\n window.addEventListener(\"resize\", changeWindowSize);\n\n return () => {\n window.removeEventListener(\"resize\", changeWindowSize);\n };\n }, []);\n\n return windowSize;\n}","import React from 'react';\nimport './Header.css';\nimport Container from 'react-bootstrap/Container';\nimport { Row, Col } from 'react-bootstrap';\n\nconst header = (props) => {\n return (\n
\n <>\n
\n \n \n \n \n

{props.name}

\n \n
\n
\n
\n
\n \n
\n );\n}\n\n\nexport default header;","import React from 'react';\n// import '../App.css';\nimport Container from 'react-bootstrap/Container';\nimport { Alert } from 'react-bootstrap';\nimport Header from '../components/Header/Header';\nimport AppHeader from '../components/AppHeader/AppHeader';\nimport Footer from \"../components/Footer/Footer\";\n\nconst faq = () => {\n\treturn (\n\t\t
\n\t\t\n\t\t\t<>\n\t\t\t
\n\t\t\t
\n\t\t\t \n\t\t\t

Frequently Asked Questions

\n\t\t\t
    \n\t\t\t\t
  • What is a Twitter bot?
  • \n\t\t\t\t
  • What is Bot Detective?
  • \n\t\t\t\t
  • Who is behind Bot Detective and how can I contact them?
  • \n\t\t\t\t
  • Why do I have to login to Twitter and grant Bot Detective these permissions?
  • \n\t\t\t\t
  • How should I interpret a bot score?
  • \n\t\t\t\t
  • How do the justifications help me?
  • \n\t\t\t\t
  • How can I leave feedback?
  • \n\t\t\t\t
  • Why do the results change?
  • \n\t\t\t
\n\t\t\t
\n\t\t\t \n\t\t\t\t \n\t\t\t\t

What is a Twitter bot?

\n\t\t\t\t

According to Wikipedia a Twitter bot is a type of bot software that controls a Twitter account via the Twitter API. The bot software may autonomously perform actions such as tweeting, re-tweeting, liking, following, unfollowing, or direct messaging other accounts. The automation of Twitter accounts is governed by a set of automation rules that outline proper and improper uses of automation. Proper usage includes broadcasting helpful information, automatically generating interesting or creative content, and automatically replying to users via direct message. Improper usage includes circumventing API rate limits, violating user privacy, spamming, and sockpuppeting.

\n\t\t\t
\n\t\t\t \n\t\t\t\t \n\t\t\t\t

What is Bot Detective?

\n\t\t\t\t

Bot Detective is a Web service that was developed in the context of the thesis of Maria Kouvela, in fulfillment of the requirements for the degree of Master of Data & Web Science, under the supervision of PhD Candidate Ilias Dimitriadis and Professor Athena Vakali. Bot Detective takes into account both the efficient detection of bot users and the interpretability of the results as well. Our main contributions are summarized as follows:

\n\t\t\t\t

i. We propose a novel explainable bot-detection approach, which, to the best of authors’ knowledge, is the first one to offer interpretable, responsible, and AI driven bot identification in Twitter. Bot Detective uses a Random Forest classifier and follows an explainable AI state of the art method to provide justifications of high granularity, since explanations are offered for all relevant features that have contributed in the Bot Detective's scoring.

\n\t\t\t\t

ii. We provide a publicly available bot detection Web service which integrates an explainable machine learning framework along with users feedback functionality under an effective crowdsourcing mechanism. This service covers the growing demand for bot detection services and it offers extended crowdsourcing functionalities and XAI capabilities which advance existing state of the art tools, such as the Botometer.

\n\t\t\t\t

iii. We share a new labelled dataset, annotated by exploiting Twitter’s rules and existing tools, which we use to build the proposed service. The dataset consists of thousands of tweets collected using Twitter’s official API and labelled with the use of Botometer and by taking into account that many of the authors of the posting accounts were, at a later time, deactivated by Twitter.

\n\t\t\t\t

Although several AI driven bot detection methods have been implemented, the justification of bot classification and characterization remains quite opaque and AI decisions lack in ethical responsibility. Most of these approaches operate with AI black-boxed algorithms and their efficiency is often questionable.

\n\t\t\t
\n\t\t\t \n\t\t\t\t \n\t\t\t\t

Who is behind Bot Detective and how can I contact them?

\n\t\t\t\t

Bot Detective is an ongoing project of the Datalab at Aristotle University of Thessaloniki, Greece. datalab@csd.auth.gr
Team members: Maria Kouvela mvkouvela@csd.auth.gr, Ilias Dimitriadis idimitriad@csd.auth.gr, Athena Vakali avakali@csd.auth.gr

\n\t\t\t
\n\t\t\t \n\t\t\t\t \n\t\t\t\t

Why do I have to login to Twitter and grant Bot Detective these permissions?

\n\t\t\t\t

Every time you subject an account on Bot Detective, the server needs to make requests to the Twitter API in order to collect the necessary information and for the model to make the predictions requested. Getting information from the Twitter API requires some special tokens, which are available to logged in Twitter users only. By logging in and granting Bot Detective permissions to access public data you provide your account's tokens to use in our service. The API requests are read-only, they make no changes to your account. Your private tokens are never uploaded to our server and thus we have no way of using them after you leave the website.

\n\t\t\t
\n\t\t\t \n\t\t\t\t \n\t\t\t\t

How should I interpret a bot score?

\n\t\t\t\t

Bot Detective produces a score on a 0-5 scale, based on the likelihood of an account being a bot. Higher scores are more bot-like. A score in the middle of the scale means that our Machine Learning model is uncertain about the classification.

\n\t\t\t
\n\t\t\t \n\t\t\t\t \n\t\t\t\t

How do the justifications help me?

\n\t\t\t\t

Our service places emphasis on delivering explainable and comprehensive bot detection characterizations based on the principle that providing meaningful explanations is not just a matter of understanding or gaining user’s trust, but rather it is a matter of social responsibility, which is also imposed by EU laws as well. The goal of the explainability module is to convert the predictions of the classifier into justifications understandable by humans.

\n\t\t\t
\n\t\t\t \n\t\t\t\t \n\t\t\t\t

How can I leave feedback?

\n\t\t\t\t

Every time you subject a Twitter account on Bot Detective, a feedback button is presented on the screen along with Bot Detective's score and justification results. By providing us with feedback you help us improve our model. The information you provide is anonymous and no personal data is collected.

\n\t\t\t
\n\t\t\t \n\t\t\t\t \n\t\t\t\t

Why do the results change?

\n\t\t\t\t

Since the content and posting activity of accounts in Twitter change over time, the results that Bot Detective outputs will also change. The server that runs in the background collects the 20 most recent tweets' information of an inputted account every time, that then the Machine Learning model uses to make its predictions.

\n\t\t\t
\n\t\t\t
\n\t\t\t\n\t\t
\n\t\t
\n\t);\n}\n \n \nexport default faq;","import React from 'react';\nimport Container from 'react-bootstrap/Container';\nimport { Alert } from 'react-bootstrap';\nimport Header from '../components/Header/Header';\nimport AppHeader from '../components/AppHeader/AppHeader';\nimport Footer from '../components/Footer/Footer';\n\nconst publications = () => {\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t\t<>\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t \n\t\t\t\t\t

Bot-detective: An explainable Twitter bot detection service with crowdsourcing functionalities

\n\t\t\t\t\t

Maria Kouvela, Ilias Dimitriadis, Athena Vakali

\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t \n\t\t\t\t\t

TRIAGE: Temporal Twitter attribute graph patterns

\n\t\t\t\t\t

Ilias Dimitriadis, Marinos Poiitis, Christos Faloutsos, Athena Vakali

\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t \n\t\t\t\t\t

Social Botomics: A Systematic Ensemble ML Approach for Explainable and Multi-Class Bot Detection

\n\t\t\t\t\t

Ilias Dimitriadis, Konstantinos Georgiou, Athena Vakali

\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\n\t\t\t
\n\t\t
\n\t);\n}\n\nexport default publications;","import React from 'react';\nimport Container from 'react-bootstrap/Container';\nimport Button from 'react-bootstrap/Button';\nimport { Alert } from 'react-bootstrap';\nimport { FaEnvelope } from 'react-icons/fa';\nimport Header from '../components/Header/Header';\nimport AppHeader from '../components/AppHeader/AppHeader';\nimport Footer from \"../components/Footer/Footer\";\n\nconst datasets = () => {\n return (\n
\n \n <>\n
\n
\n \n

bot-detective-2020

\n

Description: Tweets and their authors annotated using Botometer.

\n \n
\n \n

social-botomics-2021

\n

Description: Twitter account IDs that refer to news agencies and companies, labelled as \"cyborgs\"

\n \n
\n
\n \n
\n
\n );\n}\n\n\nexport default datasets;","import React from 'react';\nimport useFetch from \"use-http\";\nimport ReCAPTCHA from \"react-google-recaptcha\"\n\nimport Header from '../components/Header/Header';\nimport AppHeader from '../components/AppHeader/AppHeader';\nimport Footer from \"../components/Footer/Footer\";\nimport { Container, Row, Col, Form, Button, Spinner, Modal } from \"react-bootstrap\";\n\nconst Multiple = () => {\n\tconst [request, response] = useFetch(process.env.REACT_APP_SERVER_URL, { \n timeout: 600000,\n cachePolicy: \"no-cache\"\n });\n\n\tconst reRef = React.useRef();\n\n const [show, setShow] = React.useState(false);\n\n const handleClose = () => setShow(false);\n\n const [email, setEmail] = React.useState(\"\");\n const [name, setName] = React.useState(\"\");\n const [file, setFile] = React.useState({});\n\n const [modalText, setModalText] = React.useState(\"\");\n\n const inputChangeHandler = (e) => {\n setEmail(e.target.value);\n }\n\n const nameChangeHandler = (e) => {\n setName(e.target.value);\n }\n\n const fileChangeHandler = (e) => {\n setFile(e.target.files[0]);\n }\n\n const submitHandler = async (e) => {\n e.preventDefault();\n\n const token = await reRef.current.executeAsync();\n\n const formData = new FormData();\n\n formData.append(\"email\", email);\n formData.append(\"name\", name);\n\t\tformData.append(\"file\", file);\n formData.append(\"token\", token);\n\n request.post(\"/predict_multiple\", formData).then(async respData => {\n if (response.ok) {\n await setModalText(`Thanks for using bot-detective, your analysis for ${respData.count} Twitter users will be sent to your e-mail (${email}) when ready. You can leave or close this page. This will take approximately ${Math.floor((respData.count * 10) / 60)} minutes`)\n await setShow(true)\n } else {\n if (response.status !== 400) {\n await setModalText(respData)\n await setShow(true) \n } else {\n await setModalText(\"You left some fields empty\")\n await setShow(true)\n }\n }\n }).catch(async () => {\n await setModalText(\"Something went wrong\")\n await setShow(true)\n });\n\n await setEmail(\"\")\n await setFile({})\n }\n\n if (request.loading) {\n\t\treturn (\n\t\t\t\n\t\t\t\t\n \t\t\t\t\tLoading...\n\t\t\t\t\n\t\t\t\n\t\t);\n\t}\n\n return (\n
\n \n\n \n {modalText}\n \n\n \n
\n \n \n \n \n

Bot-detective will analyze your accounts and notify you by e-mail when the results are ready.

\n \n
\n \n \n

Upload a text (.txt) file containing all the accounts you want to analyze seperated by comma (,)

\n
e.g. user1,user2,user3
\n For performance reasons bot-detective can analyze a maximum of 10 accounts, files with more than 10 fields won't be accepted\n \n \n \n \n
\n \n \n

Type in your full name:

\n \n \n \n

Type in your e-mail for receiving the results:

\n \n \n
\n \n \n \n \n \n \n
\n
\n
\n );\n}\n\nexport default Multiple;","const getFunction = (obj, path, defaultValue) => {\n\tconst result = String.prototype.split.call(path, /[,.[\\]]+?/)\n\t\t.filter(Boolean)\n\t\t.reduce((res, key) => ((res !== null && res !== undefined) ? res[key] : res), obj);\n\treturn (result === undefined || result === obj) ? defaultValue : result;\n};\n\nexport default getFunction;","/* eslint-disable react-hooks/exhaustive-deps */\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Container, Spinner, Row, Col } from \"react-bootstrap\";\nimport useFetch from \"use-http\";\nimport queryString from \"query-string\";\nimport localforage from \"localforage\";\nimport Header from \"../components/Header/Header\";\nimport AppHeader from '../components/AppHeader/AppHeader';\nimport Footer from \"../components/Footer/Footer\";\n\nimport Plotly from \"plotly.js/lib/core\";\nimport createPlotlyComponent from \"react-plotly.js/factory\";\n\nimport { useGlobalState } from \"../globalContext\";\nimport get from \"../get\";\n\nPlotly.register([require(\"plotly.js/lib/bar\")]);\n\nconst Plot = createPlotlyComponent(Plotly);\n\nconst Details = (props) => {\n\tconst { match: { params: { username } } } = props;\n\tconst [request, response] = useFetch(process.env.REACT_APP_SERVER_URL, { timeout: 600000 });\n\tconst [state, updateState] = useGlobalState();\n\n\tReact.useEffect(() => {\n\t\tlet didCancel = false;\n\t\tlocalforage.getItem(\"user_info\").then((info) => {\n\t\t\tif (!didCancel) updateState({ type: \"changeUserInfo\", userInfo: info });\n\t\t});\n\t\treturn () => didCancel = true;\n\t}, []);\n\n\tReact.useEffect(() => {\n\t\tif (state.userInfo && !response.data) request.get(`/details/${username.startsWith(\"@\") ? username.slice(1) : username}?${queryString.stringify(state.userInfo)}`);\n\t}, [state.userInfo, username]);\n\n\tif (request.loading) {\n\t\treturn (\n\t\t\t\n\t\t\t\t\n \t\t\t\t\tLoading...\n\t\t\t\t\n\t\t\t\n\t\t);\n\t}\n\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t<>\n\t\t\t
\n\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t

{`@${username}`}

\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{get(response.data, \"screen_name\") && (\n\t\t\t\t\t\t\t\t
Screen name: {get(response.data, \"screen_name\")}
\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{get(response.data, \"display_name\") && (\n\t\t\t\t\t\t\t\t
Display name: {get(response.data, \"display_name\")}
\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{get(response.data, \"twitter_user_id\") && (\n\t\t\t\t\t\t\t\t
Twitter user ID: {get(response.data, \"twitter_user_id\")}
\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{get(response.data, \"location\") && (\n\t\t\t\t\t\t\t\t
Location: {get(response.data, \"location\")}
\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{get(response.data, \"url\") && (\n\t\t\t\t\t\t\t\t
URL: {get(response.data, \"url\")}
\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{get(response.data, \"date_joined\") && (\n\t\t\t\t\t\t\t\t
Date joined: {get(response.data, \"date_joined\")}
\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{get(response.data, \"most_recent_post\") && (\n\t\t\t\t\t\t\t\t
Most recent post: {get(response.data, \"most_recent_post\")}
\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{get(response.data, \"tweets\") && (\n\t\t\t\t\t\t\t\t
Tweets: {get(response.data, \"tweets\")}
\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
Following: {get(response.data, \"following\")}
\n\t\t\t\t\t\t\t
Followers: {get(response.data, \"followers\")}
\n\t\t\t\t\t\t\t
Likes: {get(response.data, \"likes\")}
\n\t\t\t\t\t\t\t
Lists: {get(response.data, \"lists\")}
\n\t\t\t\t\t\t\t
Tweet language: {get(response.data, \"tweet_language\")}
\n\t\t\t\t\t\t\t
Tweets this week: {get(response.data, \"tweets_this_week\")}
\n\t\t\t\t\t\t\t
Retweet ratio: {`${get(response.data, \"retweet_ratio\", 0)}%`}
\n\t\t\t\t\t\t\n\t\t\t\t\t\t{get(response.data, \"description\") && (\n\t\t\t\t\t\t\t
Description:

{get(response.data, \"description\")}

\n\t\t\t\t\t\t)}\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t

Tweets by day of week

\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t

Tweets by hour of day

\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t\t\n\t\t
\n\t\t
\n\t);\n};\n\nDetails.propTypes = { match: PropTypes.object.isRequired };\nexport default Details;\n","import React from \"react\";\nimport { Switch, Route } from \"react-router-dom\";\n\nimport Auth from \"./services/Auth\";\nimport { Home, Faq, Publications, Datasets, Details, Multiple } from \"./views\";\n\nfunction App() {\t\n\treturn (\n\t\t<>\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n\twindow.location.hostname === \"localhost\"\n // [::1] is the IPv6 localhost address.\n || window.location.hostname === \"[::1]\"\n // 127.0.0.0/8 are considered localhost for IPv4.\n || window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/),\n);\n\nexport function register(config) {\n\tif (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\n\t\t// The URL constructor is available in all browsers that support SW.\n\t\tconst publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n\t\tif (publicUrl.origin !== window.location.origin) {\n\t\t\t// Our service worker won't work if PUBLIC_URL is on a different origin\n\t\t\t// from what our page is served on. This might happen if a CDN is used to\n\t\t\t// serve assets; see https://github.com/facebook/create-react-app/issues/2374\n\t\t\treturn;\n\t\t}\n\n\t\twindow.addEventListener(\"load\", () => {\n\t\t\tconst swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n\t\t\tif (isLocalhost) {\n\t\t\t\t// This is running on localhost. Let's check if a service worker still exists or not.\n\t\t\t\tcheckValidServiceWorker(swUrl, config);\n\n\t\t\t\t// Add some additional logging to localhost, pointing developers to the\n\t\t\t\t// service worker/PWA documentation.\n\t\t\t\tnavigator.serviceWorker.ready.then(() => {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\"This web app is being served cache-first by a service \"\n + \"worker. To learn more, visit https://bit.ly/CRA-PWA\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Is not localhost. Just register service worker\n\t\t\t\tregisterValidSW(swUrl, config);\n\t\t\t}\n\t\t});\n\t}\n}\n\nfunction registerValidSW(swUrl, config) {\n\tnavigator.serviceWorker\n\t\t.register(swUrl)\n\t\t.then((registration) => {\n\t\t\tregistration.onupdatefound = () => {\n\t\t\t\tconst installingWorker = registration.installing;\n\t\t\t\tif (installingWorker == null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tinstallingWorker.onstatechange = () => {\n\t\t\t\t\tif (installingWorker.state === \"installed\") {\n\t\t\t\t\t\tif (navigator.serviceWorker.controller) {\n\t\t\t\t\t\t\t// At this point, the updated precached content has been fetched,\n\t\t\t\t\t\t\t// but the previous service worker will still serve the older\n\t\t\t\t\t\t\t// content until all client tabs are closed.\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\"New content is available and will be used when all \"\n + \"tabs for this page are closed. See https://bit.ly/CRA-PWA.\",\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t// Execute callback\n\t\t\t\t\t\t\tif (config && config.onUpdate) {\n\t\t\t\t\t\t\t\tconfig.onUpdate(registration);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// At this point, everything has been precached.\n\t\t\t\t\t\t\t// It's the perfect time to display a\n\t\t\t\t\t\t\t// \"Content is cached for offline use.\" message.\n\t\t\t\t\t\t\tconsole.log(\"Content is cached for offline use.\");\n\n\t\t\t\t\t\t\t// Execute callback\n\t\t\t\t\t\t\tif (config && config.onSuccess) {\n\t\t\t\t\t\t\t\tconfig.onSuccess(registration);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\t\t})\n\t\t.catch((error) => {\n\t\t\tconsole.error(\"Error during service worker registration:\", error);\n\t\t});\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n\t// Check if the service worker can be found. If it can't reload the page.\n\tfetch(swUrl, {\n\t\theaders: { \"Service-Worker\": \"script\" },\n\t})\n\t\t.then((response) => {\n\t\t\t// Ensure service worker exists, and that we really are getting a JS file.\n\t\t\tconst contentType = response.headers.get(\"content-type\");\n\t\t\tif (\n\t\t\t\tresponse.status === 404\n || (contentType != null && contentType.indexOf(\"javascript\") === -1)\n\t\t\t) {\n\t\t\t\t// No service worker found. Probably a different app. Reload the page.\n\t\t\t\tnavigator.serviceWorker.ready.then((registration) => {\n\t\t\t\t\tregistration.unregister().then(() => {\n\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Service worker found. Proceed as normal.\n\t\t\t\tregisterValidSW(swUrl, config);\n\t\t\t}\n\t\t})\n\t\t.catch(() => {\n\t\t\tconsole.log(\n\t\t\t\t\"No internet connection found. App is running in offline mode.\",\n\t\t\t);\n\t\t});\n}\n\nexport function unregister() {\n\tif (\"serviceWorker\" in navigator) {\n\t\tnavigator.serviceWorker.ready.then((registration) => {\n\t\t\tregistration.unregister();\n\t\t});\n\t}\n}\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { BrowserRouter as Router } from \"react-router-dom\";\nimport isEqual from \"react-fast-compare\";\n\nimport App from \"./App\";\nimport * as serviceWorker from \"./serviceWorker\";\nimport { StateProvider } from \"./globalContext\";\nimport \"../node_modules/bootstrap/dist/css/bootstrap.min.css\";\n\nconst initialState = { userInfo: null };\nconst reducer = (state, action) => {\n\tif (action.type === \"changeUserInfo\") {\n\t\tconst { userInfo } = action;\n\t\tif (isEqual(state.userInfo, userInfo)) return state;\n\t\treturn { ...state, userInfo };\n\t}\n\treturn state;\n};\n\nReactDOM.render(\n\t\n\t\t\n\t\t\t\n\t\t\n\t,\n\tdocument.getElementById(\"root\"),\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}