Форум программистов, компьютерный форум, киберфорум
Python: API, боты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/29: Рейтинг темы: голосов - 29, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 30.03.2017
Сообщений: 3

Бот для telegram на Питоне

30.03.2017, 23:22. Показов 5887. Ответов 4

Студворк — интернет-сервис помощи студентам
Очень хотел написать бота для telegram, долго изучал эту тему и наконец написал программу. Писал на PyCharm под Виндой, задача Бота ответ Столица на запрос Любой страны. Ответы написал в отдельном JSON файле. Тут идет и проблема программа не хочет запускаться из-за проблем с этим файлом. Можете помочь в решении этой проблемы?
Python
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import sys
import os
import json
import asyncio
import random
import telepot
import telepot.aio
from telepot.namedtuple import ReplyKeyboardMarkup, KeyboardButton, ReplyKeyboardRemove,ForceReply
from telepot.namedtuple import InlineKeyboardMarkup, InlineKeyboardButton
from time import strftime
import random
 
async def on_chat_message(mag):
 
    global answerData, lowerCountries
 
    content_type, chat_type, chat_id = telepot.glance(mag)
    chat_id_str = str(chat_id)
 
    print(chat_id_str+' может быть добавлен в список id')
 
 
    with open('countrycap.log', 'a', encoding='utf8') as logFile:
        if content_type != 'text':
            return
        logFile.wtite('['+strftime("%Y-%m-%d %H:%M:%S")+'][' + chat_id_str + ' -> bot]: ' + mag['text'] + '\n')
        print('Chat:', content_type, chat_type, chat_id)
        print('Пользователь '+ chat_id_str + 'написал:\n' +mag['text'].lower())
        request = mag['text']#.lower()
 
        if request in ('/start', 'hi', 'help', 'привет', 'помоги мне', 'помощь', 'старт'):
            await bot.sendMessage(chat_id, answerData['welcome'])#,reply_markup=rkh)
            logFile.write('['+strftime("%Y-%m-%d %H:%M:%S")+'][bot -> ' + chat_id_str + ']: ' + answerData['welcome'] + '\n')
            return
        elif request in ('тест'):
            testAnswers = ["Скопье", 'Тирана', 'Мапуту', 'Подгорица']
            inline_keyboard = []
            for a in range (len(testAnswers)):
                inline_keyboard.append([InlineKeyboardButton(text=testAnswers[a],callback_data=testAnswers[a])])
            ikm = InlineKeyboardMarkup(inline_keyboard=inline_keyboard)
            await bot.sendMessage(chat_id, 'Выберете столицу Македонии:', reply_markup=ikm)
        elif request in answerData['countries'].keys():
            se = random.randint(0, 1)
            phraseNumber= random.randint(0, 4)
            if se==0:
                add = answerData["addsToAnswer"]['start'][phraseNumber]
                await bot.sendMessage(chat_id, add + answerData['countries'][request])
                logFile.write('['+strftime("%Y-%m-%d %H:%M:%S")+'][bot -> ' + chat_id_str + ']: ' + add + answerData['countries'][request] + '\n')
            else:
                add = answerData["addsToAnswer"]['end'][phraseNumber]
                await bot.sendMessage(chat_id, answerData['countries'][request])
                logFile.write('['+strftime("%Y-%m-%d %H:%M:%S")+'][bot -> ' + chat_id_str + ']: ' + answerData['countries'][request] + add + '\n')
            return
        elif request in  lowerCountries:
            await  bot.sendMessage(chat_id, answerData["lowCountryRequest"])
            logFile.write('['+strftime("%Y-%m-%d %H:%M:%S")+'][bot -> ' + chat_id_str + ']: ' + answerData['lowCountryRequest'][request] + '\n')
            return
        elif request.lower() in ["Тупой"]:
            await bot.sendMessage(chat_id, "Сам ты тупой!!!")
            logFile.write('['+strftime("%Y-%m-%d %H:%M:%S")+'][bot -> ' + chat_id_str + ']: ' + "Сам ты тупой!!!" + '\n')
            return
        else:
            await  bot.sendMessage(chat_id, answerData['badRequest'])
 
async def on_callback_query(mag):
    global answerData
    query_id, from_id, query_data = telepot.glance(mag, flavor='callback_query')
    print(query_data)
    if query_data == answerData['countries']['Македония']:
        await bot.sendMessage(from_id, "Верно")
    else:
        await bot.sendMessage(from_id, "Ты ошибся")
 
 
 
homeDir=os.path.dirname(__file__)
lowerCountries =  []
with open(os.path.join(homeDir, 'answersDat.json'), encoding='utf8') as answerDataFile:
    print('Loading meta...')
    answerDataFile = json.load(answerDataFile)
    for country in answerData['countries'].keys():
        lowerCountries.append(country.lower())
    print('answer loaded!')
TOKEN = sys.argv[1]
 
bot = telepot.aio.Bot(TOKEN)
loop = asyncio.get_event_loop()
loop.create_task(bot.message_loop({'chat': on_chat_message, 'callback_query': on_callback_query}))
print('Listening ...')
 
loop.run_forever()
JSON
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
"Италия" : "Рим",
    "Йемен" : "Сана",
    "Кабо-Верде" : "Прая",
    "Казахстан" : "Астана",
    "Камбоджа" : "Пномпень",
    "Камерун" :  "Яунде",
    "Канада" : "Оттава",
    "Катар" : "Доха",
    "Кения" : "Найроби",
    "Кипр" : "Никосия",
    "Киргизия" : "Бишкек",
    "Кирибати"  : "Южная Тарава",
    "Китай"    : "Пекин",
    "Колумбия"  : "Санта-Фе-де-Богота",
    "Коморы" : "Морони",
    "Конго демократическая республика" : "Киншаса",
    "Конго республика" : "Браззавиль",
    "Коста-Рика" : "Сан-Хосе",
    "Кот-д’Ивуар" : "Ямусукро",
    "Куба" : "Гавана",
    "Кувейт" : "Эль-Кувейт",
    "Лаос" : "Вьентьян",
    "Латвия" : "Рига",
    "Лесото" : "Масеру",
    "Либерия" : "Монровия",
    "Ливан"    : "Бейрут",
    "Ливия"    : "Триполи",
    "Литва" : "Вильнюс",
    "Лихтенштейн" : "Вадуц",
    "Люксембург" : "Люксембург",
    "Маврикий" : "Порт-Луи",
    "Мавритания" :    "Нуакшот",
    "Мадагаскар" : "Антананариву",
    "Македония" : "Скопье",
    "Малави" : "Лилонгве",
    "Малайзия" : "Куала-Лумпур",
    "Мали" : "Бамако",
    "Мальдивы" : "Мале",
    "Мальта" : "Валлетта",
    "Марокко" : "Рабат",
    "Маршалловы Острова" : "Маджуро",
    "Мексика" : "Мехико",
    "Мозамбик" : "Мапуту",
    "Молдавия" : "Кишинев",
    "Монако" : "Монако",
    "Монголия" : "Улан-Батор",
    "Мьянма" : "Найпьидо",
    "Намибия" : "Виндхук",
    "Науру" : "официальной столицы не имеет, так что не умничай",
    "Непал" : "Катманду",
    "Нигер" : "Ниамей",
    "Нигерия" : "Абуджа",
    "Нидерланды" : "Амстердам",
    "Никарагуа"    : "Манагуа",
    "Новая Зеландия" : "Веллингтон",
    "Норвегия" : "Осло",
    "Объединенные Арабские Эмираты" : "Абу-Даби",
    "Оман" : "Маскат",
    "Пакистан" : "Исламабад",
    "Палау"    : "Мелекеок",
    "Панама" : "Панама",
    "Папуа - Новая Гвинея" : "Порт-Морсби",
    "Парагвай": "Асунсьон",
    "Перу" : "Лима",
    "Польша" : "Варшава",
    "Португалия" : "Лиссабон",
    "Россия" : "Петроград...Ой, перепутал век... Это Москва, обещаю, что это больше не повторится... наверно...",
    "Руанда" : "Кигали",
    "Румыния" :  "Бухарест",
    "Сальвадор" : "Сан-Сальвадор",
    "Самоа"    : "Апиа",
    "Сан-Марино" : "Сан-Марино",
    "Сан-Томе и Принсипи" : "Сан-Томе",
    "Саудовская Аравия" : "Эр-Рияд",
    "Свазиленд"    : "Мбабане",
    "Северная Корея" : "Пхеньян",
    "Сейшелы" : "Виктория",
    "Сенегал" : "Дакар",
    "Сент-Винсент и Гренадины" : "Кингстаун",
    "Сент-Китс и Невис"   : "Бастер",
    "Сент-Люсия" : "Кастри",
    "Сербия" : "Белград",
    "Сингапур" : "Сингапур",
    "Сирия" : "Дамаск",
    "Словакия" : "Братислава",
    "Словения" : "Любляна",
    "Соединенные Штаты Америки" : "Вашингтон",
    "Соломоновы Острова" : "Хониара",
    "Сомали" : "Могадишо",
    "Судан" : "Хартум",
    "Суринам" : "Парамарибо",
    "Сьерра-Леоне" : "Фритаун",
    "Таджикистан" : "Душанбе",
    "Таиланд" : "Бангкок",
    "Танзания" : "Додома",
    "Того" : "Ломе",
    "Тонга" : "Нукуалофа",
    "Тринидад и Тобаго" : "Порт-оф-Спейн",
    "Тувалу" : "Фунафути",
    "Тунис" : "Тунис",
    "Туркмения" : "Ашхабад",
    "Турция" : "Анкара",
    "Уганда" :"Кампала",
    "Узбекистан" : "Ташкент",
    "Украина" : "Киев",
    "Уругвай" : "Монтевидео",
    "Федеративные штаты Микронезии"  : "Паликир",
    "Фиджи" : "Сува",
    "Филиппины" : "Манила",
    "Финляндия" : "Хельсинки",
    "Франция" : "Париж",
    "Хорватия" : "Загреб",
    "Центрально-Африканская Республика" : "Банги",
    "Чад" : "Нджамена",
    "Черногория" : "Подгорица",
    "Чехия"    : "Прага",
    "Чили" : "Сантьяго",
    "Швейцария" : "Берн",
    "Швеция" : "Стокгольм",
    "Шри-Ланка" : "Коломбо",
    "Эквадор" : "Кито",
    "Экваториальная Гвинея" : "Малабо",
    "Эритрея" : "Асмэра",
    "Эстония" : "Таллин",
    "Эфиопия" : "Аддис-Абеба",
    "Южная Корея" : "Сеул",
    "Южно-Африканская Республика" : "Претория",
    "Ямайка" : "Кингстон",
    "Япония" : "Токио"
  }
}
Ошибка: Loading meta...
Traceback (most recent call last):
File "C:/Users/Мага/PycharmProjects/Chat_Bot_v1.0/main.py", line 81, in <module>
for country in answerData['countries'].keys():
NameError: name 'answerData' is not defined

