🤬
Revision indexing in progress... (symbol navigation in revisions will be accurate after indexed)
  • ■ ■ ■ ■ ■ ■
    CHANGES.txt
     1 +v2.2.51/58 21.10.2022 -- Building upon the major update, a few errors have been fixed,
     2 + installation has been improved and stablized, and several
     3 + new features have been added, including:
     4 + - Added "has media" column to archive files.
     5 + - Added post URL to archive file.
     6 + - Additional investigation resources added to the README.
     7 + - Maximise edgelist compatability with Gephi.
     8 + - Additional support for multiple location lookups at once.
     9 + 
    1 10  v2.2.50 16.10.2022 -- Major update! Code refactoring, reply retrieval,
    2 11   translated descriptions, speedier decryption of media, support for
    3 12   analyzing private groups, bug fixes and much more!
    skipped 37 lines
  • ■ ■ ■ ■ ■ ■
    README.md
    1 1   
    2 2   
    3  -Telepathy: An OSINT toolkit for investigating Telegram chats. Developed by Jordan Wildon. Version 2.2.50.
     3 +Telepathy: An OSINT toolkit for investigating Telegram chats. Developed by Jordan Wildon. Version 2.2.58.
    4 4   
    5 5   
    6 6  ## Installation
    skipped 16 lines
    23 23   
    24 24  On first use, Telepathy will ask for your Telegram API details (obtained from my.telegram.org). Once those are set up, it will prompt you to enter your phone number again and then send an authorization code to your Telegram account. If you have two-factor authentication enabled, you'll be asked to input your Telegram password.
    25 25   
    26  -OPTIONAL: Installing cryptg ($ pip3 install cryptg) may improve Telepathy's speed. The package hands decryption by Python over to C, making media downloads in particular quicker and more efficient.
     26 +OPTIONAL: Installing cryptg ($ pip3 install cryptg) may improve Telepathy's speed. The package hand decryption by Python over to C, making media downloads in particular quicker and more efficient.
    27 27   
    28 28   
    29 29  ## Usage:
    skipped 68 lines
    98 98  $ telepathy -t 51.5032973,-0.1217424 -l
    99 99  ```
    100 100   
     101 + 
    101 102  - **'--alt', '-a'**
    102 103   
    103  -Flag for running Telepathy from an alternative number. You can use the same API key and Hash but authenticate with a different phone number. Allows for running multiple scans at once.
     104 +Flag for running Telepathy from an alternative number. You can use the same API key and Hash but authenticate with a different phone number. Allows for running multiple scans at the same time.
    104 105   
    105 106  ```
    106 107  $ telepathy -t Durov -c -a
    107 108  ```
     109 + 
    108 110   
    109 111  - **'--export', '-e'**
    110 112   
    skipped 3 lines
    114 116  $ telepathy -e
    115 117  ```
    116 118  
     119 + 
    117 120  - **'--reply', '-r'**
    118 121   
    119 122  Flag for enable the reply in the channel, it will map users who replied in the channel and it will dump the full conversation chain
    skipped 3 lines
    123 126  ```
    124 127   
    125 128   
     129 +## Bonus investigations tips:
     130 + 
     131 + - Navigating to a media archive directory and running Exiftool may give you a whole host of useful information for further investigation. Telegram doesn't currently scrub metadata from PDF, DOCX, XLSX, MP4, MOV and some other filetypes, which offer creation and edit time metadata, often timezones, sometimes authors, and general technical information about the perosn or people who created a media file.
     132 + ```
     133 +$ cd ./telepathy/telepathy_files/CHATNAME/media
     134 +$ exiftool * > metadata.txt
     135 +```
     136 + - Group and inferred channel memberlists offer a point of further investigation for usernames found. By using Maigret, you can look up where else a username has been used. While this is not accurate in all cases, it's been proven to be useful for handles that are often reused. In this case, remember to verify your findings to avoid false positives.
     137 + 
     138 + 
    126 139  ## A note on how Telegram works
    127 140   
    128 141  Telegram chats are organised into three key types: Channels, Megagroups/Supergroups and Gigagroups. Each module works slightly differently depending on the chat type. Channels can have seemingly unlimited subscribers and are where an admin will broadcast messages to an audience, Megagroups can have up to 200,000 members, each of whom can participate (if not restricted), and Gigagroups sit somewhere between the two.
    skipped 5 lines
    134 147  Upcoming features include:
    135 148   
    136 149   - [ ] Adding a time specification flag to set archiving for specific period.
    137  - - [x] The ability to archive comments on messages to channels.
    138 150   - [ ] The ability to gather the number of reactions to messages, including statistics on engagement rate.
    139 151   - [ ] Finding a method to once again gather complete memberlists (currently restricted by the API).
    140  - - [x] Introducing the ability to scan multiple targets at once.
    141 152   - [ ] Improved statistics: including timestamp analysis for channels.
    142 153   - [ ] Generating an entirely automated complete report, including visualisation for some statistics.
    143  - - [x] Making it easier to scan private groups which your account is a member of.
    144 154   - [ ] Hate speech analytics.
    145  - - [x] Clean code, efficiency tweaks.
    146  - - [x] Add user lookup.
    147  - - [x] Add location lookup.
    148  - - [ ] Maximise compatibility of edgelists with Gephi.
     155 + - [x] Maximise compatibility of edgelists with Gephi.
    149 156   - [ ] Include sockpuppet account provisioning (creation of accounts from previous exported lists).
    150  - - [ ] Listing who has admin rights in memberlists.
     157 + - [ ] Listing who has group admin rights in memberlists.
    151 158   - [ ] Media downloaded in the background to increase efficiency.
    152 159   - [ ] When media archiving is flagged, the location of downloaded content will be added to the archive file.
    153  - - [ ] Adding direct link to posts in the chat archive file
     160 + - [ ] Exploring, and potentially integrating, media cross checks based on https://github.com/conflict-investigations/media-search-engine.
     161 + - [ ] Ensuring inferred channel memberlists don't contain duplicate entries.
     162 + - [ ] Introducing local chat retrival within the location lookup module.
     163 + - [ ] Adding trilateration option for location lookup to aid better location matching.
     164 + - [ ] Further code refactoring to ensure long-term maintainability.
     165 + - [ ] Progress bars for media downloads to give a better estimation of runtime.
     166 + - [ ] Adding additional alternative logins.
     167 + - [ ] Improved language support.
     168 + - [ ] Ensure inferred channel memberlists (based on repliers) contains each account only once.
     169 + - [ ] Correctly define destinction between reply (as in a chat) and comment (as in channel).
    154 170   
    155 171   
    156 172  ## feedback
    skipped 8 lines
    165 181   
    166 182  ## Credits
    167 183   
    168  -All tools created by Jordan Wildon (@jordanwildon). Special thanks go to [Giacomo Giallombardo](https://github.com/aaarghhh) for adding additional features and code refactoring, and Alex Newhouse (@AlexBNewhouse) for his help with Telepathy v1.
     184 +All tools created by Jordan Wildon (@jordanwildon). Special thanks go to [Giacomo Giallombardo](https://github.com/aaarghhh) for adding additional features and code refactoring, [jkctech](https://github.com/jkctech/Telegram-Trilateration) for collaboration on location lookup via the 'People Near Me' feature, and Alex Newhouse (@AlexBNewhouse) for his help with Telepathy v1. Shoutout also to [Francesco Poldi](https://github.com/noneprivacy) for being a sounding board and offering help and advice when it comes to bug fixes.
    169 185   
    170 186  Where possible, credit for the use of this tool in published research is desired, but not required. This can either come in the form of crediting the author, or crediting Telepathy itself (preferably with a link).
    171 187   
  • ■ ■ ■ ■
    build/lib/telepathy/const.py
    1 1  __author__ = "Jordan Wildon (@jordanwildon)"
    2 2  __license__ = "MIT License"
    3  -__version__ = "2.2.50"
     3 +__version__ = "2.2.58"
    4 4  __maintainer__ = "Jordan Wildon"
    5 5  __email__ = "[email protected]"
    6 6  __status__ = "Development"
    skipped 51 lines
  • ■ ■ ■ ■ ■ ■
    build/lib/telepathy/telepathy.py
    skipped 223 lines
    224 224   _desc = process_description(
    225 225   group_description, user_language
    226 226   )
    227  - description_text = _desc["group_description"]
    228  - original_language = _mess[
     227 +
     228 + original_language = _desc[
    229 229   "original_language"
    230 230   ]
    231 231   translated_description = _desc["translated_text"]
    skipped 191 lines
    423 423   _desc = process_description(
    424 424   group_description, user_language
    425 425   )
    426  - description_text = _desc["description_text"]
     426 + 
    427 427   original_language = _desc[
    428 428   "original_language"
    429 429   ]
    skipped 204 lines
    634 634   forwards_df = pd.DataFrame(
    635 635   forwards_list,
    636 636   columns=[
    637  - "To",
    638  - "To_title",
    639  - "From",
    640  - "From_ID",
     637 + "Source",
     638 + "Target",
     639 + "Label",
     640 + "Source_ID",
    641 641   "Username",
    642 642   "Timestamp",
    643 643   ],
    skipped 45 lines
    689 689   forwards_df = pd.DataFrame(
    690 690   forwards_list,
    691 691   columns=[
    692  - "To username",
    693  - "To name",
    694  - "From",
    695  - "From ID",
    696  - "From_username",
     692 + "Source",
     693 + "Target",
     694 + "Label",
     695 + "Source_ID",
     696 + "Username",
    697 697   "Timestamp",
    698 698   ],
    699 699   )
    700 700   
    701 701   forwards_list.append(
    702 702   [
     703 + result,
    703 704   t,
    704 705   to_title,
    705  - result,
    706 706   f_from_id,
    707 707   username,
    708 708   timestamp,
    skipped 25 lines
    734 734   pass
    735 735   
    736 736   if forward_count >= 15:
    737  - forwards_found = forwards_df.From.count()
    738  - value_count = forwards_df["From"].value_counts()
     737 + forwards_found = forwards_df.Source.count()
     738 + value_count = forwards_df["Source"].value_counts()
    739 739   df01 = value_count.rename_axis("unique_values").reset_index(
    740 740   name="counts"
    741 741   )
    skipped 40 lines
    782 782   + " forwarded messages"
    783 783   )
    784 784   
    785  - df02 = forwards_df.From.unique()
     785 + df02 = forwards_df.Source.unique()
    786 786   unique_forwards = len(df02)
    787 787   
    788 788   #print("\n")
    skipped 105 lines
    894 894   "Translated_text",
    895 895   "Translation_confidence",
    896 896   "Timestamp",
     897 + "Has_media",
    897 898   "Reply",
    898 899   "Views",
     900 + "URL",
    899 901   ],
    900 902   )
    901 903   
    902 904   c_forwards = pd.DataFrame(
    903 905   forwards_list,
    904 906   columns=[
    905  - "To",
    906  - "To_title",
    907  - "From",
    908  - "From_ID",
     907 + "Source",
     908 + "Target",
     909 + "Label",
     910 + "Source_ID",
    909 911   "Username",
    910 912   "Timestamp",
    911 913   ],
    skipped 28 lines
    940 942   "Group name",
    941 943   ],
    942 944   )
     945 +
    943 946   c_replies = pd.DataFrame(
    944 947   replies_list,
    945 948   columns=[
    skipped 98 lines
    1044 1047   #print("#### TODO: REACTIONS")
    1045 1048   
    1046 1049   if media_archive == True:
    1047  - #add a progress bar for each file download
    1048 1050   if message.media:
    1049 1051   path = await message.download_media(
    1050 1052   file=media_directory
    skipped 2 lines
    1053 1055   else:
    1054 1056   pass
    1055 1057  
     1058 + if message.media is not None:
     1059 + has_media = "TRUE"
     1060 + else:
     1061 + has_media = 'FALSE'
    1056 1062   
     1063 + post_url = "https://t.me/s/" + t + "/" + message.id
    1057 1064   
    1058 1065   message_list.append(
    1059 1066   [
    skipped 6 lines
    1066 1073   translated_text,
    1067 1074   translation_confidence,
    1068 1075   timestamp,
     1076 + has_media,
    1069 1077   reply,
    1070 1078   views,
     1079 + post_url,
    1071 1080   ]
    1072 1081   )
    1073 1082   
    skipped 83 lines
    1157 1166   
    1158 1167   forwards_list.append(
    1159 1168   [
     1169 + result,
    1160 1170   t,
    1161 1171   to_title,
    1162  - result,
    1163 1172   f_from_id,
    1164 1173   username,
    1165 1174   timestamp,
    1166 1175   ]
    1167 1176   )
    1168  - 
    1169  -
    1170 1177   
    1171 1178   except ChannelPrivateError:
    1172 1179   private_count += 1
    skipped 9 lines
    1182 1189   else:
    1183 1190   message_list.append(
    1184 1191   [
     1192 + "None",
    1185 1193   "None",
    1186 1194   "None",
    1187 1195   "None",
    skipped 2 lines
    1190 1198   "None",
    1191 1199   "None",
    1192 1200   "None",
     1201 + "None",
     1202 + "None",
     1203 + "None",
     1204 + "None",
    1193 1205   ]
    1194 1206   )
    1195 1207   pass
    skipped 109 lines
    1305 1317   df04 = c_archive.Display_name.unique()
    1306 1318   plength = len(df03)
    1307 1319   unique_active = len(df04)
    1308  - # one day this'll work out sleeping times
    1309  - # print(c_t_stats)
    1310 1320   
    1311 1321   elif reply_analysis is True:
    1312 1322   if len(replies_list) > 0:
    skipped 128 lines
    1441 1451   color_print_green(
    1442 1452   " ├ Total unique repliers: ", str(replier_unique)
    1443 1453   )
    1444  - # add a figure for unique current posters who are active
    1445 1454   
    1446 1455   if forwards_check is True:
    1447 1456   if forward_count >= 15:
    1448  - forwards_found = c_forwards.From.count()
    1449  - value_count = c_forwards["From"].value_counts()
     1457 + forwards_found = c_forwards.Source.count()
     1458 + value_count = c_forwards["Source"].value_counts()
    1450 1459   c_f_stats = value_count.rename_axis(
    1451 1460   "unique_values"
    1452 1461   ).reset_index(name="counts")
    skipped 46 lines
    1499 1508   + " forwarded messages"
    1500 1509   )
    1501 1510   
    1502  - c_f_unique = c_forwards.From.unique()
     1511 + c_f_unique = c_forwards.Source.unique()
    1503 1512   unique_forwards = len(c_f_unique)
    1504 1513   
    1505 1514   #print("\n")
    skipped 194 lines
    1700 1709   
    1701 1710   with open(
    1702 1711   save_file, "w+", encoding="utf-8"
    1703  - ) as f: # could one day append, including access time to differentiate
     1712 + ) as f:
    1704 1713   user_df.to_csv(f, sep=";", index=False)
    1705 1714   
    1706 1715   total = len(locations_list)
    skipped 6 lines
    1713 1722   color_print_green(" ├ Total users found: ", str(total))
    1714 1723   color_print_green(" â”” Location list saved to: ", save_file)
    1715 1724   
    1716  - # can also do the same for channels with similar output file to users
    1717  - # may one day add trilateration to find users closest to exact point
     1725 + user_df.iloc[0:0]
    1718 1726  
    1719 1727   with client:
    1720 1728   client.loop.run_until_complete(main())
    skipped 4 lines
  • dist/telepathy-2.2.58-py2.py3-none-any.whl
    Binary file.
  • dist/telepathy-2.2.58.tar.gz
    Binary file.
  • ■ ■ ■ ■
    setup.py
    skipped 1 lines
    2 2   
    3 3  setup(
    4 4   name="telepathy",
    5  - version='2.2.50',
     5 + version='2.2.58',
    6 6   author='Jordan Wildon',
    7 7   author_email='[email protected]',
    8 8   packages=['telepathy'],
    skipped 23 lines
  • ■ ■ ■ ■
    src/telepathy/const.py
    1 1  __author__ = "Jordan Wildon (@jordanwildon)"
    2 2  __license__ = "MIT License"
    3  -__version__ = "2.2.50"
     3 +__version__ = "2.2.58"
    4 4  __maintainer__ = "Jordan Wildon"
    5 5  __email__ = "[email protected]"
    6 6  __status__ = "Development"
    skipped 51 lines
  • ■ ■ ■ ■ ■ ■
    src/telepathy/telepathy.py
    skipped 223 lines
    224 224   _desc = process_description(
    225 225   group_description, user_language
    226 226   )
    227  - description_text = _desc["group_description"]
    228  - original_language = _mess[
     227 +
     228 + original_language = _desc[
    229 229   "original_language"
    230 230   ]
    231 231   translated_description = _desc["translated_text"]
    skipped 191 lines
    423 423   _desc = process_description(
    424 424   group_description, user_language
    425 425   )
    426  - description_text = _desc["description_text"]
     426 + 
    427 427   original_language = _desc[
    428 428   "original_language"
    429 429   ]
    skipped 204 lines
    634 634   forwards_df = pd.DataFrame(
    635 635   forwards_list,
    636 636   columns=[
    637  - "To",
    638  - "To_title",
    639  - "From",
    640  - "From_ID",
     637 + "Source",
     638 + "Target",
     639 + "Label",
     640 + "Source_ID",
    641 641   "Username",
    642 642   "Timestamp",
    643 643   ],
    skipped 45 lines
    689 689   forwards_df = pd.DataFrame(
    690 690   forwards_list,
    691 691   columns=[
    692  - "To username",
    693  - "To name",
    694  - "From",
    695  - "From ID",
    696  - "From_username",
     692 + "Source",
     693 + "Target",
     694 + "Label",
     695 + "Source_ID",
     696 + "Username",
    697 697   "Timestamp",
    698 698   ],
    699 699   )
    700 700   
    701 701   forwards_list.append(
    702 702   [
     703 + result,
    703 704   t,
    704 705   to_title,
    705  - result,
    706 706   f_from_id,
    707 707   username,
    708 708   timestamp,
    skipped 25 lines
    734 734   pass
    735 735   
    736 736   if forward_count >= 15:
    737  - forwards_found = forwards_df.From.count()
    738  - value_count = forwards_df["From"].value_counts()
     737 + forwards_found = forwards_df.Source.count()
     738 + value_count = forwards_df["Source"].value_counts()
    739 739   df01 = value_count.rename_axis("unique_values").reset_index(
    740 740   name="counts"
    741 741   )
    skipped 40 lines
    782 782   + " forwarded messages"
    783 783   )
    784 784   
    785  - df02 = forwards_df.From.unique()
     785 + df02 = forwards_df.Source.unique()
    786 786   unique_forwards = len(df02)
    787 787   
    788 788   #print("\n")
    skipped 105 lines
    894 894   "Translated_text",
    895 895   "Translation_confidence",
    896 896   "Timestamp",
     897 + "Has_media",
    897 898   "Reply",
    898 899   "Views",
     900 + "URL",
    899 901   ],
    900 902   )
    901 903   
    902 904   c_forwards = pd.DataFrame(
    903 905   forwards_list,
    904 906   columns=[
    905  - "To",
    906  - "To_title",
    907  - "From",
    908  - "From_ID",
     907 + "Source",
     908 + "Target",
     909 + "Label",
     910 + "Source_ID",
    909 911   "Username",
    910 912   "Timestamp",
    911 913   ],
    skipped 28 lines
    940 942   "Group name",
    941 943   ],
    942 944   )
     945 +
    943 946   c_replies = pd.DataFrame(
    944 947   replies_list,
    945 948   columns=[
    skipped 98 lines
    1044 1047   #print("#### TODO: REACTIONS")
    1045 1048   
    1046 1049   if media_archive == True:
    1047  - #add a progress bar for each file download
    1048 1050   if message.media:
    1049 1051   path = await message.download_media(
    1050 1052   file=media_directory
    skipped 2 lines
    1053 1055   else:
    1054 1056   pass
    1055 1057  
     1058 + if message.media is not None:
     1059 + has_media = "TRUE"
     1060 + else:
     1061 + has_media = 'FALSE'
    1056 1062   
     1063 + post_url = "https://t.me/s/" + t + "/" + message.id
    1057 1064   
    1058 1065   message_list.append(
    1059 1066   [
    skipped 6 lines
    1066 1073   translated_text,
    1067 1074   translation_confidence,
    1068 1075   timestamp,
     1076 + has_media,
    1069 1077   reply,
    1070 1078   views,
     1079 + post_url,
    1071 1080   ]
    1072 1081   )
    1073 1082   
    skipped 83 lines
    1157 1166   
    1158 1167   forwards_list.append(
    1159 1168   [
     1169 + result,
    1160 1170   t,
    1161 1171   to_title,
    1162  - result,
    1163 1172   f_from_id,
    1164 1173   username,
    1165 1174   timestamp,
    1166 1175   ]
    1167 1176   )
    1168  - 
    1169  -
    1170 1177   
    1171 1178   except ChannelPrivateError:
    1172 1179   private_count += 1
    skipped 9 lines
    1182 1189   else:
    1183 1190   message_list.append(
    1184 1191   [
     1192 + "None",
    1185 1193   "None",
    1186 1194   "None",
    1187 1195   "None",
    skipped 2 lines
    1190 1198   "None",
    1191 1199   "None",
    1192 1200   "None",
     1201 + "None",
     1202 + "None",
     1203 + "None",
     1204 + "None",
    1193 1205   ]
    1194 1206   )
    1195 1207   pass
    skipped 109 lines
    1305 1317   df04 = c_archive.Display_name.unique()
    1306 1318   plength = len(df03)
    1307 1319   unique_active = len(df04)
    1308  - # one day this'll work out sleeping times
    1309  - # print(c_t_stats)
    1310 1320   
    1311 1321   elif reply_analysis is True:
    1312 1322   if len(replies_list) > 0:
    skipped 128 lines
    1441 1451   color_print_green(
    1442 1452   " ├ Total unique repliers: ", str(replier_unique)
    1443 1453   )
    1444  - # add a figure for unique current posters who are active
    1445 1454   
    1446 1455   if forwards_check is True:
    1447 1456   if forward_count >= 15:
    1448  - forwards_found = c_forwards.From.count()
    1449  - value_count = c_forwards["From"].value_counts()
     1457 + forwards_found = c_forwards.Source.count()
     1458 + value_count = c_forwards["Source"].value_counts()
    1450 1459   c_f_stats = value_count.rename_axis(
    1451 1460   "unique_values"
    1452 1461   ).reset_index(name="counts")
    skipped 46 lines
    1499 1508   + " forwarded messages"
    1500 1509   )
    1501 1510   
    1502  - c_f_unique = c_forwards.From.unique()
     1511 + c_f_unique = c_forwards.Source.unique()
    1503 1512   unique_forwards = len(c_f_unique)
    1504 1513   
    1505 1514   #print("\n")
    skipped 194 lines
    1700 1709   
    1701 1710   with open(
    1702 1711   save_file, "w+", encoding="utf-8"
    1703  - ) as f: # could one day append, including access time to differentiate
     1712 + ) as f:
    1704 1713   user_df.to_csv(f, sep=";", index=False)
    1705 1714   
    1706 1715   total = len(locations_list)
    skipped 6 lines
    1713 1722   color_print_green(" ├ Total users found: ", str(total))
    1714 1723   color_print_green(" â”” Location list saved to: ", save_file)
    1715 1724   
    1716  - # can also do the same for channels with similar output file to users
    1717  - # may one day add trilateration to find users closest to exact point
     1725 + user_df.iloc[0:0]
    1718 1726  
    1719 1727   with client:
    1720 1728   client.loop.run_until_complete(main())
    skipped 4 lines
  • ■ ■ ■ ■ ■ ■
    src/telepathy.egg-info/PKG-INFO
    1 1  Metadata-Version: 2.1
    2 2  Name: telepathy
    3  -Version: 2.2.50
     3 +Version: 2.2.58
    4 4  Summary: An OSINT toolkit for investigating Telegram chats.
    5 5  Home-page: https://pypi.python.org/pypi/telepathy/
    6 6  Author: Jordan Wildon
    skipped 4 lines
    11 11   
    12 12   
    13 13   
    14  -Telepathy: An OSINT toolkit for investigating Telegram chats. Developed by Jordan Wildon. Version 2.2.22.
     14 +Telepathy: An OSINT toolkit for investigating Telegram chats. Developed by Jordan Wildon. Version 2.2.58.
    15 15   
    16 16   
    17 17  ## Installation
    skipped 91 lines
    109 109  $ telepathy -t 51.5032973,-0.1217424 -l
    110 110  ```
    111 111   
     112 + 
    112 113  - **'--alt', '-a'**
    113 114   
    114  -Flag for running Telepathy from an alternative number. You can use the same API key and Hash but authenticate with a different phone number. Allows for running multiple scans at once.
     115 +Flag for running Telepathy from an alternative number. You can use the same API key and Hash but authenticate with a different phone number. Allows for running multiple scans at the same time.
    115 116   
    116 117  ```
    117 118  $ telepathy -t Durov -c -a
    118 119  ```
    119 120   
     121 + 
    120 122  - **'--export', '-e'**
    121 123   
    122 124  Exports all chats your account is part of to a CSV file. In a future release, this may assist with setting up multiple accounts following the same groups.
    skipped 1 lines
    124 126  ```
    125 127  $ telepathy -e
    126 128  ```
     129 +
    127 130   
    128 131  - **'--reply', '-r'**
    129 132   
    skipped 4 lines
    134 137  ```
    135 138   
    136 139   
     140 +## Bonus investigations tips:
     141 + 
     142 + - Navigating to a media archive directory and running Exiftool may give you a whole host of useful information for further investigation. Telegram doesn't currently scrub metadata from PDF, DOCX, XLSX, MP4, MOV and some other filetypes, which offer creation and edit time metadata, often timezones, sometimes authors, and general technical information about the perosn or people who created a media file.
     143 + ```
     144 +$ cd ./telepathy/telepathy_files/CHATNAME/media
     145 +$ exiftool * > metadata.txt
     146 +```
     147 + - Group and inferred channel memberlists offer a point of further investigation for usernames found. By using Maigret, you can look up where else a username has been used. While this is not accurate in all cases, it's been proven to be useful for handles that are often reused. In this case, remember to verify your findings to avoid false positives.
     148 + 
     149 + 
    137 150  ## A note on how Telegram works
    138 151   
    139 152  Telegram chats are organised into three key types: Channels, Megagroups/Supergroups and Gigagroups. Each module works slightly differently depending on the chat type. Channels can have seemingly unlimited subscribers and are where an admin will broadcast messages to an audience, Megagroups can have up to 200,000 members, each of whom can participate (if not restricted), and Gigagroups sit somewhere between the two.
    skipped 5 lines
    145 158  Upcoming features include:
    146 159   
    147 160   - [ ] Adding a time specification flag to set archiving for specific period.
    148  - - [x] The ability to archive comments on messages to channels.
    149 161   - [ ] The ability to gather the number of reactions to messages, including statistics on engagement rate.
    150 162   - [ ] Finding a method to once again gather complete memberlists (currently restricted by the API).
    151  - - [x] Introducing the ability to scan multiple targets at once.
    152 163   - [ ] Improved statistics: including timestamp analysis for channels.
    153 164   - [ ] Generating an entirely automated complete report, including visualisation for some statistics.
    154  - - [x] Making it easier to scan private groups which your account is a member of.
    155 165   - [ ] Hate speech analytics.
    156  - - [x] Clean code, efficiency tweaks.
    157  - - [x] Add user lookup.
    158  - - [x] Add location lookup.
    159  - - [ ] Maximise compatibility of edgelists with Gephi.
     166 + - [x] Maximise compatibility of edgelists with Gephi.
    160 167   - [ ] Include sockpuppet account provisioning (creation of accounts from previous exported lists).
    161  - - [ ] Listing who has admin rights in memberlists.
     168 + - [ ] Listing who has group admin rights in memberlists.
    162 169   - [ ] Media downloaded in the background to increase efficiency.
    163 170   - [ ] When media archiving is flagged, the location of downloaded content will be added to the archive file.
    164  - - [ ] Adding direct link to posts in the chat archive file
     171 + - [ ] Exploring, and potentially integrating, media cross checks based on https://github.com/conflict-investigations/media-search-engine.
     172 + - [ ] Ensuring inferred channel memberlists don't contain duplicate entries.
     173 + - [ ] Introducing local chat retrival within the location lookup module.
     174 + - [ ] Adding trilateration option for location lookup to aid better location matching.
     175 + - [ ] Further code refactoring to ensure long-term maintainability.
     176 + - [ ] Progress bars for media downloads to give a better estimation of runtime.
     177 + - [ ] Adding additional alternative logins.
     178 + - [ ] Improved language support.
     179 + - [ ] Ensure inferred channel memberlists (based on repliers) contains each account only once.
     180 + - [ ] Correctly define destinction between reply (as in a chat) and comment (as in channel).
    165 181   
    166 182   
    167 183  ## feedback
    skipped 8 lines
    176 192   
    177 193  ## Credits
    178 194   
    179  -All tools created by Jordan Wildon (@jordanwildon). Special thanks go to [Giacomo Giallombardo](https://github.com/aaarghhh) for adding additional features and code refactoring, and Alex Newhouse (@AlexBNewhouse) for his help with Telepathy v1.
     195 +All tools created by Jordan Wildon (@jordanwildon). Special thanks go to [Giacomo Giallombardo](https://github.com/aaarghhh) for adding additional features and code refactoring, [jkctech](https://github.com/jkctech/Telegram-Trilateration) for collaboration on location lookup via the 'People Near Me' feature, and Alex Newhouse (@AlexBNewhouse) for his help with Telepathy v1. Shoutout also to [Francesco Poldi](https://github.com/noneprivacy) for being a sounding board and offering help and advice when it comes to bug fixes.
    180 196   
    181 197  Where possible, credit for the use of this tool in published research is desired, but not required. This can either come in the form of crediting the author, or crediting Telepathy itself (preferably with a link).
    182 198   
Please wait...
Page is in error, reload to recover