Автор | Сообщение |
|
| |
Пост N: 652
Зарегистрирован: 17.06.10
|
|
Отправлено: 24.10.22 10:21. Заголовок: Чатбот
Приветствую ! У каждого клиента свой чатбот. Ключи в базе и я могу разослать сообщения тому или иному на телефон. Все работает. Можно ли сделать так - бот только один, а клиенты, по токену, к нему подключаются ?
|
 |

|
Ответов - 35
, стр:
1
2
All
[только новые]
|
|
|
| |
Пост N: 1853
Зарегистрирован: 20.02.11
|
|
Отправлено: 24.10.22 19:16. Заголовок: fil пишет: fil пиш..
fil пишет: [quote]` fil пишет: цитата: | У каждого клиента свой чатбот. |
| Не понятно зачем у каждого свой. На то он и чат бот чтоб все запросы обрабатывать.. Каждому клиенту при обращении присваивается свой чат id. По нему и стройте логику ответов бота. По сути вопроса, да можете по ключу подключиться к любому боту, и контролировать общение этого бота. Только зачем их плодить.
|
 |

|
|
| |
Пост N: 653
Зарегистрирован: 17.06.10
|
|
Отправлено: 24.10.22 21:55. Заголовок: Хорошо. А как клиент..
Хорошо. А как подключиться к чужому боту дабы получить ID ?
|
 |

|
|
| |
Пост N: 1854
Зарегистрирован: 20.02.11
|
|
Отправлено: 24.10.22 22:26. Заголовок: fil пишет: Хорошо. ..
fil пишет: цитата: | Хорошо. А как подключиться к чужому боту дабы получить ID |
| примерно так function TestBot() local i := 0, n local odoc := CreateObject( "MSXML2.DOMDocument" ) local ohttp := CreateObject( "MSXML2.XMLHTTP" ) local URL:="https://api.telegram.org/bot"+cTOKEN+"/getUpdates?offset=-1" // cToken - токен полученный при регистрации бота local cJson local aHash := hb_hash() hb_cdpSelect( "RU866" ) HB_LANGSELECT( "RU" ) ohttp:Open( "POST" ,URL, .F. ) oHttp:SetRequestHeader("Accept" ,"application/xml") oHttp:SetRequestHeader("Content-Type","application/json") oDoc:async:=.f. oDoc:LoadXml('<?xml version=""1.0"" encoding=""utf-8""?>') oHttp:Send(oDoc:xml) cJson := Alltrim(oHttp:responseText) hb_JsonDecode( cJson, @aHash ) ? aHash["ok"] ? n := Len( aHash["result"] ) for i := 1 To n ? aHash["result"][n]["update_id"] ? aHash["result"][n]["message"]["message_id"] ? aHash["result"][n]["message"]["from"]["id"] ? aHash["result"][n]["message"]["from"]["is_bot"] ? aHash["result"][n]["message"]["from"]["first_name"] ? aHash["result"][n]["message"]["from"]["language_code"] ? aHash["result"][n]["message"]["chat"]["id"] // это и есть ChatID ? aHash["result"][n]["message"]["chat"]["first_name"] ? aHash["result"][n]["message"]["chat"]["type"] ? aHash["result"][n]["message"]["date"] ? aHash["result"][n]["message"]["text"] ? end ? sendmsg( hb_ntoc(aHash["result"][1]["message"]["chat"]["id"]) , "привет мир" ) // отправить сообщение в чат return nil function sendmsg(cChatId,cMsg) local odoc := CreateObject( "MSXML2.DOMDocument" ) local ohttp := CreateObject( "MSXML2.XMLHTTP" ) local cJson local cUrl := "https://api.telegram.org/bot"+cTOKEN+"/sendMessage?text=" + UUrlEncode(hb_strToUtf8( cMsg )) + "&chat_id="+cChatId+'"' local aHash := hb_Hash() ohttp:Open( "GET" ,cUrl, .F. ) ohttp:SetRequestHeader( "Accept" , "application/xml") ohttp:SetRequestHeader( "Content-Type" ,"application/json" ) oDoc:async := .f. oDoc:LoadXml('<?xml version=""1.0"" encoding=""utf-8""?>') ohttp:Send(oDoc:xml) cJson := oHttp:ResponseBody hb_JsonDecode( cJson, @aHash ) return aHash["ok"] FUNCTION UUrlEncode( cString ) LOCAL nI, cI, cRet := "" FOR nI := 1 TO Len( cString ) cI := SubStr( cString, nI, 1 ) IF cI == " " cRet += "+" ELSEIF Asc( cI ) >= 127 .OR. Asc( cI ) <= 31 .OR. cI $ '=&%+' cRet += "%" + hb_StrToHex( cI ) ELSE cRet += cI ENDIF NEXT RETURN cRet FUNCTION UUrlDecode( cString ) LOCAL nI cString := StrTran( cString, "+", " " ) nI := 1 DO WHILE nI <= Len( cString ) nI := hb_At( "%", cString, nI ) IF nI == 0 EXIT ENDIF IF Upper( SubStr( cString, nI + 1, 1 ) ) $ "0123456789ABCDEF" .AND. ; Upper( SubStr( cString, nI + 2, 1 ) ) $ "0123456789ABCDEF" cString := Stuff( cString, nI, 3, hb_HexToStr( SubStr( cString, nI + 1, 2 ) ) ) ENDIF nI++ ENDDO RETURN cString ЗЫ Для чтения состояния бота используется метод getUpdates из api телеграмма. тут покажет все новые сообщения с указанием от какого чат ID они получены для отправки клиенту используется метод SendMessage из api
|
 |

|
|
| |
Пост N: 654
Зарегистрирован: 17.06.10
|
|
Отправлено: 24.10.22 22:52. Заголовок: Ага, сенкс, завтра п..
Ага, сенкс, завтра пробну !!
|
 |

|
|
| |
Пост N: 655
Зарегистрирован: 17.06.10
|
|
Отправлено: 24.10.22 23:17. Заголовок: Хотя я не понимаю ка..
Хотя я не понимаю каким образом эта прога может сделать рассылку клиенту телеграмма ежели он заранее не подключен к боту /start
|
 |

|
|
| |
Пост N: 1855
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.10.22 08:06. Заголовок: fil пишет: Хотя я н..
fil пишет: цитата: | Хотя я не понимаю каким образом эта прога может сделать рассылку клиенту телеграмма ежели он заранее не подключен к боту /start |
| Никаким, клиент должен сначала войти в чат и получить чат id. После того по id бот может слать чего угодно
|
 |

|
|
| |
Пост N: 1856
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.10.22 08:50. Заголовок: Давайте кое что проя..
Давайте кое что проясним. 1 токен нужен для управления ботом , для того чтобы работать от имени бота 2. Клиент подключается к боту или по имени бота или по куар коду 3 как только клиент начал чат , этому чату присваивается id 4 клиент видит только свой чат в телеге 5 бот ( программа подключенная по токену ) видит все чаты и по id может выбирать клиента. 6 бот не может слать сообщения не своим клиентам. 7. Бот не может получить персональные данные клиентов. Он знает только имя под которым клиент зарегистрирован. 8. Опрос бота или в цикле ( потоке и пр ) или через web hook. В первом случае постоянно теребим телеграмм запросами , во втором постоянно мониторим порт. 9 Передавать боту и через бота клиенту можно любые данные . 10 бот регистрируется по телефонному номеру, соответственно кто то должен свой номер предоставить. Можно на фейковый номер ( есть сервисы предоставляющие эту услугу ), но с риском потери контроля над ботом.
|
 |

|
|
| |
Пост N: 656
Зарегистрирован: 17.06.10
|
|
Отправлено: 25.10.22 10:38. Заголовок: А могу-ли я писать в..
А могу-ли я писать в группу, дабы все участники видели ?
|
 |

|
|
| |
Пост N: 1857
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.10.22 10:54. Заголовок: fil пишет: могу-ли ..
fil пишет: цитата: | могу-ли я писать в группу, дабы все участники видели ? |
| Через бота, он разошлёт. Вроде есть еще возможность сделать бота модератором канала,
|
 |

|
|
| |
Пост N: 657
Зарегистрирован: 17.06.10
|
|
Отправлено: 25.10.22 11:10. Заголовок: Через бота, он разош..
Есть такая API функция ? Сам бот должен быть в группе?
|
 |

|
|
| |
Пост N: 1858
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.10.22 11:19. Заголовок: fil пишет: Есть так..
fil пишет: цитата: | Есть такая API функция ? Сам бот должен быть в группе? |
| Готовой нет, бот это ваша программа и она знает всех участников. Разумеется программ должна постоянно мониторить группу иначе это будет монолог клиента с пустотой. Простой пример бота я вам дал соберите , возможно поправки сделаете и запустите . далее из своего телеграмма напишите боту. Уверен половина вопросов исчезнет. Чат бот это ваша программа контроля чата, телеграмм апи дает вам место имя и доступ. Клиенты с подключением через мессенджер чужих записей не видят. С подключением из программы с токеном вы берете на себя роль бота и мониторите весь чат. Фиксируйте в базе чат id всех подключившихся и спамить им телегу сколько хотите.
|
 |

|
|
|
| |
Пост N: 1859
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.10.22 11:25. Заголовок: Все методы тут http..
|
 |

|
|
| |
Пост N: 658
Зарегистрирован: 17.06.10
|
|
Отправлено: 26.10.22 13:15. Заголовок: Из бота в группу тек..
Из бота в группу текст слать научился. Никак тока по русски не получается, все кракозябры. Хотя, вроде, в UTF-8
|
 |

|
|
| |
Пост N: 1860
Зарегистрирован: 20.02.11
|
|
Отправлено: 26.10.22 18:58. Заголовок: fil пишет: се крако..
fil пишет: Посмотри в моём примере , utf8 мало , нужно экранировать служебные символы
|
 |

|
|
| |
Пост N: 659
Зарегистрирован: 17.06.10
|
|
Отправлено: 26.10.22 19:35. Заголовок: Уж его то я попробов..
Уж его то я попробовал в первую очередь. Похоже дело в BOM
|
 |

|
|
| |
Пост N: 1861
Зарегистрирован: 20.02.11
|
|
Отправлено: 26.10.22 21:53. Заголовок: fil пишет: Похоже д..
fil пишет: Тогда надо искать причину, я не сталкивался с этим. Пример делал под консоль, проблем не ловил.
|
 |

|
|
| |
Пост N: 7998
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.11.24 18:40. Заголовок: Привет Игорь Haz пиш..
Привет Игорь Haz пишет: Пробовал затестить и вот на этой строке падает зараза "Ошибка загрузки указанного ресурса 0X800C0008 msxml3.dll " хрен знает что ему надо
|
 |

|
|
| |
Пост N: 358
Зарегистрирован: 05.10.06
|
|
Отправлено: 28.11.24 21:48. Заголовок: Dima пишет: Пробова..
Dima пишет: цитата: | Пробовал затестить и вот на этой строке падает зараза "Ошибка загрузки указанного ресурса 0X800C0008 msxml3.dll " хрен знает что ему надо |
| у меня тоже падало, в итоге так как многие методы через Get запросы работают, попробуй пустую строку отправить. А если нужно через POST то сформируй xml ручками, у меня вроде тесты прокатывали И еще, по умолчанию телега работает в режиме вэбхука, если ты будешь сам опрашивать, нужно его удалить, метод такой: cUrl:=::url+::token+"/deleteWebhook"
|
 |

|
|
| |
Пост N: 1979
Зарегистрирован: 20.02.11
|
|
Отправлено: 29.11.24 11:03. Заголовок: Dima пишет: этой ст..
Dima пишет: цитата: | этой строке падает зараза "Ошибка загрузки указанного ресурса 0X800C0008 msxml3.dll " хрен знает что ему надо |
| Дим, привет рад тебя слышать. Я сейчас в отпуске, не могу подробно посмотреть.Нет ноутбука с собой. По ошибке - скорее всего строка в методе сенд не нравится , попробуй любоу слово в английском. Или другой объект . HTTP создать , их много разных Попозже если доберусь до своих архивов напишу.
|
 |

|
|
| |
Пост N: 7999
Зарегистрирован: 17.05.05
|
|
Отправлено: 30.11.24 11:46. Заголовок: MIKHAIL пишет: cUrl..
MIKHAIL пишет: цитата: | cUrl:=::url+::token+"/deleteWebhook" |
| Спасибо , взял на заметку ! Haz пишет: цитата: | Попозже если доберусь до своих архивов напишу. |
| Игорь не нужно уже , вопрос решил с помощью LibCurl
|
 |

|
|
| |
Пост N: 8000
Зарегистрирован: 17.05.05
|
|
Отправлено: 30.11.24 19:18. Заголовок: MIKHAIL Привет. А н..
MIKHAIL Привет. А нет ли простого примерчика по отправке файла с компа в бот телеги для чата по ID ? На сколько долго живет инфа которая приходит при запросе /getUpdates?offset=-1 ? Сегодня знакомый кинул месагу в бота и я ее видел дав запрос , после часа через 4 я закинул в бот свою месагу и когда хотел увидеть обновления при запросе то увидел только свою месагу. Пробнул /deleteWebhook , ни каких особых изменений в getUpdates? не увидел
|
 |

|
|
|
| |
Пост N: 8001
Зарегистрирован: 17.05.05
|
|
Отправлено: 30.11.24 20:06. Заголовок: Dima пишет: На скол..
Dima пишет: цитата: | На сколько долго живет инфа которая приходит при запросе /getUpdates?offset=-1 ? |
| С этим я понял в плане offset , по прежнему UPDATE_ID инфу уже не вытянуть То есть получил в результате запроса UPDATE_ID с номером 10 допустим и пока я ходил курил , кто то боту кинул месагу , я вернулся снова сделал /getUpdates?offset=-1 , и уже получу UPDATE_ID с номером 11 а 10 кильнулся телегой
|
 |

|
|
| |
Пост N: 359
Зарегистрирован: 05.10.06
|
|
Отправлено: 30.11.24 21:56. Заголовок: Dima пишет: С этим ..
Dima пишет: цитата: | Пробнул /deleteWebhook , ни каких особых изменений в getUpdates? не увидел |
| Этот метод нужно тогда выполнять когда возникает ошибка error_code:409, которая указывает на то что телега работает в режиме webhook, иначе не получить обновления в чате Dima пишет: цитата: | С этим я понял в плане offset , по прежнему UPDATE_ID инфу уже не вытянуть То есть получил в результате запроса UPDATE_ID с номером 10 допустим и пока я ходил курил , кто то боту кинул месагу , я вернулся снова сделал /getUpdates?offset=-1 , и уже получу UPDATE_ID с номером 11 а 10 кильнулся телегой |
| я глубоко не копал, тоже только тестил, с этим сталкивался, я так понял нужно сразу в свою базу пихать, а вообще доку покури, много уже статей выложено, так же и по отправке файла, но я сам не пробовал отправлять. отправка документа и фото осуществляется методом POST 'https://api.telegram.org/bot'. $token .'/sendDocument' 'https://api.telegram.org/bot'. $token .'/sendPhoto' где в POST записываем поля $arrayQuery = array( 'chat_id' => 1424646511, 'caption' => 'Проверка работы', 'photo' => curl_file_create(__DIR__ . '/cat.jpg', 'image/jpg' , 'cat.jpg') ); $arrayQuery = array( 'chat_id' => 1424646511, 'caption' => 'Проверка работы', 'document' => curl_file_create(__DIR__ . '/cat.jpg', 'image/jpg' , 'cat.jpg') );
|
 |

|
|
| |
Пост N: 8002
Зарегистрирован: 17.05.05
|
|
Отправлено: 30.11.24 22:38. Заголовок: MIKHAIL Спасибо , ..
MIKHAIL Спасибо , не совсем ясно с кодом но что то буду думать , хотел код на Harbour MIKHAIL пишет: цитата: | Этот метод нужно тогда выполнять когда возникает ошибка error_code:409, которая указывает на то что телега работает в режиме webhook, иначе не получить обновления в чате |
| Понял тебя 
|
 |

|
|
| |
Пост N: 360
Зарегистрирован: 05.10.06
|
|
Отправлено: 01.12.24 10:04. Заголовок: Dima пишет: не сов..
Dima пишет: цитата: | не совсем ясно с кодом но что то буду думать , хотел код на Harbour |
| а что именно не понятно ? Могу только поделиться своим пониманием, так как не делал сам... Я думаю разобраться не сложно, сам файл передается в переменных POST document, в формате URI цитата: | Data URI or Data URL format: "data:[<mime type>][;charset=<charset>][;base64],<encoded data>" |
| сами параметры отправляются в формате JSON почитай тут, может понятней будет https://docs.botmother.ru/article/41039#post но все нужно проверять на практике... ну и на сколько я понял через бот нельзя отправить файл больше 50Мб, хотя ограничение на размер 1.5Gb, там есть особенности. Но если файл загружен, то можно потом использовать ссылку на этот файл file_id без повторной его загрузки, полученную в ответе после отправки файла
|
 |

|
|
| |
Пост N: 8003
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.12.24 12:17. Заголовок: MIKHAIL я разобрался..
MIKHAIL я разобрался но так и не выходит отправить файл с компа , телега хочет URL на него Покопаю еще гугл
|
 |

|
|
| |
Пост N: 8004
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.12.24 14:15. Заголовок: В общем простой спос..
В общем простой способ послать сообщение с помощью LibCurl Func Tg_sendmessage(bot_token,id_chat,cmsg) local curl:=curl_easy_init() local URL:="https://api.telegram.org/bot" local tmp,hret cMsg:=UUrlEncode(hb_strToUtf8(cMsg)) URL+=bot_token+"/sendMessage?chat_id="+id_chat+"&text="+cMsg curl_easy_setopt(curl, HB_CURLOPT_HTTPPOST, 1) curl_easy_setopt(curl, HB_CURLOPT_SSL_VERIFYPEER, 0 ) curl_easy_setopt(curl, HB_CURLOPT_URL, URL) curl_easy_setopt(curl, HB_CURLOPT_DL_BUFF_SETUP ) curl_easy_perform(curl) tmp:=curl_easy_dl_buff_get( curl ) hb_JsonDecode(tmp,@hret) curl_easy_cleanup(curl) return hret Способ 2 ;) Func TG_SendMessage2(bot_token,id_chat,cmsg) local hParams := Hash() local hret hParams["chat_id"]:=id_chat hParams["text"]:=hb_strToUtf8(cmsg) hParams["parse_mode"] := "HTML" hret:=TG_Exec("sendMessage",hParams,bot_token) return hret ********************** Func TG_Exec(cMethod, hParams,bot_token) local curl local url:="https://api.telegram.org/bot"+bot_token+"/" local hret,tmp curl:=curl_easy_init() curl_easy_setopt( Curl, HB_CURLOPT_URL, URL + cMethod ) curl_easy_setopt( Curl, HB_CURLOPT_CUSTOMREQUEST, 'POST' ) curl_easy_setopt( Curl, HB_CURLOPT_POST, .t. ) curl_easy_setopt( Curl, HB_CURLOPT_SSL_VERIFYPEER, .f. ) curl_easy_setopt( Curl, HB_CURLOPT_CONNECTTIMEOUT, 10 ) curl_easy_setopt( Curl, HB_CURLOPT_HTTPHEADER, {"Content-Type: application/json","charset=utf-8"} ) curl_easy_setopt( Curl, HB_CURLOPT_POSTFIELDS, hb_jsonEncode( hParams ) ) curl_easy_setopt( Curl, HB_CURLOPT_DL_BUFF_SETUP ) curl_easy_perform( Curl ) tmp:=curl_easy_dl_buff_get( curl ) curl_easy_cleanup(curl) hb_JsonDecode(tmp,@hret) return hret Func TG_getUpdates(bot_token) local hParams := Hash() local hret hParams["offset"]:=-1 hParams["parse_mode"] := "HTML" hret:=TG_Exec("getUpdates",hParams,bot_token) return hret Вот по 2 способу можно сделать функцию TG_Senddocument и сделал но телега хочет инет линк на документ и локальный файл отправить не удается
|
 |

|
|
| |
Пост N: 8005
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.12.24 19:24. Заголовок: Haz пишет: ? aHash..
Haz пишет: цитата: | ? aHash["result"][n]["message"]["date"] |
| В каком формате дата ? Подумал было UNIX формат , но нет , не прокатило Пример "date"=>1733071129 // сегодня получил Проехали вроде Set( _SET_DATEFORMAT,"DD/MM/YYYY") ux:=1733071129 nDays := ux / 86400 ? dWinDate := hb_datetime( 1970 , 1 , 1 ) + nDays Правда отличается на 2 часа
|
 |

|
|
| |
Пост N: 361
Зарегистрирован: 05.10.06
|
|
Отправлено: 02.12.24 09:33. Заголовок: Dima пишет: Правда ..
Dima пишет: цитата: | Правда отличается на 2 часа |
| UTC наверное надо учесть
|
 |

|
|
| |
Пост N: 8006
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.12.24 11:38. Заголовок: MIKHAIL пишет: UTC ..
MIKHAIL пишет: да ты прав 
|
 |

|
|
| |
Пост N: 8007
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.12.24 19:30. Заголовок: MIKHAIL а есть ли ко..
MIKHAIL а есть ли команда api к боту что бы получить лист юзеров у которых этот бот запущен или для этого есть только getUpdates и всё и там уже нужно выковыривать их ? можно ли присвоить боту пароль , что бы тот кто пароля не знает не мог установить ну или хотя бы запустить у себя бот ? команду deleteWebhook я так понял достаточно дать 1 раз , верно ? есть ли адресок сайта где на русском языке описаны все команды к боту через API cо всеми подробностями как на офф сайте , с english я не очень... ?
|
 |

|
|
|
| |
Пост N: 362
Зарегистрирован: 05.10.06
|
|
Отправлено: 02.12.24 22:33. Заголовок: Dima пишет: а есть ..
Dima пишет: цитата: | а есть ли команда api к боту что бы получить лист юзеров у которых этот бот запущен или для этого есть только getUpdates и всё и там уже нужно выковыривать их ? |
| Я поверхностно изучал это вопрос, но так как статей по реализациям уже много, то все легко найти, вот первое попавшееся: как получить список пользователей Dima пишет: цитата: | можно ли присвоить боту пароль , что бы тот кто пароля не знает не мог установить ну или хотя бы запустить у себя бот ? |
| А зачем ? Пользователь ведь не будет видеть ответа, если он не адресован ему или в групповой чат. Реализация по авторизации на твоей стороне, можешь ждать от пользователя пароля, который и подтвердит что он авторизованный пользователь Dima пишет: цитата: | команду deleteWebhook я так понял достаточно дать 1 раз , верно ? |
| Да, она переключает режим бота, иначе в ответе на GetUpdates будет ошибка 409 и ты не получишь обновления, если нет ошибки 409 то и выполнять метод не требуется Dima пишет: цитата: | есть ли адресок сайта где на русском языке описаны все команды к боту через API cо всеми подробностями как на офф сайте , с english я не очень... ? |
| Полной документации на русском не встречал, сам читал отдельные статейки на разные темы
|
 |

|
|
| |
Пост N: 8009
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.12.24 20:43. Заголовок: MIKHAIL Спасибо !..
MIKHAIL Спасибо !
|
 |

|
|
| |
Пост N: 699
Зарегистрирован: 17.06.10
|
|
Отправлено: 23.03.25 16:56. Заголовок: Приветствую ! Нет ли..
Приветствую ! Нет ли примерчика считать файл с телеги на комп ?
|
 |

|
|
| |
Пост N: 8086
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.04.25 18:44. Заголовок: fil я сам не пробов..
fil я сам не пробовал , но должно пахать тут
|
 |

|
Ответов - 35
, стр:
1
2
All
[только новые]
|
|