Process finished with exit code 1
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.03.2017, 23:22
Ответы с готовыми решениями:

Бот для telegram
Помогите пожалуйста, нужно написать такого бота для telegram который должен записать пользователей на определённое время (для всех разное)...

Бот для Telegram
Как написать бота, который при отправлении команд в телеграмм выполнял заданные команды на компьютере?

Бот для дискорда на питоне
Добрый день и всех с наступающим! Немного начала разбираться с написание бота для дискорда, написал и запустил. Этого было мало и я...

4
 Аватар для pashtet-kun
135 / 120 / 37
Регистрация: 30.09.2012
Сообщений: 400
31.03.2017, 10:32
ну дак переменная answerData у вас нигде и не определена
0
0 / 0 / 0
Регистрация: 30.03.2017
Сообщений: 3
02.04.2017, 13:18  [ТС]
Разве нужно ее вводить, я думал команды os.path хватит
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
03.04.2017, 08:15
Цитата Сообщение от Qwerty686 Посмотреть сообщение
я думал команды os.path хватит
Это не команда, а модуль и причем тут это вообще?
1
0 / 0 / 0
Регистрация: 30.03.2017
Сообщений: 3
03.04.2017, 09:44  [ТС]
Разве в этом модуле надо вводить переменную?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.04.2017, 09:44
Помогаю со студенческими работами здесь

Бот для рассылки в telegram
Добрый день. Хочу к боту добавить функцию рассылки создания рассылки. Все норм рассылки делает но только текстовые. Как добавить картинку к...

Бот на питоне для телеги - проблемы с обработкой команд
поздновато может для меня учить программирование, но что не сделаешь ради хобби (хотя я чайник по вашим меркам ещё тот), решил начать...

Бот для telegram (pyTelegramBotAPI) Метод не возвращает статус подписки
Добрый день товарищи программисты. Первый раз работаю с api Telegram. Суть работы бота в том, что нужно пользователю подписаться на канал,...

Telegram Бот
Сидишь дома на карантине и тебе нечем заняться?! Что же, поздравляю! Ты нашёл себе занятие на пару часов. Короче, ребят, нужен бот в...

Telegram бот
Всем привет. Кто-нибудь создавал Telegram бота в Питоне? Почему в консоле такое вылазит? Смотрел видео, просто переписал код, у него все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru