From 650e18b3e4c96f97d58e334bc011fc256ad709c2 Mon Sep 17 00:00:00 2001 From: susravan Date: Thu, 7 Sep 2017 15:31:17 -0700 Subject: [PATCH] Removed time_spent logging as it is little buggy. Other cosmetic changes, added README.txt file --- Page-tracking-extension/content.js | 72 ++++++------ Page-tracking-extension/popup.html | 2 +- Page-tracking-extension/popup.js | 4 +- README.txt | 43 +++++++ UserTracking.db | Bin 20480 -> 28672 bytes app.py | 2 +- app.pyc | Bin 4456 -> 0 bytes models.pyc | Bin 3041 -> 0 bytes requirements.txt | 173 +++++++++++++++++++++++++++++ templates/index.html | 13 ++- 10 files changed, 268 insertions(+), 41 deletions(-) create mode 100644 README.txt delete mode 100644 app.pyc delete mode 100644 models.pyc create mode 100644 requirements.txt diff --git a/Page-tracking-extension/content.js b/Page-tracking-extension/content.js index e1ba5a4..0d513c9 100644 --- a/Page-tracking-extension/content.js +++ b/Page-tracking-extension/content.js @@ -1,40 +1,40 @@ -// Logging time spent on a page -$(document).ready(function() { - var user_id = "dummy"; - - var start; - var end; - var time_spent; - - // $(window).on('focus', function() { - start = Date.now(); - // }); - console.log("start = ", start) - - $(window).on('blur', function() { - end = Date.now(); - console.log("end = ", end); - time_spent = (end - start)/1000; - console.log("time_spent = ", time_spent); - - var evtData = { - "userId": user_id, - "evt_type": "Time Spent", - "pageHTML": document.URL, - "object_id": 0, - "evt_datetime": time_spent, - "evt_timestamp": Date.now() - }; - console.log(evtData); - - - // Sending data to background.js - chrome.runtime.sendMessage({'evtData': evtData, 'quesData': null}, function(response) { - // console.log(response.BgResponse); - }); - }); -}); +// // Logging time spent on a page +// $(document).ready(function() { +// var user_id = "dummy"; + +// var start; +// var end; +// var time_spent; + +// $(window).on('focus', function() { +// start = Date.now(); +// }); +// console.log("start = ", start) + +// $(window).on('blur', function() { +// end = Date.now(); +// console.log("end = ", end); +// time_spent = (end - start)/1000; +// console.log("time_spent = ", time_spent); + +// var evtData = { +// "userId": user_id, +// "evt_type": "Time Spent", +// "pageHTML": document.URL, +// "object_id": 0, +// "evt_datetime": time_spent, +// "evt_timestamp": Date.now() +// }; +// console.log(evtData); + + +// // Sending data to background.js +// chrome.runtime.sendMessage({'evtData': evtData, 'quesData': null}, function(response) { +// // console.log(response.BgResponse); +// }); +// }); +// }); diff --git a/Page-tracking-extension/popup.html b/Page-tracking-extension/popup.html index 9e79d5a..940959c 100644 --- a/Page-tracking-extension/popup.html +++ b/Page-tracking-extension/popup.html @@ -7,6 +7,6 @@

Behavioral Logging

