TelegramApiServer/README.md

137 lines
6.7 KiB
Markdown
Raw Normal View History

# TelegramApiServer
2019-06-09 19:18:49 +02:00
Fast, simple, async php telegram api server:
[MadelineProto](https://github.com/danog/MadelineProto) and [AmpPhp](https://github.com/amphp/amp) Server
2019-06-02 18:22:03 +02:00
* Online server for tests: [tg.i-c-a.su](https://tg.i-c-a.su)
* My content aggregator: [i-c-a.su](https://i-c-a.su)
* Im using this micro-service with: [my TelegramRSS micro-service](https://github.com/xtrime-ru/TelegramRSS)
2020-01-18 15:38:26 +01:00
## Features
2020-01-18 15:38:26 +01:00
* Fast async amp http server
* Full access to telegram api: bot and user
2020-01-18 15:38:26 +01:00
* Multiple sessions
* Stream media (view files in browser)
* Websocket endpoint for events
2019-06-02 18:22:03 +02:00
2020-01-13 22:01:48 +01:00
**Architecture Example**
![Architecture Example](https://hsto.org/webt/j-/ob/ky/j-obkye1dv68ngsrgi12qevutra.png)
2019-06-02 18:22:03 +02:00
2020-01-18 15:38:26 +01:00
## Installation
2019-06-09 19:18:49 +02:00
1. Git clone this repo
2019-11-22 23:58:52 +01:00
1. `composer install -o --no-dev` to install required libs
2019-03-05 15:28:32 +01:00
1. Create .env from .env.example
1. Fill variables in .env
2019-06-09 19:18:49 +02:00
1. Get app_id and app_hash at [my.telegram.org](https://my.telegram.org/) or leave blank.
MadelineProto will generate them on start.
2019-03-05 15:28:32 +01:00
_Optional:_
2019-11-22 23:58:52 +01:00
1. Use supervisor to monitor and restart swoole/amphp servers. Example of `/etc/supervisor/conf.d/telegram_api_server.conf`:
2019-03-05 15:28:32 +01:00
```
2019-11-22 23:58:52 +01:00
[program:telegram_api_server]
2019-11-08 13:41:59 +01:00
command=/usr/bin/php /home/admin/web/tg.i-c-a.su/TelegramApiServer/server.php
2019-03-05 15:28:32 +01:00
numprocs=1
2019-11-08 13:41:59 +01:00
directory=/home/admin/web/tg.i-c-a.su/TelegramApiServer/
2019-03-05 15:28:32 +01:00
autostart=true
autorestart=true
2019-03-12 15:01:22 +01:00
stdout_logfile=none
redirect_stderr=true
2019-03-05 15:28:32 +01:00
```
2020-01-18 15:38:26 +01:00
## Usage
1. Run server/parser
```
2020-01-19 04:17:14 +01:00
usage: php server.php [--help] [-a=|--address=127.0.0.1] [-p=|--port=9503] [-s=|--session=]
Options:
--help Show this message
2020-01-15 00:00:58 +01:00
-a --address Server ip (optional) (default: 127.0.0.1)
To listen external connections use 0.0.0.0 and fill IP_WHITELIST in .env
-p --port Server port (optional) (default: 9503)
2020-01-19 04:17:14 +01:00
-s --session Name for session file (optional)
2020-01-15 00:00:58 +01:00
Multiple sessions can be specified: "--session=user --session=bot"
Each session is stored in `sessions/%session%.madeline`.
Nested folders supported.
See README for more examples.
2019-03-19 00:38:32 +01:00
Also options can be set in .env file (see .env.example)
```
2020-01-18 15:38:26 +01:00
1. Access telegram api directly with simple GET/POST requests.
Its recommended to use http_build_query for GET requests.
**Rules:**
2019-02-03 19:17:38 +01:00
* All methods from MadelineProto supported: [Methods List](https://docs.madelineproto.xyz/API_docs/methods/)
2020-01-15 00:00:58 +01:00
* Url: `http://%address%:%port%/api[/%session%]/%class%.%method%/?%param%=%val%`
2019-01-20 18:20:41 +01:00
* <b>Important: api available only from ip in whitelist.</b>
By default it is: `127.0.0.1`
You can add client ip in .env file to `API_CLIENT_WHITELIST` (use json format)
2019-02-03 19:17:38 +01:00
* If method is inside class (messages, contacts and etc.) use '.' to separate class from method:
`http://127.0.0.1:9503/api/contacts.getContacts`
* If method requires array of values, use any name of array, for example 'data':
`?data[peer]=@xtrime&data[message]=Hello!`. Order of parameters does't matter in this case.
* If method requires one or multiple separate parameters (not inside array) then pass parameters with any names but **in strict order**:
2019-06-21 20:44:20 +02:00
`http://127.0.0.1:9503/api/getInfo/?id=@xtrime` or `http://127.0.0.1:9503/api/getInfo/?abcd=@xtrime` works the same
2020-01-12 00:11:18 +01:00
2020-01-18 15:38:26 +01:00
**Examples:**
2019-06-21 20:44:20 +02:00
* get_info about channel/user: `http://127.0.0.1:9503/api/getInfo/?id=@xtrime`
* get_info about currect account: `http://127.0.0.1:9503/api/getSelf`
2019-02-03 19:17:38 +01:00
* repost: `http://127.0.0.1:9503/api/messages.forwardMessages/?data[from_peer]=@xtrime&data[to_peer]=@xtrime&data[id]=1234`
2019-01-20 18:20:41 +01:00
* get messages from channel/user: `http://127.0.0.1:9503/api/getHistory/?data[peer]=@breakingmash&data[limit]=10`
2019-11-22 23:58:52 +01:00
* get messages with text in HTML: `http://127.0.0.1:9503/api/getHistoryHtml/?data[peer]=@breakingmash&data[limit]=10`
2019-01-22 23:03:36 +01:00
* search: `http://127.0.0.1:9503/api/searchGlobal/?data[q]=Hello%20World&data[limit]=10`
2019-01-20 18:20:41 +01:00
* sendMessage: `http://127.0.0.1:9503/api/sendMessage/?data[peer]=@xtrime&data[message]=Hello!`
2020-01-15 00:00:58 +01:00
* copy message from one channel to another (not repost): `http://127.0.0.1:9503/api/copyMessages/?data[from_peer]=@xtrime&data[to_peer]=@xtrime&data[id][0]=1`
2020-01-13 00:02:29 +01:00
2020-01-18 15:38:26 +01:00
## Advanced features
2020-01-13 00:02:29 +01:00
2020-01-19 16:24:14 +01:00
* Multiple sessions support.
2020-01-18 15:38:26 +01:00
When running multiple sessions, need to define which session to use for request.
Each session is stored in `sessions/{$session}.madeline`. Nested folders supported.
**Examples:**
* `php server.php --session=bot --session=users/xtrime --session=users/user1`
* `http://127.0.0.1:9503/api/bot/getSelf`
* `http://127.0.0.1:9503/api/users/xtrime/getSelf`
* `http://127.0.0.1:9503/api/users/user1/getSelf`
* sessions file paths are: `sessions/bot.madeline`, `sessions/users/xtrime.madeline` and `sessions/users/user1.madeline`
* glob syntax for sessions:
* `--session=*` to use all `sessions/*.madeline` files.
* `--session=users/* --session=bots/*` to use all session files from `sessions/bots` and `sessions/users` folders.
2020-01-19 17:44:10 +01:00
* Session management (**Use with caution, can be unstable**)
2020-01-19 04:17:14 +01:00
**Examples:**
2020-01-19 16:24:14 +01:00
* Adding session: `http://127.0.0.1:9503/system/addInstance?session=users/xtrime`
* Removing session: `http://127.0.0.1:9503/system/removeInstance?session=users/xtrime`
2020-01-19 17:44:10 +01:00
2020-01-19 04:17:14 +01:00
If there is no authorization in session, or session file is blank, authorization required:
User:
2020-01-19 16:24:14 +01:00
* `http://127.0.0.1:9503/api/users/xtrime/phoneLogin?phone=+7123...`
* `http://127.0.0.1:9503/api/users/xtrime/completePhoneLogin?code=123456`
* (optional) `http://127.0.0.1:9503/api/users/xtrime/complete2falogin?password=123456`
* (optional) `http://127.0.0.1:9503/api/users/xtrime/completeSignup?firstName=MyExampleName`
2020-01-19 04:17:14 +01:00
Bot:
* `http://127.0.0.1:9503/combinedApi/botLogin?token=34298141894:aflknsaflknLKNFS`
2020-01-18 15:38:26 +01:00
* EventHandler updates via websocket. Connect to `ws://127.0.0.1:9503/events`. You will get all events in json.
Each event is json object in [json-rpc 2.0 format](https://www.jsonrpc.org/specification#response_object). Example:
When using CombinedAPI (multiple accounts) name of session can be added to path of websocket endpoint:
This endpoint will send events only from `users/xtrime` session: `ws://127.0.0.1:9503/events/users/xtrime`
PHP websocket client example: [websocket-events.php](https://github.com/xtrime-ru/TelegramApiServer/blob/master/examples/websocket-events.php)
2019-06-02 18:22:03 +02:00
2020-01-18 15:38:26 +01:00
## Contacts
2019-06-02 18:22:03 +02:00
2020-01-18 15:38:26 +01:00
* Telegram: [@xtrime](tg://resolve?domain=xtrime)
* Email: alexander(at)i-c-a.su
* Donations:
* BTC: `1BE1nitXgEAxg7A5tgec67ucNryQwusoiP`
* ETH: `0x0e2d369E28DCA2336803b9dE696eCDa50ff61e27`