From 6bf9a5a5c2ab6d16adb8bb9e434a201f1ae878fd Mon Sep 17 00:00:00 2001 From: egeres Date: Fri, 22 Mar 2019 13:38:55 +0100 Subject: [PATCH] Extended the project documentation and cleaned the project. --- README.md | 21 ++++- js/graph.js | 2 +- new_index.html | 86 ------------------ {css => old files/css}/style.css | 0 data.csv => old files/data.csv | 0 data.json => old files/data.json | 0 data_0.json => old files/data_0.json | 0 data_1.json => old files/data_1.json | 0 .../data_generator.py | 0 data_old.csv => old files/data_old.csv | 0 date.py => old files/date.py | 0 generator.py => old files/generator.py | 0 index.html => old files/index.html | 0 old files/new_index.html | 16 ++++ others/screenshot_0.png | Bin 0 -> 18226 bytes test_multifiles/generator_files.py | 2 +- 16 files changed, 36 insertions(+), 91 deletions(-) delete mode 100644 new_index.html rename {css => old files/css}/style.css (100%) rename data.csv => old files/data.csv (100%) rename data.json => old files/data.json (100%) rename data_0.json => old files/data_0.json (100%) rename data_1.json => old files/data_1.json (100%) rename data_generator.py => old files/data_generator.py (100%) rename data_old.csv => old files/data_old.csv (100%) rename date.py => old files/date.py (100%) rename generator.py => old files/generator.py (100%) rename index.html => old files/index.html (100%) create mode 100644 old files/new_index.html create mode 100644 others/screenshot_0.png diff --git a/README.md b/README.md index 7ace2b9..737cbe0 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,22 @@ # simple-chat-graph -Something to see the people you speak with colors and visual stuff +Small web application to display a graph with the message intensity of telegram chats. +![](https://github.com/egeres/asiic/blob/master/simple-chat-graph/screenshot_0.png) -https://github.com/vysheng/tg/blob/master/README-Cygwin.md is needed +## How to use : -or https://github.com/pigpagnet/save-telegram-chat-history +### Step 0 : Export your Telegram chats to a JSON file. +Install the Telegram desktop app. Navigate to Settings > Advanced, then click "Export Telegram data". Disable all the options except for "Personal chats". At the bottom, select "Machine-readable JSON". You can change the download path to set the destination folder of the exported information. Whe you are ready, click "EXPORT" at the bottom. The process might take a few minutes to complete. Once it has finished, you will see a folder named "DataExport_" in the selected directory. + +### Step 1 : Generate your chat files +You must have Python installed to complete the next step (any version greater than 2.7). Execute the generator_files.py script as shown : + +``` +cd repository_directory/test_multifiles +python generator_files.py ..DataExport_/result.json repository_directory/test_multifiles/files +``` + +This will generate a list of .json files at repository_directory/test_multifiles/files. + +### Step 2 : Update the test_multifiles.html file. +Change the value of the variable filenames by the output of the python script : list_of_exported_files = [...] diff --git a/js/graph.js b/js/graph.js index 40e0e69..db0abdd 100644 --- a/js/graph.js +++ b/js/graph.js @@ -49,7 +49,7 @@ var response = $.getJSON( "data_1.json", function(obtained_data) { .always(function() { console.log( "complete" ); }); -console.log(data); +// console.log(data); function getBaseLog(x, y) { return Math.log(y) / Math.log(x); diff --git a/new_index.html b/new_index.html deleted file mode 100644 index 8f44d34..0000000 --- a/new_index.html +++ /dev/null @@ -1,86 +0,0 @@ - -
- - - Chats - - - - - - - - - - - - - - -
- - -
- - - - - - - - - - - diff --git a/css/style.css b/old files/css/style.css similarity index 100% rename from css/style.css rename to old files/css/style.css diff --git a/data.csv b/old files/data.csv similarity index 100% rename from data.csv rename to old files/data.csv diff --git a/data.json b/old files/data.json similarity index 100% rename from data.json rename to old files/data.json diff --git a/data_0.json b/old files/data_0.json similarity index 100% rename from data_0.json rename to old files/data_0.json diff --git a/data_1.json b/old files/data_1.json similarity index 100% rename from data_1.json rename to old files/data_1.json diff --git a/data_generator.py b/old files/data_generator.py similarity index 100% rename from data_generator.py rename to old files/data_generator.py diff --git a/data_old.csv b/old files/data_old.csv similarity index 100% rename from data_old.csv rename to old files/data_old.csv diff --git a/date.py b/old files/date.py similarity index 100% rename from date.py rename to old files/date.py diff --git a/generator.py b/old files/generator.py similarity index 100% rename from generator.py rename to old files/generator.py diff --git a/index.html b/old files/index.html similarity index 100% rename from index.html rename to old files/index.html diff --git a/old files/new_index.html b/old files/new_index.html new file mode 100644 index 0000000..61dd658 --- /dev/null +++ b/old files/new_index.html @@ -0,0 +1,16 @@ + + +
+ + Chats + + + + + +
+ +
+ + + diff --git a/others/screenshot_0.png b/others/screenshot_0.png new file mode 100644 index 0000000000000000000000000000000000000000..2c9de32b03cb31a83c324ca650b5f6a4ea7a26ba GIT binary patch literal 18226 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

hCQiL$HzBK|KM6j4w$l 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