Telegram の非公式cli client の telegram-cli を試す

Arm でも動くかな?と試してみました．

vysheng/tg: telegram-cli

必要パッケージの導入

$ sudo apt install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev libjansson-dev libpython-dev make libssl1.0-dev

sourceをcloneする

$ git clone --recursive https://github.com/vysheng/tg.git && cd tg

configure & make

$ ./configure
$ make

build error1

tgl/crypto/rsa_pem_openssl.c: In function ‘TGLC_rsa_new’:
tgl/crypto/rsa_pem_openssl.c:41:6: error: dereferencing pointer to incomplete type ‘RSA {aka struct rsa_st}’
ret->e = unwrap_bn (TGLC_bn_new ());
^~
tgl/crypto/rsa_pem_openssl.c: In function ‘TGLC_rsa_n’:
tgl/crypto/rsa_pem_openssl.c:52:1: error: control reaches end of non-void function [-Werror=return-type]
RSA_GETTER(n);
^~~~~~~~~~
tgl/crypto/rsa_pem_openssl.c: In function ‘TGLC_rsa_e’:
tgl/crypto/rsa_pem_openssl.c:53:1: error: control reaches end of non-void function [-Werror=return-type]
RSA_GETTER(e);
^~~~~~~~~~
cc1: all warnings being treated as errors
Makefile.tgl:20: recipe for target 'objs/crypto/rsa_pem_openssl.o' failed
make: *** [objs/crypto/rsa_pem_openssl.o] Error 1

libssl-dev(1.1.1)では動作しないのでlibssl1.0-devに入れ替える． sudo apt install libssl1.0-dev

build error2

gcc -I. -I. -I./tgl -w -I/usr/local/include -I/usr/include -I/usr/include -I/usr/include/lua5.2 -DHAVE_CONFIG_H -Wall -Werror -Wextra -Wno-missing-field-initializers -Wno-deprecated-declarations -fno-strict-aliasing -fno-omit-frame-pointer -ggdb -Wno-unused-parameter -fPIC -iquote ./tgl/tl-parser -c -MP -MD -MF dep/tl-parser.d -MQ objs/tl-parser.o -o objs/tl-parser.o tgl/tl-parser/tl-parser.c
tgl/tl-parser/tl-parser.c:37:10: fatal error: zlib.h: そのようなファイルやディレクトリはありません
#include <zlib.h>
^~~~~~~~
compilation terminated.
make: *** [Makefile.tl-parser:4: objs/tl-parser.o] エラー 1

zlib1g-dev を導入する． sudo apt install zlib1g-dev

Raspbian stretchでの実行時エラー(32bit環境での不具合?)

$ bin/telegram-cli
Telegram-cli version 1.4.1, Copyright (C) 2013-2015 Vitaly Valtman
Telegram-cli comes with ABSOLUTELY NO WARRANTY; for details type `show_license'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show_license' for details.
Telegram-cli uses libtgl version 2.1.0
Telegram-cli includes software developed by the OpenSSL Project
for use in the OpenSSL Toolkit. (http://www.openssl.org/)
I: config dir=[/home/pi/.telegram-cli]
> telegram-cli: tgl/mtproto-utils.c:101: BN2ull: Assertion `0' failed.
SIGNAL received

以下の修正を行い， make clean して build しなおす．

$ diff -ud tgl/mtproto-utils.c.org tgl/mtproto-utils.c
--- tgl/mtproto-utils.c.org 2018-09-19 21:01:44.878560077 +0900
+++ tgl/mtproto-utils.c 2018-09-19 20:59:55.778295550 +0900
@@ -98,13 +98,13 @@
if (sizeof (unsigned long) == 8) {
return TGLC_bn_get_word (b);
} else if (sizeof (unsigned long long) == 8) {
- assert (0); // As long as nobody ever uses this code, assume it is broken.
+ assert (0); As long as nobody ever uses this code, assume it is broken.
unsigned long long tmp;
/* Here be dragons, but it should be okay due to be64toh */
TGLC_bn_bn2bin (b, (unsigned char *) &tmp);
return be64toh (tmp);
} else {
- assert (0);
+// assert (0);
}
}

$ make clean
$ ./configure
$ make

初回実行時はSMS認証が必要

