Форум » Для флейма » Чатбот » Ответить

Чатбот

fil: Приветствую ! У каждого клиента свой чатбот. Ключи в базе и я могу разослать сообщения тому или иному на телефон. Все работает. Можно ли сделать так - бот только один, а клиенты, по токену, к нему подключаются ?

Ответов - 16

Haz: fil пишет: fil пишет: У каждого клиента свой чатбот. Не понятно зачем у каждого свой. На то он и чат бот чтоб все запросы обрабатывать.. Каждому клиенту при обращении присваивается свой чат id. По нему и стройте логику ответов бота. По сути вопроса, да можете по ключу подключиться к любому боту, и контролировать общение этого бота. Только зачем их плодить.

fil: Хорошо. А как подключиться к чужому боту дабы получить ID ?

Haz: fil пишет: Хорошо. А как подключиться к чужому боту дабы получить ID примерно так [pre2] 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 [/pre2] ЗЫ Для чтения состояния бота используется метод getUpdates из api телеграмма. тут покажет все новые сообщения с указанием от какого чат ID они получены для отправки клиенту используется метод SendMessage из api


fil: Ага, сенкс, завтра пробну !!

fil: Хотя я не понимаю каким образом эта прога может сделать рассылку клиенту телеграмма ежели он заранее не подключен к боту /start

Haz: fil пишет: Хотя я не понимаю каким образом эта прога может сделать рассылку клиенту телеграмма ежели он заранее не подключен к боту /start Никаким, клиент должен сначала войти в чат и получить чат id. После того по id бот может слать чего угодно

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

fil: А могу-ли я писать в группу, дабы все участники видели ?

Haz: fil пишет: могу-ли я писать в группу, дабы все участники видели ? Через бота, он разошлёт. Вроде есть еще возможность сделать бота модератором канала,

fil: Через бота, он разошлёт. Есть такая API функция ? Сам бот должен быть в группе?

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

Haz: Все методы тут https://telegram-bot-sdk.readme.io/reference/sendmessage

fil: Из бота в группу текст слать научился. Никак тока по русски не получается, все кракозябры. Хотя, вроде, в UTF-8

Haz: fil пишет: се кракозябры Посмотри в моём примере , utf8 мало , нужно экранировать служебные символы

fil: Уж его то я попробовал в первую очередь. Похоже дело в BOM

Haz: fil пишет: Похоже дело в BOM Тогда надо искать причину, я не сталкивался с этим. Пример делал под консоль, проблем не ловил.



полная версия страницы