|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
Здравствуйте, опишу по порядку, что я сделал: 1. Создал новый Maven проект в Intelij IDEA (отдельно Maven я не скачивал и никаких переменных соответственно для него вручную не устанавливал). 2. Написал простого телеграм-бота (отвечает пользователю тем же сообщением, что он отправил боту). 3. Открыл git bash, сделал git init, далее git add и commit соответственно. Сделал удаленную репу на гитхабе и связал её со своим проектом, сделал push, проект готов. 4. Попробовал загрузить бота на heroku (подключив в аккаунте git и указав нужную репу), и загрузка прошла без ошибок. Но бот молчит, хотя должен отвечать, очевидно что что-то пошло не так :) Я просто первый раз пробую сделать деплой и не совсем понимаю какая нужна конфигурация для heroku. Вот мой pom.xml: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54.
Собственно, главный класс выбран (точка входа): <mainClass>bot.Bot</mainClass>. Далее я читал, что нужен файл Procfile: Код: java 1.
На что он влияет, я так и не понял, и как он должен выглядеть у меня - тоже. Собственно, после этого я хочу получить jar своего проекта. Делаю File -> Project Structure -> Artifacts и добавляю там новый .jar с зависимостями (указываю main class). Получаю jar. И вот эта вся куча файлов лежит в репе. В приложенном файле структура проекта. Насколько я в итоге понял, у меня должна быть папка target/bin/workerBot, но её нет. В общем, не осилил я heroku и deploy. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2020, 22:02 |
|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
hsadik, запусти mvn package и все будет авторСобственно, после этого я хочу получить jar своего проекта. Делаю File -> Project Structure -> Artifacts и добавляю там новый .jar с зависимостями (указываю main class). Получаю jar. И вот эта вся куча файлов лежит в репе. а вот эту ересь убери Другое дело, что Heroku сам при пуше должен запустить mvn package и потом Procfile. Точно правильная ветка в origin heroku запушена? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2020, 23:07 |
|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
hsadik, Возможно Procfile нужен другой. Код: powershell 1.
Хорошего вам дня! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2020, 03:52 |
|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
fixxer Другое дело, что Heroku сам при пуше должен запустить mvn package и потом Procfile. Точно правильная ветка в origin heroku запушена? А я в heroku не пушил. Я пушил в гитхаб, а оттуда "присоединял" к heroku через их интерфейс (CLI я не устанавливал). Ветка там одна единственная - master. Попробовал удалить этот jar, проект не собирал, а так и запушил - результатов (положительных) нет. fixxer hsadik, запусти mvn package и все будет Сделал (в IDEA Lifecycle - Package). Проект собрался, в target появился джарник и другие файлы, в том числе папка bin (могу выложить её содержимое со скриптом, если это поможет решит проблему). Сделал новый деплой, собирается хорошо, но бот по-прежнему молчит. Лог для mvn package: Код: powershell 1. 2. 3. 4. 5.
[INFO] Compiling 2 source files to C:\Users\Miroha\IdeaProjects\heroku\target\classes Valentin Kolesnikov hsadik, Возможно Procfile нужен другой. Код: powershell 1.
Хорошего вам дня! Заменил на путь к jar, который у меня получился в результате package: Код: powershell 1.
Билдится, деплоится, бот молчит. :( Собственно, делюсь ссылкой на гитхаб проекта, может так будет нагляднее! https://github.com/miroha/heroku-tg Я на этом простом боте репетирую деплой, так как загружать потом буду другой, как доделаю его. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2020, 09:59 |
|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
hsadik fixxer Другое дело, что Heroku сам при пуше должен запустить mvn package и потом Procfile. Точно правильная ветка в origin heroku запушена? А я в heroku не пушил. Я пушил в гитхаб, а оттуда "присоединял" к heroku через их интерфейс (CLI я не устанавливал). Ветка там одна единственная - master. Попробовал удалить этот jar, проект не собирал, а так и запушил - результатов (положительных) нет. fixxer hsadik, запусти mvn package и все будет Сделал (в IDEA Lifecycle - Package). Проект собрался, в target появился джарник и другие файлы, в том числе папка bin (могу выложить её содержимое со скриптом, если это поможет решит проблему). Сделал новый деплой, собирается хорошо, но бот по-прежнему молчит. Лог для mvn package: Код: powershell 1. 2. 3. 4. 5.
[INFO] Compiling 2 source files to C:\Users\Miroha\IdeaProjects\heroku\target\classes Valentin Kolesnikov hsadik, Возможно Procfile нужен другой. Код: powershell 1.
Хорошего вам дня! Заменил на путь к jar, который у меня получился в результате package: Код: powershell 1.
Билдится, деплоится, бот молчит. :( Собственно, делюсь ссылкой на гитхаб проекта, может так будет нагляднее! https://github.com/miroha/heroku-tg Я на этом простом боте репетирую деплой, так как загружать потом буду другой, как доделаю его. Нужно настройку поменять для приложения. Воркеры только для платных приложений доступны. Хорошего вам дня! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2020, 14:25 |
|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
Zzz79, Wow-wow! Тормозни на поворотах. В скруле просто помогают. А ты решил взлететь на бедных студентах? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 21:29 |
|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
Щас во всем мире будет кризис. Всем будет плохо. У меня даже есть мысль что больше синьоры-помидоры пострадают. Их будут урезать по оплате. А мидлы как-раз останутся. На сопровождении программных продуктов их - достаточно. А развития во время кризиса не предвитится. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 21:56 |
|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
Жена шить умеет? Вот купи вату. Марлю. И пусть сидит дома шьет маски. Это щас актуально. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 22:06 |
|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
mayton Жена шить умеет? Вот купи вату. Марлю. И пусть сидит дома шьет маски. Это щас актуально. Конкуренция большая. Я фабричные, тканевые за 20 грн покупал. Хорошего вам дня! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 22:08 |
|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
Работяги, бота задеплоил, но теперь возник другой вопрос. Есть обработчик сообщений, который разбит на два отдельных обработчика. Один обрабатывает обычные сообщения, а другой callback. Callback это то, что отсылается серверу при нажатии на кнопку Inline клавиатуры, примерно так: В начале я обрабатываю обычное сообщение: условно /weather London, пользователю вылетает такая клавиатура с параметрами (температура, скорость ветра и т.д.). При нажатии на кнопку срабатывает второй обработчик (callbackquery), который по кнопке отправляет соответствующие результаты. Если пользователь напишет следующий запрос /weather Paris, он получит информацию о другом городе, всё верно. Но, если он при этом пролистает чат наверх и нажмет условно кнопку с влажностью для Лондона, то он получит ответ для Парижа. Т.е. последнее сообщение перекрывает старое. Я сделал очередь для сообщений куда сохраняю каждое сообщение пользователя, если оно начинается с /weather и обработчик для сообщений: Код: java 1. 2. 3. 4. 5. 6.
Т.е. сделав два запроса у меня там лежит /weather London и /weather Paris. Вот для callback: Код: java 1. 2. 3. 4. 5.
Я из этой очереди всегда достаю последний элемент, в этом и проблема, но не могу сообразить как мне соединить запросы так, чтобы они коррелировались как нужно. Надо запоминать id сообщения, которое начинает с /weather. Надо наверное завести пару ключ значение, где ключом будет id сообщения, а значением как раз /weather London и т.д. Но я не могу заполнить хеш-мапу в первом обработчике, так как мне нужен id сообщения, который соответствует клавиатуре Т.е. id не сообщения "/weather London" (1000), а id клавиатуры выпадающей (точнее её callback) - условно 1111. И в итоге хрен его не знает, как всё это скомпоновать. Я же не могу в handleMessage занести только значение в виде /weather London без ключа, который я получаю в handleCallBack. Кажется, что решение на ладони, но я его в упор не вижу. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2020, 22:07 |
|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
Zzz79 hsadik, ты напиши нормально что тебе надо ) я раза три прочитал ничего не понял - какие то очереди и прочие прелести,что то не коллерирется вопрос надо сформулировать,иначе как ты хочешь чтобы тебе кто то помог? Он не правильно Query перевёл как "очередь" просто. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2020, 13:58 |
|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
Автор, Код: java 1.
А в обработчике просто split(" ") делай. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2020, 14:01 |
|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
hsadik, привет! У меня абсолютно аналогичная проблема с деплоем на heroku. Пожалуйста, напиши, как именно ты смог ее решить, спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2020, 19:09 |
|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
Oloir, Если еще актуально. Procfile: Код: java 1.
pom.xml: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
gitignore: Код: java 1. 2. 3. 4.
По итогу: никаких дополнительных команд в maven не делал, jar не собирал, просто голый код без сборки, heroku сам собирает. В общем, там в самих настройках на heroku у бота есть переключатель, который по умолчанию у меня был выключен. Точно сейчас уже не скажу, ну в общем в настройках своего проекта на heroku должна быть опция worker с переключателем, вот его надо включить. У меня проблема была в этом. Покопаться надо именно на сайте heroku. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2020, 20:42 |
|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
Zzz79, PetroNotC Sharp, dakeiras, Да, тяжело это объяснить, сейчас попробую еще раз. Пришлось вернуться к этому небольшому проекту, а проблема так и не решена. Вкратце про своего бота: встроил простой предварительно написанный парсер Google Play в бота - он умеет получать информацию по ссылке, а после этого добавлять полученную информацию во внутреннюю библиотеку (пишется в файл). Так вот, если игра есть в библиотеке бота, то информацию о ней можно получить по команде /library Название_игры. В таком случае пользователю отправляется inline клавиатура с вариантами выбора, и каждый callback обрабатывается соответствующим образом. Выглядит это так: Итак, я получаю сообщение пользователя (объект Update), Код: java 1. 2. 3. 4. 5. 6.
Соответственно пользовательское сообщение обрабатывается TextMessageHandler, и если оно содержит в себе упоминание /library, то вызывается соответствующий handler для этой команды - LibraryMessageHandler. Кусок из LibraryHandler: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
В начале я достаю название игры (обрезаю /library). С этим названием запрос летит во внутреннюю библиотеку и проверяется соответствие: если такая игра есть, то выплевывается та самая inline клавиатура. Клавиатура отправлена, пользователь может нажимать кнопочки. Тут уже нужен CallbackQueryHandler, который обрабатывает каждое нажатие этой клавиатуры. Тут возникает вопрос: а для какой игры и вообще сообщения собственно обрабатывать запросы? Нужно же знать на какой callback отвечать (отдельный message_id). Их может быть сколько угодно, и каждый нужно обработать. Для этого я пока придумал хешмапу (и метод addQuery), которая хранит message_id (ключ) + игру (значение), которая привязана к запросу. Т.е. идет запрос от пользователя, в котором есть упоминание названия игры (я запоминаю id этого сообщения), следом пользователю прилетит сообщение с клавиатурой (уже следующий message_id), а значит нужный мне message_id с клавиатурой будет +1 от запроса пользователя, но это лишь при идеальном сценарии. Если два пользователя одновременно отправят запрос (а это не такой уж и редкий сценарий), то message_id уже будет не тот: я получу message_id сообщения второго пользователя, а не нужной мне клавиатуры, т.к. message_id один общий для всех чатов и пользователей. В общем, конфликты не избежны. Сам Callback: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44.
По итогу: мне нужно знать id этой самой выпадающей клавиатуры (иначе как её отследить?), так как к этой клавиатуре привязан конкретный запрос. И далее связать этот id клавиатуры с названием игры, которое посылается пользователем, после которого эта самая клавиатура и появляется. Клавиатура не сможет отработать без этого названия (по названию осуществляется поиск в библиотеке). Получив связь "название игры - клавиатура" я уже могу отвечать на те самые callback, не боясь за то, что улетит неверная информация. Вот ещё метод для отправки этой самой клавиатуры: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
Как выйти из сложившейся ситуации? Возможно, там даже есть готовое решение в telegram bot api, но мои поиски не увенчались успехом, не хватает мне еще опыта, я только учусь. Может вообще стоит задуматься об изменении дизайна бота, добавив например сущность в виде User, где хранить chat_id, его сообщения и т.д. Но тут уже похоже нужно будет использовать БД, чтобы хранить каждого пользователя. Но сама идея моего бота этого не предусматривает, это просто "информационный справочник". Но вот правильно обработать описанные мною запросы у меня не получается. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2020, 18:45 |
|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
hsadik, это всё понятно было изначально. И совет я уже дал выше. Повторю ещё раз - добавь аргумент просто в callback: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
И как видишь я добавил ещё "/" чтобы можно было различать спам юзера и реальное нажатие кнопки. Это хорошая практика. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2020, 21:22 |
|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
dakeiras, Спасибо, вроде получилось, но нужно будет еще протестировать. Телеграм сейчас у меня "заблокирован", а через VPN порой проблемы с соединением, но по логам, которые удалось получить, вроде нормально выходит. Добавил этот аргумент: Код: java 1.
А handler примерной такой или можно покрасивее? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2020, 22:57 |
|
Deploy бота на Heroku
|
|||
---|---|---|---|
#18+
hsadik dakeiras, Спасибо, вроде получилось, но нужно будет еще протестировать. Телеграм сейчас у меня "заблокирован", а через VPN порой проблемы с соединением, но по логам, которые удалось получить, вроде нормально выходит. Добавил этот аргумент: Код: java 1.
А handler примерной такой или можно покрасивее? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Ан нет, с таким сплитом, если название игры состоит из более чем одного слова, будет неправильно обработано, и бот не найдет её в библиотеке. Переписал gameTitle на: Код: java 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2020, 23:07 |
|
|
start [/forum/topic.php?fid=59&msg=39956024&tid=2120808]: |
0ms |
get settings: |
8ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
54ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
342ms |
get tp. blocked users: |
0ms |
others: | 6ms |
total: | 422ms |
0 / 0 |