«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2019/06/10 12:39:09  №1414520 1
https://habr.com/ru/post/348234/
Можете мне коротко расписать, как реализовать это на php (без библиотек)? Не понимаю, как он взаимодействует с "агентом".
Вот есть у меня ссылка на файл, который я гружу на сервер телеграма через API и работаю уже с полученным file id. Ограничение на ссылки даже не 50, а 20 мб - беда. Как мне взаимодействовать с зарегистрированным приложением, чтобы грузить файлы больше 20 и 50 мб, имея только ссылку?
Ответы: >>1414548 >>1414756
Аноним 2019/06/10 13:53:32  №1414548 2
>>1414520
Или, может, есть подходящая библиотека для работы с api приложения. Потому что я пока не понимаю, как работать с теми методами.
Ответы: >>1414756
Аноним 2019/06/11 04:48:12  №1414756 3
>>1414520
> как реализовать это на php (без библиотек)?
Никак. Для общения с серверами телеграма нужно использовать их протокол - mtproto, у телеграма нет REST API как у других сервисов. Нужна библиотека, которая умеет по этому протоколу общаться, например: https://github.com/danog/MadelineProto
По моему опыту библиотека просто отвратительная, постоянно ломают API, всё на магических методах, запутанный код внутри: https://github.com/danog/MadelineProto/blob/master/src/danog/MadelineProto/TL/TL.php

>>1414548
Алгоритм простой - регистрируешь приложение на сайте телеграма, получаешь ключи и с этими ключами логинишься в скрипте, у MadelineProto есть готовый скрипт, нужно будет ввести номер и дальше можно пользоваться API пользователя (не бота).
Ответы: >>1414799 >>1414802 >>1415145
Аноним 2019/06/12 08:48:58  №1415145 4
>>1414756
Так и не проверил, работает ли отправка файла со ссылки. Но обнаружил проблему при использовании бот апи. Долго искал, в чем проблема - ошибку не возвращал ни телеграм, ни curl - ссылка просто не открывалась. Обнаружил, что дело в описании файла, которое парсится, как и сама ссылка на файл. Curl только пару раз (во время экспериментов) возвращал ошибку "Curl option contains invalid characters (\0)", но обычно молча отказывался открывать ссылку. Описание, на вид, на латинице. Кодировка utf-8. Но в чём же проблема? Постоянно какая-то хуйня с этими кодировками. Я просто уже не знаю, как мне обрабатывать строку, чтобы с ней не было проблем. Хелп ми!
Ответы: >>1415175 >>1415689
Аноним 2019/06/12 09:48:28  №1415175 5
3.jpg (77, 1397x87)
87x1397
>>1415145
Попробовал оставить только латиницу, даже пробелы с цифрами убрал, но всё равно именно эта строка не работает. Я уже вообще не понимаю, как такое может быть. Вот, заскринил, работает только последняя строка, а предыдущие 2 не возвращают ничего - ни ошибки curl, ни ошибки телеграм api. Как так? Таких 2 описания из 30 где-то.
Ответы: >>1415191 >>1415689
Аноним 2019/06/13 08:37:38  №1415689 6
ОП, меня пропустил. Помоги, пожалуйста:
>>1415145
>>1415175
Ответы: >>1415733
Аноним 2019/06/13 09:24:56  №1415733 7
>>1415689

Ты, возможно, неправильно формируешь ссылки и подставляешь в них параметры. Прочти урок про URL и проверь, соответствует ли твой код тому, что там написано и не может ли быть проблема в этом: https://github.com/codedokode/pasta/blob/master/network/urls.md

Особенно внимательно изучи процентное кодирование и функции для работы со ссылками в PHP.

Далее, если это не поможет, то сдампь (echo) получающийся URL, и запости, токен при этом, конечно, надо скрыть. Посмотрим на URL.

Далее, я бы советовал тебе учиться отправлять запросы руками и смотреть, что в ответ приходит. Это можно сделать несколькими методами:

- утилитой curl (не php расширением) в командной строке
- программами с GUI вроде postman для отправки запросов

Мне больше нравится командная строка. Через эти программы ты можешь отправить запрос на сервер и увидеть, что приходит в ответ. Сделай это и тоже напиши.

Ответы: >>1415769
Аноним 2019/06/13 10:14:50  №1415769 8
>>1415733
Уже написал пост и понял, какой я идиот. Всего-то требовалось 3 дня всматриваться к код и забыть про очевидные вещи. У меня один!! пробел не был url-закодирован. Но почему этот пробел не вызывал ошибок в десятке случаев, а тут вызвал? Это единственное, что мне не ясно. Будь это ошибка везде сразу, я бы быстро нашел, в чём дело.

Тогда другие вопросы задам. Можно отсылать файл multipart/form-data, используя file_get_contents? Или что-то еще, загружающее файл из ссылки в оперативную память и отсылающую её в телеграм оттуда.
Ответы: >>1415806
Аноним 2019/06/13 11:52:06  №1415806 9
>>1415769

Заметь, что в мануале написано: https://www.php.net/manual/ru/function.file-get-contents.php

> Замечание:
> Если вы открываете URI, содержащий спецсимволы, такие как пробел, вам нужно закодировать URI при помощи urlencode().

Надеюсь, что ты освоил теперь кодирование спецсимволов.

Что касается отправки файла. У file_get_contents есть контекст, и в нем можно указывать опции HTTP-запроса. Смотри пример №4 в мануале: https://www.php.net/manual/ru/function.file-get-contents.php

Тут есть документация по опциям HTTP-контекста: https://www.php.net/manual/ru/context.http.php

Увы, судя по ней, тебе надо будет вручную кодировать тело запроса (содержимое файла и нужные заголовки). Справишься? Речь тут именно об отправке файла из оперативной памяти, а не о скачивании.

Я бы советовал освоить нормальную библиотеку вроде Guzzle, где отправка файла делается проще. Ну или расширение curl, хотя Guzzle по моему удобнее.
Ответы: >>1415831
Аноним 2019/06/13 12:27:04  №1415831 10
>>1415806
>Надеюсь, что ты освоил теперь кодирование спецсимволов.
Я и раньше освоил, просто я такой жути наговнокодил, что один пробел без urlencode оставил.
>У file_get_contents есть контекст
Да, я уже указал там ssl и прокси.
>Увы, судя по ней, тебе надо будет вручную кодировать тело запроса (содержимое файла и нужные заголовки). Справишься?
Не думаю. Добавил в контекст Content-Type: audio/mpeg, но файл всё еще не отправляется. Кусок:
'http' => array(
'header' => array("Proxy-Authorization: Basic $auth", 'Content-Type: audio/mpeg'),
Прокси работают, я проверил, открыв с file_get_contents yandex.ru/internet.
>Ну или расширение curl, хотя Guzzle по моему удобнее.
А как это провернуть curl'ом? Мне нужно отправить не ссылку, а файл, при этом не загружая его на сервер, потому что работа с файлами запрещена. Вот и думаю, как загрузить из оперативки.
Ответы: >>1415845
Аноним 2019/06/13 12:41:31  №1415845 11
Ответы: >>1415878
Аноним 2019/06/13 13:10:04  №1415878 12
>>1415845
Я просто не понимаю, что вообще требуется. Мне не от чего отталкиваться. Нужно увидеть правильный код, чтобы знать, где ошибки нет и где могут они быть. Я обычно так и учусь, от этого отталкиваюсь. Приходится учиться на своих ошибках, но зато запоминается лучше. А теория без этого непонятна, я прочитал 2 твои статьи и они мне ничего не дали.

Вот нужно мне получить файл в переменную $song, чтобы сделать:
$url = "https://api.telegram.org/bot$botapi/sendAudio";
$header = array('Content-Type:multipart/form-data');
$post = array(
'chat_id' => $chat_id,
'audio' => $song
);

curl_get_contents($url, $proxy, 0, $header, $post); //простая функция с curl

И как мне поможет Guzzle, curl или file_get_contents?

>Ты опять неправильно кодируешь тело запроса.
Разве? Это в контексте для file_get_contents, и... А, массивом оно не передается? Сделал так:
'header' => "Proxy-Authorization: Basic $auth\r\n" . "Content-Type: audio/mpeg",
Только я всё еще не могу отправить файл. Я могу отправить его, если просто скачаю в папку, или отправить его по ссылке. Но решить задачу в том виде, в котором она есть, уже не могу.