یه ربات ساده برای تلگرام

تو اوبونتو میخوام یه ربات با اکانت خودمون برای تلگرام درست کنیم که مثلا هر وقت یه کاری رو (تسک یا task) خواستیم ذخیره کنیم یا یه لیست درست کنیم و نزاریم کارمون زیر انبوه پیام ها گم بشه و ذخیره بشه این بات به کمکمون بیاد!

پس : بسم الله
این سایته برای نوشتن ربات روی رزبری پای هست و برای شروع چیز خوبیه.
با همین شروع میکنیم
و اون چند تا کارو که گفته انجام میدیم:

sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev
cd ~
git clone --recursive https://github.com/vysheng/tg.git && cd

تا الان چندتا پکیج نصب کردیم و یه کلاینت که برای تلگرام نوشته شده رو از گیت هاب کلون کردیم که توش میشه کد پایتون زد و باهاش کار کرد

علاوه بر اونا این پکیج هارو هم نصب کنید (من به مشکل برخوردم جلو تر پس بهتره این هارو هم داشته باشید) : libjansson-dev libevent-dev python-dev
و حالا کامپالش می کنیم.

./configure
make</p>

<p dir="ltr">

نکته اگه به مشکل No rule to make target خوردید این جا جوابش هست!

و این دو تا کد دستور هارو میریزن تو فولدر /bin که هر جایی بشه کلاینت رو اجرا کرد:

</p>

<p dir="ltr">sudo cp ~/tg/bin/telegram-cli /usr/bin
sudo mv ~/tg/tg-server.pub /etc/telegram-cli/server.pub</p>

<p dir="ltr">

نکته : اون گیت هابه مورد تایید خود تلگرام هست. چک کردمش و تقریبا میشه گفت بهترین اند!
اینم توتوریال ( 🙂 ) خود تلگرامه  که خوب همگانیه و برای اینکه مستقیم باهاش connect شین!
که عمومیه خوب
بعد اون کارا بزنید

telegram-cli

اگه دو کامند آخرو زدید و فایلای اجرایی رو تو bin ریختید مهم نیست کجا این دستورو اجرا میکنید ولی اگه نتونستید آدرسش اینجاست :

~/tg/bin/telegram-cli

خوب حالا ما تو ایم 😐 :))
یه help بزنید بینید چی میگه و آیا کار میکنه؟
خوب به نظر msg دستور خوبیه
ولی نوشته peer میخواد
بر میگردیم به اون سایته :‌

But what is peer? Peer can be a user, a chat or a secret chat. For user, it is the first name and last name, as displayed by “dialog_list” and “contact_list”, separated by an underscore like “David_New”. For chats, it is the chat title with spaces replaced by underscore, like “Functional_programming_news”. For secret chats, it is the same as for user but with a “!_” prefix like “!_David_New”. Note that you can use tab completion on the peer name and that the peer name is case sensitive.

هممم
پس  برای peer اسم و فامیل طرفو با _ میزنیم
مثلا :

 

msg Erfan_Mehraban خوبی؟

که خوب، کار میکنه 😀
خوب حالا باید بتونم مسج هایی که بهم میرسه رو از این api بگیرم و اسم افراد رو بخونم
این رو پیدا کردم که با php هست:

telegram-cli needs to run on a unix-socket (-S) or a port (-P), so telegram-cli-client can connect to it.
You should also start it with -W so the contact-list gets loaded on startup.

این یه پروژه خوبه برای فرستادن و دستور و بسیار کامله
ولی من یه چی می خوام که وقتی پیام رسید یه کار بکنه
یه کم که گشتم (یه کم که نه… خیلییییی!) فهمیدم که میتونیم کد پایتون run کنیم با telegram-cli
اینجوری

–python-script/-Z      python script file

telgeram-cli -Z someCode.py


مستند سازی های مربوط به پایتون کلاینت هم هست اگه میخواید بخونید!

ولی باز با کلی ور رفتن و یاد گرفتن پایتون فهمیدم که بعد از این که این گیت بالایی  رو کلون کردید این کد رو با کد توی tg-test.py عوض کنید (چون کد اولیش هم باگ داره هم کار مارو انجام نمیده:


#!/usr/bin/env python
# -*- coding: utf-8 -*- #برای فارسی نویسی و خونی
import tgl #کتابخونه ای که برای کار با تلگرام استفاده میشه
import pprint
from functools import partial

global our_id
our_id = 0
pp = pprint.PrettyPrinter(indent=4)

binlog_done = False;

def on_binlog_replay_end():
 binlog_done = True;

def on_get_difference_end():
 pass

def on_our_id(id): #آی دی اکانتی که داریم روش بات رو ران میکنیم میگیره
 global our_id
 our_id = id
 return "Set ID: " + str(our_id)

def msg_cb(success, msg):
 pp.pprint(success)
 pp.pprint(msg)

HISTORY_QUERY_SIZE = 100

def history_cb(msg_list, peer, success, msgs):
 print(len(msgs))
 msg_list.extend(msgs)
 print(len(msg_list))
 if len(msgs) == HISTORY_QUERY_SIZE:
 tgl.get_history(peer, len(msg_list), HISTORY_QUERY_SIZE, partial(history_cb, msg_list, peer));

def cb(success):
 print(success)

def on_msg_receive(msg): #وقتی یه پیام برامون میاد این تابع صدا زده میشه

 #برای اینکه peer ست کنیم و بعدا بتونیم برای اون کاربر یا گروه پیغام بفرستیم
 if msg.dest.id == our_id: # direct message چک کردن مقصد یا مبدا پیغام
 peer = msg.src
 else: # chatroom
 peer = msg.dest

 if (msg.text.startswith("/help")): #اگه پیغاممون با این کلمه شروع میشه برامون راهنمای کار با بات رو بفرسته
 peer.send_msg("سلامnبرای اضافه کردن :n /add &lt;task&gt;n برای نشان دادن :n /show n برای حذف :n /del &lt;line&gt;") #برای فرستادن پیغام از این تابع استفاده میکنیم

 if msg.text.startswith("/add"):
 f = open(str(peer.id),"a+") # یه فایل با نام آی دی کسی یا گروهی که داریم باهاش چت میکنیم درست میکنیم که تسک های گروه ها قاطی نشه
 f.write (msg.text[5:].encode("UTF-8")+"n")
 f.close()

 if msg.text.startswith("/del"): #برای حذف کردن یک تسک
 f = open(str(peer.id),"r+") # فایلی که مربوط به اون گروه یا شخصه رو باز میکنیم
 tasks = f.readlines()#خط هارو میریزیم تو این آرایه
 num = int(msg.text[5:].encode("UTF-8")) #اون خطی که باید حذف بشه رو میگیریم از پیام
 del tasks[num-1] # حذفش میکنیم
 print (tasks)
 f.seek(0, 0)
 f.truncate() # فایل رو خالی میکنیم تا تسک هارو دوباره بریزیم توش
 f.write(''.join(tasks)) # تسک های جدید رو بدون تسکی که حذف شد میریزیم تو فایل
 f.close()

 if msg.text.startswith("/show") or msg.text.startswith("/del") or msg.text.startswith("/add"): # بعد از هر کاری می خوام که تسک ها نمایش داده بشن
 f = open(str(peer.id),"a+")
 f.seek(0, 0);
 tasks = f.readlines()
 export="" # تو این متغیر چیزی که قراره نمایش داده بشه رو میریزم
 for x in range(0, len(tasks)):
 export += str(x+1)+"."+str(tasks[x]) # تسک هارو با شماره و تمیز نشون قراره بدم
 f.close()
 if (export==""):
 peer.send_msg("هیچی نیس!") # اگه فایلی نباشه یا تسکس نباشه این پیام نشون داده میشه
 peer.send_msg(export) # export رو میفرستم به کاربر یا گروه

def on_secret_chat_update(peer, types): # توضیحات مربوط به این توابع زیاد به دردمون نمی خوره.. تو اون لینک بالا ببینید
 return "on_secret_chat_update"

def on_user_update(peer, what_changed):
 pass

def on_chat_update(peer, what_changed):
 pass

#Set callbacks

# یه سری تابع تعریف میکنیم که اگر اتفاقی افتاد توابع اجرا بشن.. توضیحاتش تو اون لینک مستند سازی هست
tgl.set_on_binlog_replay_end(on_binlog_replay_end)
tgl.set_on_get_difference_end(on_get_difference_end)
tgl.set_on_our_id(on_our_id)
tgl.set_on_msg_receive(on_msg_receive)
tgl.set_on_secret_chat_update(on_secret_chat_update)
tgl.set_on_user_update(on_user_update)
tgl.set_on_chat_update(on_chat_update)

دیگه کارمون تمومه
در آخر یادتون باشه موقع امتحانا کد نزدید!
نظر پظرم بدید بی زحمت
با نشر و لایک و این حرفا !!🙌
همین ✌پیس
نکته : اگه مشکلی دیدین یا کد بهتری دارین نظر بدید یا بهم ایمیل بدید.

7 دیدگاه در “یه ربات ساده برای تلگرام”

  1. مرسی. تلاش خوبی بوده ولی راستش کمی سردرگم است. یعنی آدم آخرش بیشتر از اون که چیزی یاد بگیره یکسری کد کپی پیست کرده و سردرگم شده. باید اول دید کلی رو بگی که می خوای چیکار کنی و چطوری به اون برسی. مثلا بگی که می خوای فلان بات رو بنویسی و می دونیم که تلگرام کلاینت های مستقلی داره که تحت پایتون می شه اینجوی استفاده شون کرد. پس حالا اینطوری کلاینت رو نصب می کنم و چک می کنم که کار کنه. حالا یک کد هم دارم که اینطوری کار می کنه و به فلا روش این دو رو به هم وصل می کنم.
    هر چقدر هم حواشی بی ربط رو کمتر کنی خواننده بهتر می تونه متن رو دنبال کنه. مثلا اینکه تو قبلا کد نزدنی یا اینکه اشتباه سرچ کرده ای یا این تیپ چیزها با اینکه از نظر تو جالبن ولی باعث می شه کسی که می خونه سر رشته رو از دست بده. حتما باید تمپلیت رو هم درست کنی که کد و اینها به خوبی قابل خوندن بشن. در غیراینصورت خواننده حس می کنه خودت خودت رو جدی نگرفته ای (:

    مطلب بسیار جالبی است و می تونه کلی توجه جلب کنه به شرطی که اینهاش اصلاح بشه به نظرم. خود موضوع هم بهتره کمی جذابتر بشه. یعنی یک مشکل واقعی رو حل کنه. مثلا یک چیزی درست کن که در فلان تاریخ برات یک مسیج بده، یا اگر فلان جا فلان چیز تغییر کرد مسیج بده بسیار موثرتر می تونی توجه خواننده ات رو جلب کنی.

    بازم می گم که جالبه و خوب نوشتی ولی رعایت جزییات می ونه جذابترش هم بکنه.

  2. با سلام وتشکرازمطلب خوبتون
    من به یک مشکلی برخورد کردم
    وقتی کد زیر را اجرا میکنم
    hamid@hamid-virlinux:~/tg$ bin/telegram-cli -Z test-hamid.py
    پیامی ظاهر می شود که -Z تعریف نشده است
    bin/telegram-cli: invalid option — ‘Z’

    ممنون می شوم راهنماییم کنید که به چه شکل باید اسکریپتم را اجرا کنم

    1. سلام
      ببخشید بابت تاخیر
      اول از همه مطمئن شو که کلاینت کامپایل شده و توی نصبش مشکلی پیش نیومده.
      گاهی اوقات هم ممکنه توی ورژنی که نصب کردی اشتباها این آپشن رو بر داشته باشن. من یه نگاه انداختم فهمیدم که تو قسمت issues خودت پرسیدی و این خوبه. منتظر باش تا حواب بدن. ولی اگه خیلی معطل شدی تو تلگرام با آی دی @surye تماس بگیر!

  3. اینهمه زحمت کشیدید دلم نیومد نظر ندم.واقعا دستتون درد نکنه و خسته نباشید.ولی من متوجه نشدم که با چ زبانی اخر باید کار کرد و یه چیز شبیه نت بینز نمیخواد واس ران ؟ من اخه الان باید این سیستم عاملرو نصب هم کنم.به زبان جاوا نداره ؟؟؟ ممنون.خدا یارتون

    1. سلام
      برای نوشتن ربات دیگه ازین استفاده نمیشه. این پست رو من زمانی نوشتم که بات توسط تلگرام معرفی نشده بود. الان دیگه کتابخونه های زیادی برای بات تلگرام نوشته شده که می‌توانید از اونا استفاده کنید. سرچ کنید. پیدا میشه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *