主要目地
把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-hc
和httpmime
库,要增加到依赖中。
在处理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的代码看看,学习下。