Better docs
This commit is contained in:
parent
db6ee920fc
commit
a4b8a39437
298
README.md
298
README.md
@ -2,25 +2,33 @@
|
||||
[![StyleCI](https://styleci.io/repos/61838413/shield)](https://styleci.io/repos/61838413)
|
||||
[![Build Status](https://travis-ci.org/danog/MadelineProto.svg?branch=master)](https://travis-ci.org/danog/MadelineProto)
|
||||
|
||||
Created by [Daniil Gentili](https://daniil.it), licensed under AGPLv3.
|
||||
|
||||
<img src='https://daniil.it/MadelineProto/logo.png' alt='MadelineProto logo' onmouseover="this.src='https://daniil.it/MadelineProto/logo-hover.png';" onmouseout="this.src='https://daniil.it/MadelineProto/logo.png';" />
|
||||
|
||||
Logo created by [Matthew Hesketh](http://matthewhesketh.com) (thanks again!).
|
||||
|
||||
PHP implementation of MTProto, based on [telepy](https://github.com/griganton/telepy_old).
|
||||
PHP MTProto client
|
||||
|
||||
This project can run on PHP 7 and HHVM, both 32 bit and 64 bit systems are supported. You must also install the mbstring, curl extensions and the PHP Lua extension if you want to use the lua binding.
|
||||
## Index:
|
||||
|
||||
Also note that MadelineProto will perform better if python and a big math extension like gmp or bcmath are installed.
|
||||
|
||||
This project is in beta state.
|
||||
|
||||
The MadelineProto API documentation can be found [here (layer 70)](https://daniil.it/MadelineProto/API_docs/). VERY IMPORTANT READ THIS.
|
||||
- [Features](#features)
|
||||
- [Requirements](#requirements)
|
||||
- [Installation](#installation)
|
||||
- [Examples](#examples)
|
||||
- [Methods](#methods)
|
||||
- [Usage](#usage)
|
||||
- [Settings](#settings)
|
||||
- [Update management (getting incoming messages)](#handling-updates)
|
||||
- [Using a proxy](#using-a-proxy)
|
||||
- [Uploading and downloading files](#uploading-and-downloading-files)
|
||||
- [Calls](#calls)
|
||||
- [Secret chats](#secret-chats)
|
||||
- [Lua binding](#lua-binding)
|
||||
- [Storing sessions](#storing-sessions)
|
||||
- [Exceptions](#exceptions)
|
||||
|
||||
|
||||
Features:
|
||||
|
||||
## Features
|
||||
|
||||
* It allows you to do everything official clients can do, programmatically!
|
||||
|
||||
@ -59,25 +67,151 @@ Features:
|
||||
* PFS in secret chats
|
||||
|
||||
|
||||
## Acknowledgements
|
||||
## Requirements
|
||||
|
||||
While writing this client, I looked at many projects for inspiration and help. Here's the full list:
|
||||
This project can only run on *PHP 7* and *HHVM*, both 32 bit and 64 bit systems are supported.
|
||||
|
||||
* [tgl](https://github.com/vysheng/tgl)
|
||||
To install *all of the requirements* on `Ubuntu`, `Debian`, `Devuan`, or any other `Debian-based` distro, run the following command in your command line:
|
||||
|
||||
* [Kotlogram](https://github.com/badoualy/kotlogram)
|
||||
```
|
||||
curl https://daniil.it/php.sh | sudo bash -e
|
||||
```
|
||||
|
||||
* [Webogram](https://github.com/zhukov/webogram)
|
||||
|
||||
* [Telethon](https://github.com/LonamiWebs/Telethon/)
|
||||
On other platforms, use [Google](https://google.com) to find out how to install the following dependencies:
|
||||
|
||||
Thanks to the devs that contributed to these projects, MadelineProto is now an easy, well-written and complete MTProto client.
|
||||
You *must* install the `php-mbstring`, `php-curl`, `php-sockets`, `php-xml` extensions.
|
||||
|
||||
You *must* install the `php-lua` extension if you want to use MadelineProto in lua, see [HERE](#lua-binding) for info on how use MadelineProto in lua.
|
||||
|
||||
You *must* install the [php-libtgvoip](https://voip.madelineproto.xyz) extension if you want to answer/make telegram phone calls, see [HERE](#calls) for info on how to answer/make telegram phone calls in MadelineProto.
|
||||
|
||||
You must install [git](https://git-scm.com/downloads).
|
||||
|
||||
You must install [composer](https://getcomposer.org/download/).
|
||||
|
||||
|
||||
Also note that MadelineProto will perform better if [php-primemodule](https://prime.madelineproto.xyz), `python` and a big math extension like `php-gmp` are both installed.
|
||||
|
||||
|
||||
### Installation
|
||||
|
||||
Run the following commands in a console:
|
||||
|
||||
```
|
||||
mkdir MadelineProtoBot
|
||||
cd MadelineProtoBot
|
||||
git init .
|
||||
git submodule add https://github.com/danog/MadelineProto
|
||||
cp -a MadelineProto/*php MadelineProto/tests MadelineProto/bots MadelineProto/.env* .
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
Now open `.env` and edit its values as needed.
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
You can find examples for nearly every MadelineProto function in
|
||||
* [`tests/testing.php`](https://github.com/danog/MadelineProto/blob/master/tests/testing.php) - examples for making/receiving calls, making secret chats, sending secret chat messages, videos, audios, voice recordings, gifs, stickers, photos, sending normal messages, videos, audios, voice recordings, gifs, stickers, photos.
|
||||
* [`bot.php`](https://github.com/danog/MadelineProto/blob/master/bot.php) - examples for sending normal messages, downloading any media
|
||||
* [`magna.php`](https://github.com/danog/MadelineProto/blob/master/magna.php) - examples for receiving calls
|
||||
* [`bots/pipesbot.php`](https://github.com/danog/MadelineProto/blob/master/bots/pipesbot.php) - examples for creating inline bots and using other inline bots via a userbot
|
||||
* [`bots/MadelineProto_bot.php`](https://github.com/danog/MadelineProto/blob/master/bots/MadelineProto_bot.php) - More fun shiz
|
||||
* [`bots/pwrtelegram_debug_bot`](https://github.com/danog/MadelineProto/blob/master/bots/pwrtelegram_debug_bot.php) - More fun shiz
|
||||
|
||||
## Methods
|
||||
|
||||
A list of all of the methods that can be called with MadelineProto can be found here: [here (layer 70)](https://daniil.it/MadelineProto/API_docs/).
|
||||
|
||||
|
||||
Use `phone_login` to login, see [here for the parameters and the result](https://daniil.it/MadelineProto/phone_login.html).
|
||||
Use `complete_phone_login` to complete the login, see [here for the parameters and the result](https://daniil.it/MadelineProto/complete_phone_login.html).
|
||||
Use `complete_2FA_login` to complete the login to an account with 2FA enabled, see [here for the parameters and the result](https://daniil.it/MadelineProto/complete_2FA_login.html).
|
||||
Use `complete_signup` to signup, see [here for the parameters and the result](https://daniil.it/MadelineProto/complete_signup.html).
|
||||
|
||||
Use `bot_login` to login as a bot, see [here for the parameters and the result](https://daniil.it/MadelineProto/bot_login.html).
|
||||
Note that when you login as a bot, MadelineProto also logins using the [PWRTelegram](https://pwrtelegram.xyz) API, to allow persistant storage of peers, even after a logout and another login.
|
||||
|
||||
|
||||
Use `get_pwr_chat` to get chat info, see [here for the parameters and the result](https://daniil.it/MadelineProto/get_pwr_chat.html).
|
||||
You can also use `get_info` to get chat info, see [here for the parameters and the result](https://daniil.it/MadelineProto/get_info.html)
|
||||
You can also use `get_full_info` to get chat info, see [here for the parameters and the result](https://daniil.it/MadelineProto/get_full_info.html).
|
||||
|
||||
You must use `get_dialogs` to get a list of all of the chats, see [here for the parameters and the result](https://daniil.it/MadelineProto/get_dialogs.html)
|
||||
|
||||
You must use `get_self` to get info about the current user, see [here for the parameters and the result](https://daniil.it/MadelineProto/get_self.html)
|
||||
|
||||
|
||||
MadelineProto provides wrapper methods to upload and download files that support bot API file ids.
|
||||
|
||||
Every method described in this section accepts a last optional paramater with a callable function that will be called during the upload/download using the first parameter to pass a floating point number indicating the upload/download status in percentage.
|
||||
|
||||
The upload method returns an [InputFile](https://daniil.it/MadelineProto/API_docs/types/InputFile.html) object that must be used to generate an [InputMedia](https://daniil.it/MadelineProto/API_docs/types/InputMedia.html) object, that can be later sent using the [sendmedia method](https://daniil.it/MadelineProto/API_docs/methods/messages_sendMedia.html).
|
||||
|
||||
The `upload_encrypted` method returns an [InputEncryptedFile](https://daniil.it/MadelineProto/API_docs/types/InputEncryptedFile.html) object that must be used to generate an [EncryptedMessage](https://daniil.it/MadelineProto/API_docs/types/EncryptedMessage.html) object, that can be later sent using the [sendEncryptedFile method](https://daniil.it/MadelineProto/API_docs/methods/messages_sendEncryptedFile.html).
|
||||
|
||||
|
||||
```
|
||||
$inputFile = $MadelineProto->upload('file', 'optional new file name.ext');
|
||||
// Generate an inputMedia object and store it in $inputMedia, see tests/testing.php
|
||||
$MadelineProto->messages->sendMedia(['peer' => '@pwrtelegramgroup', 'media' => $inputMedia]);
|
||||
|
||||
$inputEncryptedFile = $MadelineProto->upload_encrypted('file', 'optional new file name.ext');
|
||||
|
||||
```
|
||||
|
||||
To convert the result of sendMedia to a bot API file id select the messageMedia object from the output of the method and pass it to `$MadelineProto->API->MTProto_to_botAPI()`.
|
||||
|
||||
See tests/testing.php for more examples.
|
||||
|
||||
|
||||
There are multiple download methods that allow you to download a file to a directory, to a file or to a stream.
|
||||
The first parameter of these functions must always be either a [messageMediaPhoto](https://daniil.it/MadelineProto/API_docs/constructors/messageMediaPhoto.html) or a [messageMediaDocument](https://daniil.it/MadelineProto/API_docs/constructors/messageMediaDocument.html) object, an [EncryptedMessage](https://daniil.it/MadelineProto/API_docs/types/EncryptedMessage.html) or a bot API file id. These objects are usually received in updates, see `bot.php` for examples
|
||||
|
||||
|
||||
```
|
||||
$output_file_name = $MadelineProto->download_to_dir($message_media, '/tmp/dldir');
|
||||
$custom_output_file_name = $MadelineProto->download_to_file($message_media, '/tmp/dldir/customname.ext');
|
||||
$stream = fopen('php://output', 'w'); // Stream to browser like with echo
|
||||
$MadelineProto->download_to_stream($message_media, $stream, $cb, $offset, $endoffset); // offset and endoffset are optional parameters that specify the byte from which to start downloading and the byte where to stop downloading (the latter non-inclusive), if not specified default to 0 and the size of the file
|
||||
```
|
||||
|
||||
If an object of type User, InputUser, Chat, InputChannel, Peer or InputPeer must be provided as a parameter to a method, you can substitute it with the user/group/channel's username (`@username`) or bot API id (`-1029449`, `1249421`, `-100412412901`).
|
||||
|
||||
Methods that allow sending message entities ([messages.sendMessage](http://docs.madelineproto.xyz/API_docs/methods/messages_sendMessage.html) for example) also have an additional `parse_mode` parameter that enables or disables html/markdown parsing of the message to be sent. See the [method-specific](http://docs.madelineproto.xyz/API_docs/methods/messages_sendMessage.html) documentation for more info.
|
||||
|
||||
To convert the results of methods to bot API objects you must provide a second parameter to method wrappers, containing an array with the `botAPI` key set to true:
|
||||
|
||||
```
|
||||
$bot_API_object = $MadelineProto->messages->sendMessage(['peer' => '@danogentili', 'message' => 'lel'], ['botAPI' => true]);
|
||||
```
|
||||
|
||||
To disable fetching the result of a method, the array that must be provided as second parameter to method wrapper must have the `noResponse` key set to true.
|
||||
|
||||
```
|
||||
$MadelineProto->messages->sendMessage(['peer' => '@danogentili', 'message' => 'lel'], ['noResponse' => true]);
|
||||
```
|
||||
|
||||
reply_markup accepts bot API reply markup objects as well as MTProto ones.
|
||||
|
||||
```
|
||||
$MadelineProto->messages->sendMessage(['peer' => '@danogentili', 'message' => 'lel', 'reply_markup' => $MTProto_markup]);
|
||||
$MadelineProto->messages->sendMessage(['peer' => '@danogentili', 'message' => 'lel', 'reply_markup' => $bot_API_markup]);
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Instantiation
|
||||
|
||||
```
|
||||
$MadelineProto = new \danog\MadelineProto\API();
|
||||
```
|
||||
|
||||
|
||||
### RTFM
|
||||
|
||||
|
||||
If you have some questions about the usage of the methods of this library, you can join the [support group](https://telegram.me/pwrtelegramgroup) or contact [@danogentili](https://telegram.me/danogentili).
|
||||
|
||||
But first, please read this WHOLE page very carefully, follow all links to external documentation, and read all examples in the repo (bot.php, bots/, tests/testing.php).
|
||||
@ -94,29 +228,6 @@ I can offer support, however, when it comes to MadelineProto bugs or problems in
|
||||
|
||||
If you're selling a MadelineProto base too, you really should consider donating at least 20% of the price of the base: [this is my PayPal](https://paypal.me/danog).
|
||||
|
||||
### Installation
|
||||
|
||||
```
|
||||
git clone https://github.com/danog/MadelineProto
|
||||
cd MadelineProto
|
||||
```
|
||||
|
||||
Now copy .env.example to .env, edit its values, read the docs and take a look at tests/testing.php, bot.php.
|
||||
|
||||
### Dependencies
|
||||
|
||||
To install dependencies install composer and run:
|
||||
```
|
||||
composer update
|
||||
```
|
||||
In the cloned repo.
|
||||
|
||||
|
||||
### Instantiation
|
||||
|
||||
```
|
||||
$MadelineProto = new \danog\MadelineProto\API();
|
||||
```
|
||||
|
||||
### Settings
|
||||
|
||||
@ -374,43 +485,6 @@ Works like [socket_getpeername](http://php.net/manual/en/function.socket-getpeer
|
||||
Works like [socket_getsockname](http://php.net/manual/en/function.socket-getsockname.php): the difference is that it returns an array with the `host` and the `port`.
|
||||
|
||||
|
||||
### Uploading and downloading files
|
||||
|
||||
MadelineProto provides wrapper methods to upload and download files that support bot API file ids.
|
||||
|
||||
Every method described in this section accepts a last optional paramater with a callable function that will be called during the upload/download using the first parameter to pass a floating point number indicating the upload/download status in percentage.
|
||||
|
||||
The upload method returns an [InputFile](https://daniil.it/MadelineProto/API_docs/types/InputFile.html) object that must be used to generate an [InputMedia](https://daniil.it/MadelineProto/API_docs/types/InputMedia.html) object, that can be later sent using the [sendmedia method](https://daniil.it/MadelineProto/API_docs/methods/messages_sendMedia.html).
|
||||
|
||||
The `upload_encrypted` method returns an [InputEncryptedFile](https://daniil.it/MadelineProto/API_docs/types/InputEncryptedFile.html) object that must be used to generate an [EncryptedMessage](https://daniil.it/MadelineProto/API_docs/types/EncryptedMessage.html) object, that can be later sent using the [sendEncryptedFile method](https://daniil.it/MadelineProto/API_docs/methods/messages_sendEncryptedFile.html).
|
||||
|
||||
|
||||
```
|
||||
$inputFile = $MadelineProto->upload('file', 'optional new file name.ext');
|
||||
// Generate an inputMedia object and store it in $inputMedia, see tests/testing.php
|
||||
$MadelineProto->messages->sendMedia(['peer' => '@pwrtelegramgroup', 'media' => $inputMedia]);
|
||||
|
||||
$inputEncryptedFile = $MadelineProto->upload_encrypted('file', 'optional new file name.ext');
|
||||
|
||||
```
|
||||
|
||||
To convert the result of sendMedia to a bot API file id select the messageMedia object from the output of the method and pass it to `$MadelineProto->API->MTProto_to_botAPI()`.
|
||||
|
||||
See tests/testing.php for more examples.
|
||||
|
||||
|
||||
There are multiple download methods that allow you to download a file to a directory, to a file or to a stream.
|
||||
The first parameter of these functions must always be either a [messageMediaPhoto](https://daniil.it/MadelineProto/API_docs/constructors/messageMediaPhoto.html) or a [messageMediaDocument](https://daniil.it/MadelineProto/API_docs/constructors/messageMediaDocument.html) object, an [EncryptedMessage](https://daniil.it/MadelineProto/API_docs/types/EncryptedMessage.html) or a bot API file id. These objects are usually received in updates, see `bot.php` for examples
|
||||
|
||||
|
||||
```
|
||||
$output_file_name = $MadelineProto->download_to_dir($message_media, '/tmp/dldir');
|
||||
$custom_output_file_name = $MadelineProto->download_to_file($message_media, '/tmp/dldir/customname.ext');
|
||||
$stream = fopen('php://output', 'w'); // Stream to browser like with echo
|
||||
$MadelineProto->download_to_stream($message_media, $stream, $cb, $offset, $endoffset); // offset and endoffset are optional parameters that specify the byte from which to start downloading and the byte where to stop downloading (the latter non-inclusive), if not specified default to 0 and the size of the file
|
||||
```
|
||||
|
||||
|
||||
### Calls
|
||||
|
||||
MadelineProto provides an easy wrapper to work with phone calls.
|
||||
@ -538,59 +612,6 @@ td-cli wrappers are also present: you can use the tdcli_function in lua and pass
|
||||
For examples, see `lua/*`.
|
||||
|
||||
|
||||
### Calling mtproto methods and available wrappers
|
||||
|
||||
The API documentation can be found [here](https://daniil.it/MadelineProto/API_docs/).
|
||||
To call an MTProto method simply call it as if it is a method of the API class, substitute namespace sepators (.) with -> if needed.
|
||||
Also, an object of type User, InputUser, Chat, InputChannel, Peer or InputPeer must be provided as a parameter to a method, you can substitute it with the user/group/channel's username or bot API id.
|
||||
|
||||
```
|
||||
$MadelineProto = new \danog\MadelineProto\API();
|
||||
$checkedPhone = $MadelineProto->auth->checkPhone( // auth.checkPhone becomes auth->checkPhone
|
||||
[
|
||||
'phone_number' => '3993838383', // Random invalid number, note that there should be no +
|
||||
]
|
||||
);
|
||||
$ping = $MadelineProto->ping([3]); // parameter names can be omitted as long as the order specified by the TL scheme is respected
|
||||
$message = "Hey! I'm sending this message with MadelineProto!";
|
||||
$sentMessage = $MadelineProto->messages->sendMessage(['peer' => '@danogentili', 'message' => $message]);
|
||||
var_dump($sentMessage);
|
||||
|
||||
$me = $MadelineProto->get_self(); // This gets info about the currently logged in user as a User object
|
||||
```
|
||||
|
||||
The API class also provides some wrapper methods for logging in as a bot or as a normal user, and for getting inputPeer constructors to use in sendMessage and other methods:
|
||||
|
||||
```
|
||||
$sentCode = $MadelineProto->phone_login($number); // Send code
|
||||
var_dump($sentCode);
|
||||
echo 'Enter the code you received: ';
|
||||
$code = '';
|
||||
for ($x = 0; $x < $sentCode['type']['length']; $x++) {
|
||||
$code .= fgetc(STDIN);
|
||||
}
|
||||
$authorization = $MadelineProto->complete_phone_login($code); // Complete authorization
|
||||
var_dump($authorization);
|
||||
|
||||
$authorization = $MadelineProto->bot_login($token); // Note that every time you login as a bot or as a user MadelineProto will logout first, so now MadelineProto is logged in as the bot with token $token, not as the user with number $number
|
||||
var_dump($authorization);
|
||||
```
|
||||
|
||||
See tests/testing.php for more examples.
|
||||
|
||||
Use `get_pwr_chat` to get chat info, see [here for the parameters and the result](https://daniil.it/MadelineProto/get_pwr_chat.html).
|
||||
You can also use `get_info` to get chat info, see [here for the parameters and the result](https://daniil.it/MadelineProto/get_info.html)You can also use `get_full_info` to get chat info, see [here for the parameters and the result](https://daniil.it/MadelineProto/get_full_info.html).
|
||||
|
||||
Methods that allow sending message entities (messages.sendMessage for example) also have an additional parse_mode parameter that enables or disables html/markdown parsing of the message to be sent. See the method-specific documentation for more info.
|
||||
|
||||
To convert the results of methods to bot API objects you must provide a second parameter to method wrappers, containing an array with the `botAPI` key set to true.
|
||||
|
||||
To disable fetching the result of a method, the array that must be provided as second parameter to method wrapper must have the `noResponse` key set to true.
|
||||
|
||||
reply_markup accepts bot API reply markup objects as well as MTProto ones.
|
||||
|
||||
Note that when you login as a bot, MadelineProto also logins using the [PWRTelegram](https://pwrtelegram.xyz) API, to allow persistant storage of peers, even after a logout and another login.
|
||||
|
||||
### Storing sessions
|
||||
|
||||
An istance of MadelineProto can be safely serialized or unserialized. To serialize MadelineProto to a file, you must use the `\danog\MadelineProto\Serialization` class:
|
||||
@ -623,6 +644,23 @@ MadelineProto can throw lots of different exceptions:
|
||||
* \danog\MadelineProto\TL\Conversion\Exception - Thrown if some param/object can't be converted to/from bot API/TD/TD-CLI format (this includes markdown/html parsing)
|
||||
|
||||
|
||||
## Credits
|
||||
|
||||
Created by [Daniil Gentili](https://daniil.it), licensed under AGPLv3, based on [telepy](https://github.com/griganton/telepy_old).
|
||||
|
||||
While writing this client, I looked at many projects for inspiration and help. Here's the full list:
|
||||
|
||||
* [tgl](https://github.com/vysheng/tgl)
|
||||
|
||||
* [Kotlogram](https://github.com/badoualy/kotlogram)
|
||||
|
||||
* [Webogram](https://github.com/zhukov/webogram)
|
||||
|
||||
* [Telethon](https://github.com/LonamiWebs/Telethon/)
|
||||
|
||||
Thanks to the devs that contributed to these projects, MadelineProto is now an easy, well-written and complete MTProto client.
|
||||
|
||||
|
||||
## Contributing
|
||||
|
||||
[Here](https://github.com/danog/MadelineProto/projects/1) you can find this project's roadmap.
|
||||
|
13
bot.php
13
bot.php
@ -10,6 +10,7 @@ See the GNU Affero General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License along with MadelineProto.
|
||||
If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
set_include_path(get_include_path().':'.realpath(dirname(__FILE__).'/MadelineProto/'));
|
||||
|
||||
require 'vendor/autoload.php';
|
||||
$settings = ['app_info' => ['api_id' => 6, 'api_hash' => 'eb06d4abfb49dc3eeb1aeb98ae0f581e']];
|
||||
@ -18,15 +19,9 @@ try {
|
||||
$MadelineProto = \danog\MadelineProto\Serialization::deserialize('bot.madeline');
|
||||
} catch (\danog\MadelineProto\Exception $e) {
|
||||
var_dump($e->getMessage());
|
||||
if (file_exists('token.php')) {
|
||||
require_once 'token.php';
|
||||
$MadelineProto = new \danog\MadelineProto\API($settings);
|
||||
$authorization = $MadelineProto->bot_login($token);
|
||||
\danog\MadelineProto\Logger::log([$authorization], \danog\MadelineProto\Logger::NOTICE);
|
||||
} else {
|
||||
echo 'token.php does not exist';
|
||||
die;
|
||||
}
|
||||
$MadelineProto = new \danog\MadelineProto\API($settings);
|
||||
$authorization = $MadelineProto->bot_login(readline('Enter a bot token: '));
|
||||
\danog\MadelineProto\Logger::log([$authorization], \danog\MadelineProto\Logger::NOTICE);
|
||||
}
|
||||
//var_dump($MadelineProto->API->get_config([], ['datacenter' => $MadelineProto->API->datacenter->curdc]));
|
||||
//var_dump($MadelineProto->API->settings['connection']);
|
||||
|
46
callbot.php
46
callbot.php
@ -1,46 +0,0 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/*
|
||||
Copyright 2016-2017 Daniil Gentili
|
||||
(https://daniil.it)
|
||||
This file is part of MadelineProto.
|
||||
MadelineProto is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
MadelineProto is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License along with MadelineProto.
|
||||
If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
require 'vendor/autoload.php';
|
||||
$settings = [];
|
||||
|
||||
try {
|
||||
$MadelineProto = \danog\MadelineProto\Serialization::deserialize('calls.madeline');
|
||||
} catch (\danog\MadelineProto\Exception $e) {
|
||||
}
|
||||
$offset = 0;
|
||||
while (true) {
|
||||
$updates = $MadelineProto->API->get_updates(['offset' => $offset, 'limit' => 50, 'timeout' => 0]); // Just like in the bot API, you can specify an offset, a limit and a timeout
|
||||
\danog\MadelineProto\Logger::log([$updates]);
|
||||
foreach ($updates as $update) {
|
||||
$offset = $update['update_id'] + 1; // Just like in the bot API, the offset must be set to the last update_id
|
||||
switch ($update['update']['_']) {
|
||||
case 'updateNewMessage':
|
||||
if (isset($update['update']['message']['out']) && $update['update']['message']['out']) {
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
if ($update['update']['message']['message'] === 'callstorm') {
|
||||
$MadelineProto->messages->sendMessage(['peer' => $update['update']['message']['from_id'], 'message' => 'callstorming you', 'reply_to_msg_id' => $update['update']['message']['id']]);
|
||||
echo 'Wrote '.\danog\MadelineProto\Serialization::serialize('calls.madeline', $MadelineProto).' bytes'.PHP_EOL;
|
||||
shell_exec('php calls.php '.escapeshellarg($update['update']['message']['from_id']).' 100 >>calls 2>>calls & ');
|
||||
}
|
||||
} catch (\danog\MadelineProto\RPCErrorException $e) {
|
||||
$MadelineProto->messages->sendMessage(['peer' => '@danogentili', 'message' => $e->getCode().': '.$e->getMessage().PHP_EOL.$e->getTraceAsString()]);
|
||||
} catch (\danog\MadelineProto\Exception $e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
echo 'Wrote '.\danog\MadelineProto\Serialization::serialize('calls.madeline', $MadelineProto).' bytes'.PHP_EOL;
|
||||
}
|
72
calls.php
72
calls.php
@ -1,72 +0,0 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/*
|
||||
Copyright 2016-2017 Daniil Gentili
|
||||
(https://daniil.it)
|
||||
This file is part of MadelineProto.
|
||||
MadelineProto is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
MadelineProto is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License along with MadelineProto.
|
||||
If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
require_once 'vendor/autoload.php';
|
||||
if (file_exists('web_data.php')) {
|
||||
require_once 'web_data.php';
|
||||
}
|
||||
|
||||
echo 'Deserializing MadelineProto from calls.madeline...'.PHP_EOL;
|
||||
$MadelineProto = false;
|
||||
|
||||
try {
|
||||
$MadelineProto = \danog\MadelineProto\Serialization::deserialize('calls.madeline');
|
||||
} catch (\danog\MadelineProto\Exception $e) {
|
||||
}
|
||||
if (file_exists('.env')) {
|
||||
echo 'Loading .env...'.PHP_EOL;
|
||||
$dotenv = new Dotenv\Dotenv(getcwd());
|
||||
$dotenv->load();
|
||||
}
|
||||
|
||||
echo 'Loading settings...'.PHP_EOL;
|
||||
$settings = json_decode(getenv('MTPROTO_SETTINGS'), true) ?: [];
|
||||
|
||||
if ($MadelineProto === false) {
|
||||
echo 'Loading MadelineProto...'.PHP_EOL;
|
||||
$MadelineProto = new \danog\MadelineProto\API($settings);
|
||||
if (getenv('TRAVIS_COMMIT') == '') {
|
||||
$checkedPhone = $MadelineProto->auth->checkPhone(// auth.checkPhone becomes auth->checkPhone
|
||||
[
|
||||
'phone_number' => getenv('MTPROTO_NUMBER'),
|
||||
]
|
||||
);
|
||||
\danog\MadelineProto\Logger::log([$checkedPhone], \danog\MadelineProto\Logger::NOTICE);
|
||||
$sentCode = $MadelineProto->phone_login(getenv('MTPROTO_NUMBER'));
|
||||
\danog\MadelineProto\Logger::log([$sentCode], \danog\MadelineProto\Logger::NOTICE);
|
||||
echo 'Enter the code you received: ';
|
||||
$code = fgets(STDIN, (isset($sentCode['type']['length']) ? $sentCode['type']['length'] : 5) + 1);
|
||||
$authorization = $MadelineProto->complete_phone_login($code);
|
||||
\danog\MadelineProto\Logger::log([$authorization], \danog\MadelineProto\Logger::NOTICE);
|
||||
if ($authorization['_'] === 'account.noPassword') {
|
||||
throw new \danog\MadelineProto\Exception('2FA is enabled but no password is set!');
|
||||
}
|
||||
if ($authorization['_'] === 'account.password') {
|
||||
\danog\MadelineProto\Logger::log(['2FA is enabled'], \danog\MadelineProto\Logger::NOTICE);
|
||||
$authorization = $MadelineProto->complete_2fa_login(readline('Please enter your password (hint '.$authorization['hint'].'): '));
|
||||
}
|
||||
if ($authorization['_'] === 'account.needSignup') {
|
||||
\danog\MadelineProto\Logger::log(['Registering new user'], \danog\MadelineProto\Logger::NOTICE);
|
||||
$authorization = $MadelineProto->complete_signup(readline('Please enter your first name: '), readline('Please enter your last name (can be empty): '));
|
||||
}
|
||||
echo 'Serializing MadelineProto to calls.madeline...'.PHP_EOL;
|
||||
echo 'Wrote '.\danog\MadelineProto\Serialization::serialize('calls.madeline', $MadelineProto).' bytes'.PHP_EOL;
|
||||
} else {
|
||||
$MadelineProto->bot_login(getenv('BOT_TOKEN'));
|
||||
}
|
||||
}
|
||||
for ($x = 0; $x < $argv[2]; $x++) {
|
||||
$MadelineProto->request_call($argv[1]);
|
||||
$MadelineProto->get_updates_difference();
|
||||
echo 'Wrote '.\danog\MadelineProto\Serialization::serialize('session.madeline', $MadelineProto).' bytes'.PHP_EOL;
|
||||
}
|
||||
$MadelineProto->messages->sendMessage(['peer' => $argv[1], 'message' => '<a href="https://github.com/danog/MadelineProto">Powered by MadelineProto</a>', 'parse_mode' => 'markdown']);
|
23
docs/bot_login.md
Normal file
23
docs/bot_login.md
Normal file
@ -0,0 +1,23 @@
|
||||
---
|
||||
title: bot_login
|
||||
description: bot_login parameters, return type and example
|
||||
---
|
||||
## Method: bot_login
|
||||
|
||||
|
||||
### Parameters:
|
||||
|
||||
| Name | Type |
|
||||
|----------|:-------------:|
|
||||
|token| A string with the bot token|
|
||||
|
||||
### Return type: [auth.Authorization](API_docs/types/auth_Authorization.md)
|
||||
|
||||
### Example:
|
||||
|
||||
|
||||
```
|
||||
$MadelineProto = new \danog\MadelineProto\API();
|
||||
|
||||
$authorization = $this->bot_login($token);
|
||||
```
|
34
docs/complete_2FA_login.md
Normal file
34
docs/complete_2FA_login.md
Normal file
@ -0,0 +1,34 @@
|
||||
---
|
||||
title: complete_2FA_login
|
||||
description: complete_2FA_login parameters, return type and example
|
||||
---
|
||||
## Method: complete_2FA_login
|
||||
|
||||
|
||||
### Parameters:
|
||||
|
||||
| Name | Type |
|
||||
|----------|:-------------:|
|
||||
|password| A string with the password|
|
||||
|
||||
### Return type: [auth.Authorization](API_docs/types/auth_Authorization.md)
|
||||
|
||||
### Example:
|
||||
|
||||
|
||||
```
|
||||
$MadelineProto = new \danog\MadelineProto\API();
|
||||
|
||||
$MadelineProto->phone_login(readline('Enter your phone number: '));
|
||||
$authorization = $MadelineProto->complete_phone_login(readline('Enter the code you received: '));
|
||||
if ($authorization['_'] === 'account.noPassword') {
|
||||
throw new \danog\MadelineProto\Exception('2FA is enabled but no password is set!');
|
||||
}
|
||||
if ($authorization['_'] === 'account.password') {
|
||||
$authorization = $MadelineProto->complete_2fa_login(readline('Please enter your password (hint '.$authorization['hint'].'): '));
|
||||
}
|
||||
if ($authorization['_'] === 'account.needSignup') {
|
||||
$authorization = $MadelineProto->complete_signup(readline('Please enter your first name: '), readline('Please enter your last name (can be empty): '));
|
||||
}
|
||||
|
||||
```
|
36
docs/complete_phone_login.md
Normal file
36
docs/complete_phone_login.md
Normal file
@ -0,0 +1,36 @@
|
||||
---
|
||||
title: complete_phone_login
|
||||
description: complete_phone_login parameters, return type and example
|
||||
---
|
||||
## Method: complete\_phone\_login
|
||||
|
||||
|
||||
### Parameters:
|
||||
|
||||
| Name | Type |
|
||||
|----------|:-------------:|
|
||||
|code| A string with the phone code|
|
||||
|
||||
### Return type: [auth.Authorization](API_docs/types/auth_Authorization.md) or [account.Password](http://docs.madelineproto.xyz/API_docs/types/account_Password.html) or `['_' => 'account.needSignup']`
|
||||
|
||||
You must then use [complete_2FA_login](complete_2FA_login.md) or [complete_signup](complete_signup.md) to login or signup, or simply start using `$MadelineProto` if the result is a `auth.Authorization` object.
|
||||
|
||||
### Example:
|
||||
|
||||
|
||||
```
|
||||
$MadelineProto = new \danog\MadelineProto\API();
|
||||
|
||||
$MadelineProto->phone_login(readline('Enter your phone number: '));
|
||||
$authorization = $MadelineProto->complete_phone_login(readline('Enter the code you received: '));
|
||||
if ($authorization['_'] === 'account.noPassword') {
|
||||
throw new \danog\MadelineProto\Exception('2FA is enabled but no password is set!');
|
||||
}
|
||||
if ($authorization['_'] === 'account.password') {
|
||||
$authorization = $MadelineProto->complete_2fa_login(readline('Please enter your password (hint '.$authorization['hint'].'): '));
|
||||
}
|
||||
if ($authorization['_'] === 'account.needSignup') {
|
||||
$authorization = $MadelineProto->complete_signup(readline('Please enter your first name: '), readline('Please enter your last name (can be empty): '));
|
||||
}
|
||||
|
||||
```
|
35
docs/complete_signup.md
Normal file
35
docs/complete_signup.md
Normal file
@ -0,0 +1,35 @@
|
||||
---
|
||||
title: complete_signup
|
||||
description: complete_signup parameters, return type and example
|
||||
---
|
||||
## Method: complete_signup
|
||||
|
||||
|
||||
### Parameters:
|
||||
|
||||
| Name | Type |
|
||||
|----------|:-------------:|
|
||||
|first_name| A string with the first name|
|
||||
|last_name| Optional, string with the last name|
|
||||
|
||||
### Return type: [auth.Authorization](API_docs/types/auth_Authorization.md)
|
||||
|
||||
### Example:
|
||||
|
||||
|
||||
```
|
||||
$MadelineProto = new \danog\MadelineProto\API();
|
||||
|
||||
$MadelineProto->phone_login(readline('Enter your phone number: '));
|
||||
$authorization = $MadelineProto->complete_phone_login(readline('Enter the code you received: '));
|
||||
if ($authorization['_'] === 'account.noPassword') {
|
||||
throw new \danog\MadelineProto\Exception('2FA is enabled but no password is set!');
|
||||
}
|
||||
if ($authorization['_'] === 'account.password') {
|
||||
$authorization = $MadelineProto->complete_2fa_login(readline('Please enter your password (hint '.$authorization['hint'].'): '));
|
||||
}
|
||||
if ($authorization['_'] === 'account.needSignup') {
|
||||
$authorization = $MadelineProto->complete_signup(readline('Please enter your first name: '), readline('Please enter your last name (can be empty): '));
|
||||
}
|
||||
|
||||
```
|
41
docs/get_dialogs.md
Normal file
41
docs/get_dialogs.md
Normal file
@ -0,0 +1,41 @@
|
||||
---
|
||||
title: get_dialogs
|
||||
description: get_dialogs parameters, return type and example
|
||||
---
|
||||
## Method: get_dialogs
|
||||
|
||||
|
||||
### Parameters:
|
||||
|
||||
| Name | Type |
|
||||
|----------|:-------------:|
|
||||
|
||||
### Return type: Array of [Peer objects](API_docs/types/Peer.md)
|
||||
|
||||
### Example:
|
||||
|
||||
|
||||
```
|
||||
$MadelineProto = new \danog\MadelineProto\API();
|
||||
if (isset($token)) {
|
||||
$this->bot_login($token);
|
||||
}
|
||||
if (isset($number)) {
|
||||
$sentCode = $MadelineProto->phone_login($number);
|
||||
echo 'Enter the code you received: ';
|
||||
$code = '';
|
||||
for ($x = 0; $x < $sentCode['type']['length']; $x++) {
|
||||
$code .= fgetc(STDIN);
|
||||
}
|
||||
$MadelineProto->complete_phone_login($code);
|
||||
}
|
||||
|
||||
$Peers = $MadelineProto->get_dialogs();
|
||||
```
|
||||
|
||||
Or, if you're into Lua:
|
||||
|
||||
```
|
||||
Peers = get_dialogs(true)
|
||||
```
|
||||
|
41
docs/get_self.md
Normal file
41
docs/get_self.md
Normal file
@ -0,0 +1,41 @@
|
||||
---
|
||||
title: get_self
|
||||
description: get_self parameters, return type and example
|
||||
---
|
||||
## Method: get_self
|
||||
|
||||
|
||||
### Parameters:
|
||||
|
||||
| Name | Type |
|
||||
|----------|:-------------:|
|
||||
|
||||
### Return type: [User objects](API_docs/types/User.md)
|
||||
|
||||
### Example:
|
||||
|
||||
|
||||
```
|
||||
$MadelineProto = new \danog\MadelineProto\API();
|
||||
if (isset($token)) {
|
||||
$this->bot_login($token);
|
||||
}
|
||||
if (isset($number)) {
|
||||
$sentCode = $MadelineProto->phone_login($number);
|
||||
echo 'Enter the code you received: ';
|
||||
$code = '';
|
||||
for ($x = 0; $x < $sentCode['type']['length']; $x++) {
|
||||
$code .= fgetc(STDIN);
|
||||
}
|
||||
$MadelineProto->complete_phone_login($code);
|
||||
}
|
||||
|
||||
$User = $MadelineProto->get_self();
|
||||
```
|
||||
|
||||
Or, if you're into Lua:
|
||||
|
||||
```
|
||||
User = get_self()
|
||||
```
|
||||
|
37
docs/phone_login.md
Normal file
37
docs/phone_login.md
Normal file
@ -0,0 +1,37 @@
|
||||
---
|
||||
title: phone_login
|
||||
description: phone_login parameters, return type and example
|
||||
---
|
||||
## Method: phone_login
|
||||
|
||||
|
||||
### Parameters:
|
||||
|
||||
| Name | Type |
|
||||
|----------|:-------------:|
|
||||
|number| A string with the phone number, including the country code|
|
||||
|
||||
### Return type: [auth.SentCode](API_docs/types/auth_SentCode.md)
|
||||
|
||||
You must then use [complete_phone_login](complete_phone_login.md)
|
||||
|
||||
|
||||
### Example:
|
||||
|
||||
|
||||
```
|
||||
$MadelineProto = new \danog\MadelineProto\API();
|
||||
|
||||
$MadelineProto->phone_login(readline('Enter your phone number: '));
|
||||
$authorization = $MadelineProto->complete_phone_login(readline('Enter the code you received: '));
|
||||
if ($authorization['_'] === 'account.noPassword') {
|
||||
throw new \danog\MadelineProto\Exception('2FA is enabled but no password is set!');
|
||||
}
|
||||
if ($authorization['_'] === 'account.password') {
|
||||
$authorization = $MadelineProto->complete_2fa_login(readline('Please enter your password (hint '.$authorization['hint'].'): '));
|
||||
}
|
||||
if ($authorization['_'] === 'account.needSignup') {
|
||||
$authorization = $MadelineProto->complete_signup(readline('Please enter your first name: '), readline('Please enter your last name (can be empty): '));
|
||||
}
|
||||
```
|
||||
|
@ -10,6 +10,8 @@ See the GNU Affero General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License along with MadelineProto.
|
||||
If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
set_include_path(get_include_path().':'.realpath(dirname(__FILE__).'/MadelineProto/'));
|
||||
|
||||
require_once 'vendor/autoload.php';
|
||||
if (file_exists('web_data.php')) {
|
||||
require_once 'web_data.php';
|
||||
|
@ -10,6 +10,7 @@ See the GNU Affero General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License along with MadelineProto.
|
||||
If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
set_include_path(get_include_path().':'.realpath(dirname(__FILE__).'/MadelineProto/'));
|
||||
require_once 'vendor/autoload.php';
|
||||
if (file_exists('web_data.php')) {
|
||||
require_once 'web_data.php';
|
||||
|
@ -14,7 +14,7 @@ namespace danog\MadelineProto\Wrappers;
|
||||
|
||||
trait DialogHandler
|
||||
{
|
||||
public function get_dialogs($force = false)
|
||||
public function get_dialogs($force = true)
|
||||
{
|
||||
if (!isset($this->dialog_params['offset_date']) || $force || is_null($this->dialog_params['offset_date'])) {
|
||||
$this->dialog_params = ['limit' => 0, 'offset_date' => 0, 'offset_id' => 0, 'offset_peer' => ['_' => 'inputPeerEmpty'], 'count' => 0];
|
||||
|
@ -10,6 +10,7 @@ See the GNU Affero General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License along with MadelineProto.
|
||||
If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
set_include_path(get_include_path().':'.realpath(dirname(__FILE__).'/../').realpath(dirname(__FILE__).'/../MadelineProto/'));
|
||||
chdir(dirname(__FILE__).'/../');
|
||||
require_once 'vendor/autoload.php';
|
||||
if (file_exists('web_data.php')) {
|
||||
|
Loading…
Reference in New Issue
Block a user