LINUX.ORG.RU

бот для телеграм

 , , ,


2

2

как передать в переменную то что я отправила боту как текст. То есть когда я отправляю боту например qwerty, в коде проверяется на тип. если строка то выводит 1, иначе выводит 2. как вот проверить отправленное мной qwerty. и использовать его для другого куска кода.

★★

Ответ на: комментарий от entefeed

дык я тут решила чутка питон подучить, написала. в консоли работает. -_- а вот в телеграмме не знаю как присвоить.

gssomi ★★ ()

как передать в переменную то что я отправила боту как текст.

А как передаешь вообще? В переменную положи, ее значение отправляй, дальше с ней работай. Но вообще вопрос шикарен, так что вот тебе hint - для проверок используй isinstance, а то будешь оборачивать в str() и сравнивать с такой же строковой переменной...

alozovskoy ★★★★★ ()
Ответ на: комментарий от alozovskoy

типа так?

if isinstance(i, int) and i != " ":


да согласна с вопросом, я 2 часа сидела и не могла никак собраться с мыслями что-бы нормально сформулировать вопрос. из-за этого не могла нормально загуглить. и так вот получилось, что написала сюда. вот и не знаю как передавать.

gssomi ★★ ()
Последнее исправление: gssomi (всего исправлений: 1)
Ответ на: комментарий от gssomi

Но ты ведь даже вопрос задаешь неверно. Какой бот, где этот бот, где сорцы? Что ты делаешь, сорцы модифцируешь или что? Ой, все, иди борщи вари.

Я практически гарантирую что этот бот получает весь инпут как str и тебе придется делать str().isdigit()

entefeed ☆☆☆ ()
Ответ на: комментарий от gssomi

Так тебе нужно проверить что строка не пустая, что она состоит только из цифр или что? Если приходит строка то проверять ее тип на int смысла тоже не имеет, это же строка. Для проверки состоит ли строка из цифр вон чуть выше уже подсказали isdigit, для проверки на то, состоит ли она только из пробельных символов есть isspace, в общем обратись к документации по стандартным методам для строк.

alozovskoy ★★★★★ ()
Последнее исправление: alozovskoy (всего исправлений: 3)
Ответ на: комментарий от alozovskoy

да, и еще использовать эту цифру для цикла while/

b = []
while i < a:
   i += 1
   b.append(int(i))
r = random.sample(b, k)
print r

вот тут i и a должны быть теми цифрами которые я отправила боту.

gssomi ★★ ()
Ответ на: комментарий от gssomi

i же и так int (по крайней мере должен стать им перед началом цикла), зачем еще раз в append его к этому типу приводить? Но вообще я тут не вижу того, с чего разговор начинался =)

if i.isdigit() and a.isdigit():
  while чтототам
<...>
print r
alozovskoy ★★★★★ ()
Ответ на: комментарий от alozovskoy
i = int(input("i -> ")
a = int(input("a -> ")
k = int(input("k -> ")

	bot.send_message(m.chat.id, "afert")
	if not i.isdigit() and not i.isspace():
		bot.send_message(m.chat.id, "before")
		if not a.isdigit() and not a.isspace() and a > i:
			bot.send_message(m.chat.id, "sum")
			if not k.isdigit() and not k.isspace() and 1 < k < a:
				b = []
				while i < a:
					i += 1
					b.append(int(i))
				r = random.sample(b, k)
				bot.send_message(m.chat.id, r)
			else: 
				bot.send_message(m.chat.id, "error, not right k")
		else:
			bot.send_message(m.chat.id, "error, not right a")	
	else: 
		bot.send_message(m.chat.id, "error, not right i")
		



где то в документации увидела. по этому так и вышло. спасибо, исправлю

gssomi ★★ ()
Последнее исправление: gssomi (всего исправлений: 1)
Ответ на: комментарий от gssomi
bot.send_message(m.chat.id, "error, not right i")

Вот эти куски замени на какой-нибудь bot.send_message(m.chat.id, result), и вытащи прям после всех if-then-else, в которых и задавай только значение result.

b.append(int(i))

Раз у тебя not i.isdigit() в этой части получишь ошибку

>>> int('test123')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'test123'

Пробегись хотя бы чем-то вроде

i = int(''.join([s if s.isdigit() else '' for s in i]))
>>> i = 'test123'
>>> i = int(''.join([s if s.isdigit() else '' for s in i]))
>>> i
123
>>> type(i)
<type 'int'>

Но вообще должен быть более красивый способ, все зависит от того что у тебя в этой строке может быть.

alozovskoy ★★★★★ ()
Последнее исправление: alozovskoy (всего исправлений: 2)
Ответ на: комментарий от gssomi

Примерно так же, как и устраивать взрывы мозга такими вопросами, но вроде тут уже все возможные претензии высказали до меня и даже свели вопрос от «вопроса жизни, смерти и всего такого» к конкретному коду.

alex4321 ()
Ответ на: комментарий от alex4321

да, но самое важное все равно не узнала. Но вроде что-то получается, только вот ошибка выходит =). Надо было в первую очередь питон подучить.

gssomi ★★ ()
Ответ на: комментарий от gssomi

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

з.ы. то что код - говно - ни разу не облегчает попыток прочитать его из libastral :-)

alex4321 ()
Ответ на: комментарий от alex4321

я сперва написала код так что-бы он работал через консоль, все работала. Думала даже с api код не должен так сильно меняться, в итоге вышло так что я все переписала, конечно с помощью добрых людей на ЛОР-е код стал более читаемым. Я поняла в чем проблема, но я не знаю как его решить.

gssomi ★★ ()
Ответ на: комментарий от gssomi

вот часть кода, а вот как сделать так чтобы исполнялся последовательно.
Думаю из-за того, что код выполняется сразу все и выходит ошибка. Может в echo_message(m) дописать последовательность или разделить эту лапшу на 3 части (i, a, k)

@bot.message_handler(commands=['ok'])
def ok(m):
	bot.send_message(m.chat.id, "afert")
	i = m.text
	i = int("".join([s if s.isdigit() else "" for s in i]))
	if(i, int):
		bot.send_message(m.chat.id, "before")
		a = m.text
		a = int("".join([s if s.isdigit() else "" for s in a]))
		if (i, int) and a > i:
			bot.send_message(m.chat.id, "sum")
			k = m.text
			k = int("".join([s if s.isdigit() else "" for s in k]))
			if (i, int) and 1 < k < a:
				b = []
				b = range(i+1,a)
				r = random.sample(b, k)
				bot.send_message(m.chat.id, m.text + r)
			else: 
				bot.send_message(m.chat.id, result + " k")
		else:
			bot.send_message(m.chat.id,  result + " a")	
	else: 
		bot.send_message(m.chat.id, result + " i")

result = "error, not right "
			

@bot.message_handler(func=lambda m: True)
def echo_message(m):
	bot.send_message(m.chat.id, m.text)

gssomi ★★ ()
Последнее исправление: gssomi (всего исправлений: 1)

Я один не понимаю, как ОП запускает программы на телеграмме? Ладно бы телеграф, но массив данных, предназначенный для пересылки с помощью радио или проводов?

bumper ()
Ответ на: комментарий от gssomi

И следующий вопрос - что конкретно должно происходить.

Кстати, я конечно, питонист не настоящий, но

	i = m.text
	i = int("".join([s if s.isdigit() else "" for s in i]))
	if(i, int):

Как это?

И да - если в m.text должна быть (в одном варианте) содержащая число строка или, в другом - не быть чисел - я бы сделал так :


def extract_number(string): # здесь бы регулярку приюзал, ну да хрен с ней
    num_str = "".join([s if s.isdigit() else "" for s in i])
    if num_str == "":
        return None
    else:
        return int(num_str)

i = extract_number(m.text)
if i is not None:
    #получили число
else:
    #получили текст

А то вангую я, что при получении чистого текста получаем в "".join([s if s.isdigit() else «» for s in i]) пустую строку, а при её скармливании int-у - исключение.

alex4321 ()
Ответ на: комментарий от alex4321

if(i, int):

его мне сказали убрать

в конце должен получиться рандомные числа, в которое можно указать длину и количество выводящих чисел. например от 5 до 60, 4 рандомных числа

gssomi ★★ ()
Ответ на: комментарий от gssomi

Кстати, у меня в extract_number ошибка есть - string вместо i же. Хотя без входных данных (что в m.text?) выходных и текста ошибки всё равно ничего не ясно.

alex4321 ()
Ответ на: комментарий от gssomi

все равно ошибку выдает

Какую? Запости сюда выхлоп.

anonymous ()
Ответ на: комментарий от gssomi

Прогресс. Теперь ответь на следующие вопросы : - что именно ты отправляешь - какую ошибку выдает, и на какой конкретно кусок кода ссылается.

з.ы. неужели ли я лет 8 назад тоже формулировал вопросы так же? надо вспомнить ник на кодонете.

alex4321 ()
Ответ на: комментарий от alex4321

Вобщим все прояснилось, ошибки теперь не выдает. Починила чутка. Но все равно нету последовательности. То есть весь код выполняется сразу. Как сделать так, что бы пока не ответишь код не выполнялся.код могу показать завтра. Поздно, офис закрыли.

gssomi ★★ ()
Последнее исправление: gssomi (всего исправлений: 1)

бот для телеграм

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

Ghostwolf ★★★★ ()
Ответ на: комментарий от entefeed

В IT куча девушек, даже в OpenSource встречаются иногда, а вот в СНГ'шном «IT» девушек действительно мало. Страны и ценности такие.

EXL ★★★★★ ()
Ответ на: комментарий от EXL

В IT куча девушек

Известно с каким уровнем. Есть конечно исключения вроде Сильви, но чаще там уровень этого треда и скорее дань хипстомоде на все типаумное, а не какой-то реальный интерес. Да и общий спермотоксикоз сосисочников роль играет.

entefeed ☆☆☆ ()
Ответ на: комментарий от gssomi

if(i, int):

Йолыпалы, и что ты проверяешь? Int всегда true.

>>> if (False, int):
...   print 'OK'
... 
OK

То есть весь код выполняется сразу. Как сделать так, что бы пока не ответишь код не выполнялся.код могу показать завтра.

Пока не ответишь боту? Либо делай сначала первую часть, потом жди событие приема сообщения твоим ботом и обрабатывай вторую часть кода, либо вообще все делай только при приеме сообщения.

alozovskoy ★★★★★ ()
Последнее исправление: alozovskoy (всего исправлений: 1)
Ответ на: комментарий от Deleted

у меня саблайм автоматически определяет куда писать.

gssomi ★★ ()
Ответ на: комментарий от alozovskoy
@bot.message_handler()
def extract_number_i(m):
	i = m.text
	i = int("".join([s if s.isdigit() else "" for s in i]))
	if i is not None:
		bot.send_message(m.chat.id, "before")
		return
	else:
		bot.send_message(m.chat.id, result)
        
	
def extract_number_a(m):
	a = m.text
	a = int("".join([s if s.isdigit() else "" for s in a]))
	if a is not None:
		bot.send_message(m.chat.id, "sum")
		return 
	else:
		bot.send_message(m.chat.id, result)

def extract_number_k(m):
	k = m.text
	k = int("".join([s if s.isdigit() else "" for s in k]))
	if k is not None:
		bot.send_message(m.chat.id, RandomLog())
		return
	else:
		bot.send_message(m.chat.id, result)

result = "error, not right number"

def RandomLog():
	b = []
	b = range(i+1,a)
	r = random.sample(b, k)
	return r



вот последний код, и выводиться так, то есть before обрабатывается снова и снова.

я, [29.04.16 13:24]
/ok

bot, [29.04.16 13:24]
afert

я, [29.04.16 13:24]
34

bot, [29.04.16 13:24]
before

я, [29.04.16 13:24]
56

bot, [29.04.16 13:24]
before
sum

gssomi ★★ ()
Ответ на: комментарий от gssomi
i = int("".join([s if s.isdigit() else "" for s in i]))
	if i is not None:
...

dafaq?

def extract_number_i(m):
    try:
        val = int(''.join(filter(str.isdigit, m.text)))
        bot.send_message(m.chat.id, 'sum')
    except ValueError:
        bot.send_message(m.chat.id, 'sum failure')

# -- OR --

def dfhsfghdfsf(m):
    digit_in_text = (str.isdigit(c) for c in m.text)

    if any(digit_in_text):
        bot.send_message(m.chat.id, 'sum')
    else:
        bot.send_message(m.chat.id, 'sum failure')

def extract_number_i(m):
...
def extract_number_a(m):
...
def extract_number_k(m):
...

def RandomLog():
	b = []
	b = range(i+1,a)

dafaq? чтотыпишешьтакнильзябохнакажэт!

anonymous ()
Ответ на: комментарий от gssomi

Ты покажи весь свой код и расскажи, что должен делать бот а мы посмеёмся постараемся сформулировать это на питоне. Пока что ни черта не понятно, поэтому и толковых ответов нет.

anonymous ()
Ответ на: комментарий от anonymous

все это спрашивали выше, код должен выводить рандомные числа с указанием диапазонов. На питоне все работало, но нужно было сформулировать питон +API

gssomi ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.