QQ消息转发到Telgram的实现

主要目地

把QQ的消息转到Telgram上,实现tg可以提示和通知qq的消息的具体内容。

解决了什么问题

qq的客户端每次推送消息,只显示有消息,但不显示消息内容是什么。
但tg和微信都是推送消息,并显示了消息内容,可以在不开手机的情况下,看到消息。
可以视消息的重要性选择是否进入软件中回复消息。
同样收到条消息,一张图显示了它们的区别。
示例

实现实路

  • 实现webqq
  • 在webqq的消息处理器中,把收到的消息按类别处理
  • 把符合条件的消息通过tg的bot转发到channel上去
  • channel收到消息,在 ios上会有推送通知

实现过程

webqq api

找了一个webqq的 api项目
https://github.com/ScienJus/smartqq

还比较好使用。于是直接在上面进行修改。

主要改造有两点:

  • 原代码的登录二维码存在本地。要改为把登录二维码以tg的消息发送。程序才可以部署在服务器上。
  • 原代码已经写好消息处理的流程,都是直接输出。要改为tg的消息发送。

后面基本上只增加了两个函数就搞定

telegram bot api

参考:
https://core.telegram.org/bots/

bot的转发消息的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Main{
static String token = "<bot_token>";
static String domain="https://api.telegram.org";
static String channel_char_id = "<char_id>";
static String url_prefix = domain + "/bot" + token + "/";

public static void getMe() throws Exception {
String res = Request.Get(url_prefix + "getMe").execute().returnContent().asString();
System.out.println(res);
}

static public void sendMessage(String message) throws Exception {
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("chat_id", channel_char_id));
params.add(new BasicNameValuePair("text", message));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "UTF-8");
String res = Request.Post(url_prefix + "sendMessage").body(entity).execute().returnContent().asString();
System.out.println(res);
}

static public void sendPhoto(File file) throws Exception {
if (!file.exists()) {
throw new IllegalArgumentException(file.getAbsolutePath() + "文件不存在");
}
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody("chat_id", channel_char_id);
builder.addBinaryBody("photo", file, ContentType.APPLICATION_OCTET_STREAM, "qrcode.png");
HttpEntity multipart = builder.build();
String res = Request.Post(url_prefix + "sendPhoto").body(multipart).execute().returnContent().asString();
System.out.println(res);
}
}

代码要用到fluent-hchttpmime库,要增加到依赖中。

在处理tg的bot时要注意的

bot要在 channel中发消息,需要把bot添加到 channel中,并设置为管理员。
发消息时要知道 channel的id。
如何获得channel的id,参见这里
https://stackoverflow.com/questions/33858927/how-to-obtain-the-chat-id-of-a-private-telegram-channel
把@get_id_bot加到 channel中就可以输出channel的id了。

总结

这次实践只是简单把api进行组合应用。
但用这个机制可以实现很多有趣的东西。
后面的再把smartqq的代码看看,学习下。