$ bin/telegram-cli
Telegram-cli version 1.4.1, Copyright (C) 2013-2015 Vitaly Valtman
Telegram-cli comes with ABSOLUTELY NO WARRANTY; for details type `show_license'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show_license' for details.
Telegram-cli uses libtgl version 2.1.0
Telegram-cli includes software developed by the OpenSSL Project
for use in the OpenSSL Toolkit. (http://www.openssl.org/)
I: config dir=[/home/mk/.telegram-cli]
[/home/mk/.telegram-cli] created
[/home/mk/.telegram-cli/downloads] created
phone number: +81-9000000000
code ('CALL' for phone code): 16802
User matoken updated flags
User matoken online (was online [2018/09/18 23:55:32])
User matoken offline (was online [2018/09/18 23:50:35])

認証を行うとメッセージが飛んでくる

matoken,

We detected a login into your account from a new device on 19/09/2018 at 12:28:55 UTC.

Device: Unix Console
Location: Shizuoka, Japan (IP = 180.131.110.140)

If this wasn't you, you can go to Settings - Privacy and Security - Sessions and terminate that session.

If you think that somebody logged in to your account against your will, you can enable two-step verification in Privacy and Security settings.

Sincerely,
The Telegram Team

メッセージを送信してみる

> msg @matoken hello

telegram-cli の help

$ bin/telegram-cli --help
telegram-cli Usage
--phone/-u specify username (would not be asked during authorization)
--rsa-key/-k specify location of public key (possible multiple entries)
--verbosity/-v increase verbosity (0-ERROR 1-WARNIN 2-NOTICE 3+-DEBUG-levels)
--enable-msg-id/-N message num mode
--config/-c config file name
--profile/-p use specified profile
--log-level/-l log level
--sync-from-start/-f during authorization fetch all messages since registration
--disable-auto-accept/-E disable auto accept of encrypted chats
--lua-script/-s lua script file
--wait-dialog-list/-W send dialog_list query and wait for answer before reading input
--disable-colors/-C disable color output
--disable-readline/-R disable readline
--alert/-A enable bell notifications
--daemonize/-d daemon mode
--logname/-L <log-name> log file name
--username/-U <user-name> change uid after start
--groupname/-G <group-name> change gid after start
--disable-output/-D disable output
--tcp-port/-P <port> port to listen for input commands
--udp-socket/-S <socket-name> unix socket to create
--exec/-e <commands> make commands end exit
--disable-names/-I use user and chat IDs in updates instead of names
--enable-ipv6/-6 use ipv6 (may be unstable)
--help/-h prints this help
--accept-any-tcp accepts tcp connections from any src (only loopback by default)
--disable-link-preview disables server-side previews to links
--bot/-b bot mode
--json prints answers and values in json format
--permanent-msg-ids use permanent msg ids
--permanent-peer-ids use permanent peer ids

telegram-cli 起動時のhelp

$ bin/telegram-cli -e help
Telegram-cli version 1.4.1, Copyright (C) 2013-2015 Vitaly Valtman
Telegram-cli comes with ABSOLUTELY NO WARRANTY; for details type `show_license'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show_license' for details.
Telegram-cli uses libtgl version 2.1.0
Telegram-cli includes software developed by the OpenSSL Project
for use in the OpenSSL Toolkit. (http://www.openssl.org/)
I: config dir=[/home/pi/.telegram-cli]
[33;1maccept_secret_chat <secret chat> Accepts secret chat. Only useful with -E option
add_contact <phone> <first name> <last name> Tries to add user to contact list
block_user <user> Blocks user
broadcast <user>+ <text> Sends text to several users at once
channel_get_admins <channel> [limit=100] [offset=0] Gets channel admins
channel_get_members <channel> [limit=100] [offset=0] Gets channel members
channel_info <channel> Prints info about channel (id, members, admin, etc.)
channel_invite <channel> <user> Invites user to channel
channel_join <channel> Joins to channel
channel_kick <channel> <user> Kicks user from channel
channel_leave <channel> Leaves from channel
channel_list [limit=100] [offset=0] List of last channels
channel_set_about <channel> <about> Sets channel about info.
channel_set_admin <channel> <admin> <type> Sets channel admin. 0 - not admin, 1 - moderator, 2 - editor
channel_set_username <channel> <username> Sets channel username info.
channel_set_photo <channel> <filename> Sets channel photo. Photo will be cropped to square
chat_add_user <chat> <user> [msgs-to-forward] Adds user to chat. Sends him last msgs-to-forward message from this chat. Default 100
chat_del_user <chat> <user> Deletes user from chat
chat_info <chat> Prints info about chat (id, members, admin, etc.)
chat_set_photo <chat> <filename> Sets chat photo. Photo will be cropped to square
chat_upgrade <chat> Upgrades chat to megagroup
chat_with_peer <peer> Interface option. All input will be treated as messages to this peer. Type /quit to end this mode
clear Clears all data and exits. For debug.
contact_list Prints contact list
contact_search username Searches user by username
create_channel <name> <about> <user>+ Creates channel with users
create_group_chat <name> <user>+ Creates group chat with users
create_secret_chat <user> Starts creation of secret chat
del_contact <user> Deletes contact from contact list
delete_msg <msg-id> Deletes message
dialog_list [limit=100] [offset=0] List of last conversations
export_card Prints card that can be imported by another user with import_card method
export_channel_link Prints channel link that can be used to join to channel
export_chat_link Prints chat link that can be used to join to chat
fwd <peer> <msg-id>+ Forwards message to peer. Forward to secret chats is forbidden
fwd_media <peer> <msg-id> Forwards message media to peer. Forward to secret chats is forbidden. Result slightly differs from fwd
get_terms_of_service Prints telegram's terms of service
get_message <msg-id> Get message by id
get_self Get our user info
help [command] Prints this help
history <peer> [limit] [offset] Prints messages with this peer (most recent message lower). Also marks messages as read
import_card <card> Gets user by card and prints it name. You can then send messages to him as usual
import_chat_link <hash> Joins to chat by link
import_channel_link <hash> Joins to channel by link
load_audio <msg-id> Downloads file to downloads dirs. Prints file name after download end
load_channel_photo <channel> Downloads file to downloads dirs. Prints file name after download end
load_chat_photo <chat> Downloads file to downloads dirs. Prints file name after download end
load_document <msg-id> Downloads file to downloads dirs. Prints file name after download end
load_document_thumb <msg-id> Downloads file to downloads dirs. Prints file name after download end
load_file <msg-id> Downloads file to downloads dirs. Prints file name after download end
load_file_thumb <msg-id> Downloads file to downloads dirs. Prints file name after download end
load_photo <msg-id> Downloads file to downloads dirs. Prints file name after download end
load_user_photo <user> Downloads file to downloads dirs. Prints file name after download end
load_video <msg-id> Downloads file to downloads dirs. Prints file name after download end
load_video_thumb <msg-id> Downloads file to downloads dirs. Prints file name after download end
main_session Sends updates to this connection (or terminal). Useful only with listening socket
mark_read <peer> Marks messages with peer as read
msg <peer> <text> Sends text message to peer
msg <peer> <text> Sends text message to peer with custom kbd
post <peer> <text> Sends text message to peer as admin
post_audio <peer> <file> Posts audio to peer
post_document <peer> <file> Posts document to peer
post_file <peer> <file> Sends document to peer
post_location <peer> <latitude> <longitude> Sends geo location
post_photo <peer> <file> Sends photo to peer
post_text <peer> <file> Sends contents of text file as plain text message
post_video <peer> <file> Sends video to peer
quit Quits immediately
rename_channel <channel> <new name> Renames channel
rename_chat <chat> <new name> Renames chat
rename_contact <user> <first name> <last name> Renames contact
reply <msg-id> <text> Sends text reply to message
reply_audio <msg-id> <file> Sends audio to peer
reply_contact <msg-id> <phone> <first-name> <last-name> Sends contact (not necessary telegram user)
reply_document <msg-id> <file> Sends document to peer
reply_file <msg-id> <file> Sends document to peer
reply_location <msg-id> <latitude> <longitude> Sends geo location
reply_photo <msg-id> <file> Sends photo to peer
reply_video <msg-id> <file> Sends video to peer
resolve_username username Searches user by username
safe_quit Waits for all queries to end, then quits
search [peer] [limit] [from] [to] [offset] pattern Search for pattern in messages from date from to date to (unixtime) in messages with peer (if peer not
present, in all messages)
send_audio <peer> <file> Sends audio to peer
send_contact <peer> <phone> <first-name> <last-name> Sends contact (not necessary telegram user)
send_document <peer> <file> Sends document to peer
send_file <peer> <file> Sends document to peer
send_location <peer> <latitude> <longitude> Sends geo location
send_photo <peer> <file> Sends photo to peer
send_text <peer> <file> Sends contents of text file as plain text message
send_typing <peer> [status] Sends typing notification. You can supply a custom status (range 0-10): none, typing, cancel, record video, upload video, recor
d audio, upload audio, upload photo, upload document, geo, choose contact.
send_typing_abort <peer> Sends typing notification abort
send_video <peer> <file> Sends video to peer
set <value> Sets value of param. Currently available: log_level, debug_verbosity, alarm, msg_num
set_password <hint> Sets password
set_profile_name <first-name> <last-name> Sets profile name.
set_profile_photo <filename> Sets profile photo. Photo will be cropped to square
set_ttl <secret chat> Sets secret chat ttl. Client itself ignores ttl
set_username <name> Sets username.
set_phone_number <phone> Changes the phone number of this account
show_license Prints contents of GPL license
start_bot <bot> <chat> Adds bot to chat
stats For debug purpose
status_online Sets status as online
status_offline Sets status as offline
unblock_user <user> Unblocks user
user_info <user> Prints info about user (id, last online, phone)
version Prints client and library version
view_audio <msg-id> Downloads file to downloads dirs. Then tries to open it with system default action
view_channel_photo <channel> Downloads file to downloads dirs. Then tries to open it with system default action
view_chat_photo <chat> Downloads file to downloads dirs. Then tries to open it with system default action
view_document <msg-id> Downloads file to downloads dirs. Then tries to open it with system default action
view_document_thumb <msg-id> Downloads file to downloads dirs. Then tries to open it with system default action
view_file <msg-id> Downloads file to downloads dirs. Then tries to open it with system default action
view_file_thumb <msg-id> Downloads file to downloads dirs. Then tries to open it with system default action
view_photo <msg-id> Downloads file to downloads dirs. Then tries to open it with system default action
view_user_photo <user> Downloads file to downloads dirs. Then tries to open it with system default action
view_video <msg-id> Downloads file to downloads dirs. Then tries to open it with system default action
view_video_thumb <msg-id> Downloads file to downloads dirs. Then tries to open it with system default action
view <msg-id> Tries to view message contents
visualize_key <secret chat> Prints visualization of encryption key (first 16 bytes sha1 of it in fact)
[0mAll done. Exit
halt

大抵のことは出来る感じです．

試した環境1

$ git log --decorate|head -7
commit 6547c0b21b977b327b3c5e8142963f4bc246187a (HEAD -> master, origin/master, origin/HEAD)
Merge: 443793d 160231b
Author: V V <vvaltman@aurum>
Date: Wed Mar 23 14:42:53 2016 +0300

Merge github.com:vysheng/tg

$ dpkg-query -W libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev libjansson-dev libpython-dev make libssl1.0-dev
libconfig-dev:armhf 1.5-0.3
libevent-dev 2.0.21-stable-3
libjansson-dev:armhf 2.9-1
liblua5.2-dev:armhf 5.2.4-1.1
libpython-dev:armhf 2.7.13-2
libreadline-dev:armhf 7.0-3
libssl-dev
libssl1.0-dev:armhf 1.0.2l-2+deb9u3
lua5.2 5.2.4-1.1
make 4.1-9.1
$ lsb_release -d
Description: Raspbian GNU/Linux 9.4 (stretch)
$ uname -m
armv7l
$ cat /proc/device-tree/model ;echo
Raspberry Pi 2 Model B Rev 1.1

試した環境2

$ git log --decorate|head -7
commit 6547c0b21b977b327b3c5e8142963f4bc246187a (HEAD -> master, origin/master, origin/HEAD)
Merge: 443793d 160231b
Author: V V <vvaltman@aurum>
Date: Wed Mar 23 14:42:53 2016 +0300

Merge github.com:vysheng/tg

$ dpkg-query -W libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev libjansson-dev libpython-dev make libssl1.0-dev
libconfig-dev:amd64 1.5-0.4
libevent-dev 2.1.8-stable-4build1
libjansson-dev:amd64 2.11-1
liblua5.2-dev:amd64 5.2.4-1.1build1
libpython-dev:amd64 2.7.15~rc1-1
libreadline-dev:amd64 7.0-3
libssl-dev
libssl1.0-dev:amd64 1.0.2n-1ubuntu5.1
lua5.2 5.2.4-1.1build1
make 4.1-9.1ubuntu1
$ lsb_release -d
Description: Ubuntu 18.04.1 LTS
(mk)-(jobs:0)-(~/src/tg)
$ uname -m
x86_64