- + \ No newline at end of file diff --git a/Page-tracking-extension/popup.js b/Page-tracking-extension/popup.js index 56ecd85..ebb01a5 100644 --- a/Page-tracking-extension/popup.js +++ b/Page-tracking-extension/popup.js @@ -1,7 +1,9 @@ document.addEventListener('DOMContentLoaded', function() { var checkPageButton = $('#checkPage'); checkPageButton.on('click', function() { - console.log("Cliked on checkPage"); + // console.log("Cliked on checkPage"); + window.open('https://localhost:5000', '_blank'); + win.focus(); }); }, false); \ No newline at end of file diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..fc45321 --- /dev/null +++ b/README.txt @@ -0,0 +1,43 @@ +Implementation Details: +The assignment is implemented using flask (python 2.7) and sqlite3 for backend and javascript, jquery for frontend +Folder structure: Main folder contains following folders. + Page-tracking-extension - contains all the browser extension files + static - css and jquery files + templates - html pages + +Setup Details: +Since the project is implemented in sqlite3 without ORM, it doesn't need any standalone database installation. However some python packages are required which are mentioned in requirements.txt in main project folder. +"requirements.txt" is formed using "pip freeze > " which lists out all the packages used in the project. To install all these packages, simply run "pip install -r requirements.txt" from project folder + +Database is present in UserTracking.db which four tables. + UserActions - Main table to store user actions to access them in profile page + UserDetails - LogIn and password details pf the user - Already contains 3 users + UserHistory - Stores the login history of the user + ObjectDetails - Contains question and answer details taken from the page + +Install browser extension: +1) Open Chrome and go to "chrome://extensions" +2) Make sure "Developer Mode" checkbox is checked +3) Click "Load unpacked extension" and select the Page-tracking-extension folder in the project directory +4) Make sure it is "Enabled" +This will install the browser extension. + +How to run the application: +1) Open terminal from project folder +2) Install dependencies - "pip install -r requirements.txt" +3) Run "python app.py" - this starts the server +4) Open browser and access "https://localhost:5000" + --- OR --- + Click on "Go to HomePage" button in the popup of chrome extension + +Features Implemented: +1) Login page shows a form to take login and password data, shows previous login history +2) Once logged in, app redirects to profile page where you can see the description of the actions being tracked and the user's behavioral logging data +3) At each screen, you have an option to add new user by clicking on "Add User" which redirects to another page to take new userid and new password as input +4) The application already consists of three users - "aaa", "bbb" and "ccc", all with password - "123" +5) Six actions are begin tracked by the application and it's details can be see in profile page once logged in + +Note: +1) The web application is using a https server +2) Starting page for the application would be /login.html +3) Local URL - https://localhost:5000 diff --git a/UserTracking.db b/UserTracking.db index 4cd4fcbb829a29570aa65eac0ff5ae78f396cac9..efa735a12f7acb3454ccfa66e61d29b19a4d653f 100644 GIT binary patch literal 28672 zcmeI4Pi)&%7{Fu4Nt~pK+htoQW2>u@cGc#^c9Nwr5+bllo7i90O)yY~o4BplHqK%v z-O7;WO@cBwAa>v|IB?hr4uf$(2#G%$f@v2x?SK#`goK0y5|dyP6Yn{3mvm@Ky44NR zXEn)7{QADnzwi5=pP&7`g9mo2hQdy0a0>1X3QQmh2X=RRCbQ-*4s9^W@YqI<}eSk%x}tYX-?#YG%F;fgd`@3TyE&iYo>P-9qqfL#SU$* zco^B&IYkm!k=IU{)J8hG;f^AQO3tbwU^UK~CiO^@8i!RKO$a$gL&#t?UOIDX105YU z2k5$QWc6vKz#gc3Kr23y5)vZ`F+QcuaRrT2IpjelzkKIPGiaCib?j;k(w9e^Z7Oe-+xSqQWE>X;4f=T@}bpJ zB7to%_`~V>C>^PJ00QBN{Y5E(V{!1RR9R0)dM*1S*{%0W%QHR_YjOW_%B0rOky>Ab zhDn9&t^jGX(p|yl=0}aEBcw(OtMS>N zCeejG5s%T38m;$)55h1a_R82NkIx6~Ktw7yaw0&-k2`_b2UIoC5D{&R$Xf1v;?3Nx z;ZN-1xr)CgcZ)}sWd|Y=pMYX78fK8TV*trrofzPylx6trC6n;k&WE&d()oBPiAN!^ zxLozx4&a0#kX$SNhrco@j~)L=@Jh%3lB*-62JV?-L+j@$JNA$kj>I04Z8>94(j?vX zS)o1l_uu*Ok~IpAc`sDS2K%o>2hemKfaF^Cr+TVHgWMJG0Fd16`1ZZG58s<#>;Bor z6vNlTnb3uLo9{jEZSV7*tDZq>0ab(z2mpcq7Xg!98`wyh z8NZ)MJ#9~_;3=||xwgZzZreFQ+lFTEa@BF`qhY#E&zTz{ zfyknY@oa}_$FAvkfJ{$dquU%H33n=O+ZatdwPNBHN3Y~{H1qzo$nzPFN5)OEVnPzq z5}!VTXV!AHnYNsAydux2#>t$?c6U59mg#sE1K~hq(XR3ADw{Oa@w}L>PK$#;u!Ahf z1Ud~5>+g7f00e*l5C8%|00`WhK);8IWGM9b0)FtE z!#7IOEH6rYLP})V{d=DK@Z&856ct5P@DuQNRTB7GrEtF+w}T#lTv7$yN~^VV`I~+c zS3!?R-Bm?MS*={Y&`f00e+Q#}f!q?r7AST(I8!Zg(VtrV#`&;U`fMO&8!Ifr@C70u}M~e;-QVXBL?5 z@avHO@4!L?INJ&G|Le;#K>k1E|D$+-{C~**hy4HAng^{XzP6aRv1IWPQG)z`$p3H7 zLx=o-oc|2@|EsX_3*`UjVvzqIgZ%&csz>dueXzVCfR+EB%RPGg3w-@gFeMlIgAE7( y0U!VbfB+Bx0zd!=00AHX1b_e#ct8Zq5KBjEYb{$h=vQaWO|%@owf^`!FZ>G@KyzdO literal 20480 zcmeI2OKclO7{|SS#Ors8Y10Q4YgeTWWbECw9otJwaY>XG+Jultp{f#1?2WyR<8^n} zb}b>$aDiSB7aj+=qnMd2rGcSy0rboHy%;96BT+4y|72N)4j+-8Rae9a=LtU?_T4Qri zu{p_k(T-auKBDM`s@2K=n^pU5CvF~SKXFmbE2R-=z-eV!ZgyrYPZ@Bz%pDz{9z+SN zb70>-=CwhyuZe}za@J^GM%#w1t-rQI`&IK_^G3bA(nWKRk|Ujv%gf70rjH+M3aF}v ztT&Fpl3tUw=0;VKYt3p_lc6Ec=kS-&q8#RR^BjX{E7M?f<`$z&)=<=v3BOsjwrM8t zng`k$$yK9OdxzMLOCgOrRkiRW_vSm9E0#dTf5SiTyW%_Iz3I(+E_)8UKXmVLonvpZ zIp>eg@xF_FamRVbko|qT%T~AkYCVbnM9T&xfS8?ZFoY)90Y^5QHA88tESHReVU%?# z8r2P$T~e#Ewpdhak*vBLJyVf&(;cH?ES87~$yl^f!dW4sQo=4>tb^q`ESEt6>HtS} zxh&^EL9Kx-ECB`RYOyKyH@1PlxJ~F-vd3l6Ep34#01gv=v&A)(4uEn(Qz8? z{^@z-2h_if4GvsA#Znh3Y0zu?^2l=*c2t-00>xumN{mT!Npc-Sh zIu;fdx(q5I6-&jVwE{GNq5}v@m1421DkVeKTcXyo2Gaql_Wj{;J0YNy}|H^rr~C< zBEPG}le!4BwXwO~lSH!c0^?tzE$oH~H<64+VDu~GcWw|!rav9HKHldHhL(D9X{awn zVXmrVGeg!J%J9$^F0Axyuqb;s3<%_CfDw-hgM({e^pnYdbrD570shPy&j~P?gq5)+kUSa9FgTgFnj5h-Wl))Ge%qN(asDz6_&5+#oEVc52}y{b zJPoUG?trqK=X5Q5FdU645i^e)!MiG&nZ-4p(?=E}Kd?$<3ixJf7YEU3)VR_&@=0Ki~jD zE_cv|#)$W4u=C@!?5cdf*HydavUl6*sL1mvAn-VU&j~R}NJ)IU;rDmSm(HQbSoiK* z8k(K>sd`H z8*@<8U|pYUB=xZA9h*g{eX|I)Z4#j&>%AYD9`AN!V(wGGcPZ3-H$Pxl0zU;l54?*j zv`_++03|>PPy&m@o)spez@yp6Fi5Ixc@s~c1 z?GD*U6a3zEM-x%vhs`G9^^lb`!EZfwG!dj&ywT+A5Oc?l$m9P;N8&uW|F;FMS^|Fs ze#1YsPy& " + info[1] + " --> " + info[2] posts.append(post) - return render_template("index.html", posts=posts) + return render_template("index.html", posts=posts, userId=username) # By default, flask assumes GET method diff --git a/app.pyc b/app.pyc deleted file mode 100644 index de3f70586177b972447c51ca3c4013e33dd8be7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4456 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 LqHWjK+H37^82NeE diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a858534 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,173 @@ +alabaster==0.7.10 +anaconda-client==1.6.3 +anaconda-navigator==1.6.2 +anaconda-project==0.6.0 +asn1crypto==0.22.0 +astroid==1.4.9 +astropy==1.3.2 +Babel==2.4.0 +backports-abc==0.5 +backports.shutil-get-terminal-size==1.0.0 +backports.ssl-match-hostname==3.4.0.2 +beautifulsoup4==4.6.0 +bitarray==0.8.1 +blaze==0.10.1 +bleach==1.5.0 +bokeh==0.12.5 +boto==2.46.1 +Bottleneck==1.2.1 +cdecimal==2.3 +cffi==1.10.0 +chardet==3.0.3 +click==6.7 +cloudpickle==0.2.2 +clyent==1.2.2 +colorama==0.3.9 +conda==4.3.21 +configparser==3.5.0 +contextlib2==0.5.5 +cryptography==1.8.1 +cycler==0.10.0 +Cython==0.25.2 +cytoolz==0.8.2 +dask==0.14.3 +datashape==0.5.4 +decorator==4.0.11 +distributed==1.16.3 +docutils==0.13.1 +entrypoints==0.2.2 +enum34==1.1.6 +et-xmlfile==1.0.1 +fastcache==1.0.2 +Flask==0.12.2 +Flask-Cors==3.0.3 +Flask-Login==0.4.0 +Flask-SQLAlchemy==2.2 +funcsigs==1.0.2 +functools32==3.2.3.post2 +futures==3.1.1 +gevent==1.2.1 +greenlet==0.4.12 +grin==1.2.1 +gunicorn==19.7.1 +h5py==2.7.0 +HeapDict==1.0.0 +html5lib==0.999 +idna==2.5 +imagesize==0.7.1 +ipaddress==1.0.18 +ipykernel==4.6.1 +ipython==5.3.0 +ipython-genutils==0.2.0 +ipywidgets==6.0.0 +isort==4.2.5 +itsdangerous==0.24 +jdcal==1.3 +jedi==0.10.2 +Jinja2==2.9.6 +jsonschema==2.6.0 +jupyter==1.0.0 +jupyter-client==5.0.1 +jupyter-console==5.1.0 +jupyter-core==4.3.0 +lazy-object-proxy==1.2.2 +llvmlite==0.18.0 +locket==0.2.0 +lxml==3.7.3 +MarkupSafe==1.0 +matplotlib==2.0.2 +mistune==0.7.4 +mpmath==0.19 +msgpack-python==0.4.8 +multipledispatch==0.4.9 +navigator-updater==0.1.0 +nbconvert==5.1.1 +nbformat==4.3.0 +networkx==1.11 +nltk==3.2.3 +nose==1.3.7 +notebook==5.0.0 +numba==0.33.0+0.ge79330a.dirty +numexpr==2.6.2 +numpy==1.12.1 +numpydoc==0.6.0 +odo==0.5.0 +olefile==0.44 +openpyxl==2.4.7 +packaging==16.8 +pandas==0.20.1 +pandocfilters==1.4.1 +partd==0.3.8 +pathlib2==2.2.1 +patsy==0.4.1 +pbr==3.1.1 +pep8==1.7.0 +pexpect==4.2.1 +pickleshare==0.7.4 +Pillow==4.1.1 +ply==3.10 +prompt-toolkit==1.0.14 +psutil==5.2.2 +ptyprocess==0.5.1 +py==1.4.33 +pycairo==1.10.0 +pycosat==0.6.2 +pycparser==2.17 +pycrypto==2.6.1 +pycurl==7.43.0 +pyflakes==1.5.0 +Pygments==2.2.0 +pylint==1.6.4 +pyodbc==4.0.16 +pyOpenSSL==17.0.0 +pyparsing==2.1.4 +pytest==3.0.7 +python-dateutil==2.6.0 +pytz==2017.2 +PyWavelets==0.5.2 +PyYAML==3.12 +pyzmq==16.0.2 +QtAwesome==0.4.4 +qtconsole==4.3.0 +QtPy==1.2.1 +requests==2.14.2 +rope==0.9.4 +scandir==1.5 +scikit-image==0.13.0 +scikit-learn==0.18.1 +scipy==0.19.0 +seaborn==0.7.1 +simplegeneric==0.8.1 +simplejson==3.11.1 +singledispatch==3.4.0.3 +six==1.10.0 +snowballstemmer==1.2.1 +sortedcollections==0.5.3 +sortedcontainers==1.5.7 +Sphinx==1.5.6 +spyder==3.1.4 +SQLAlchemy==1.1.9 +statsmodels==0.8.0 +stevedore==1.25.0 +subprocess32==3.2.7 +sympy==1.0 +tables==3.3.0 +tblib==1.3.2 +terminado==0.6 +testpath==0.3 +toolz==0.8.2 +tornado==4.5.1 +traitlets==4.3.2 +unicodecsv==0.14.1 +update==0.4.4 +virtualenv==15.1.0 +virtualenv-clone==0.2.6 +virtualenvwrapper==4.7.2 +wcwidth==0.1.7 +Werkzeug==0.12.2 +widgetsnbextension==2.0.0 +wrapt==1.10.10 +xlrd==1.0.0 +XlsxWriter==0.9.6 +xlwt==1.2.0 +zict==0.1.2 diff --git a/templates/index.html b/templates/index.html index e03431f..d3963c2 100644 --- a/templates/index.html +++ b/templates/index.html @@ -2,13 +2,22 @@ {% block content %}

- StackOverflow link - + --> StackOverflow link - stackoverflow tag=java

+

Following actions are tracked in the current application.
+ 1) Visited - Tracks all the user visited question pages. This gives us the idea on the type of questions user interested in. From the votes, number of answers of the visited question gives us the insight into the taste of user
+ 2) Upvoted/ Downvoted - Can also be used for user's reading preferences on length of material, language and complexity level. Since this is explicit, chances of data being high accuracy
+ 3) Shared - User's high interest areas/ topics can be discovered by his sharing history
+ 4) Asked Question - Helps to find the "current focus area" of the user and also the area in which he hopes to improve
+ 5) Posted Answer - Can be used to find out the level of expertise of user on different topics based on his answer + s popularity
+ +

-

Your activity History

+
Hello {{ userId }}, below is your activity recently
Add User