در قسمت اولِ آموزش، چگونگی ساخت ربات تلگرام را توضیح دادیم و به نحوهی کارکرد و چگونگی برقراری ارتباط با آن پرداختیم. در این قسمت از آموزش سعی میکنیم که با استفاده از برد آردوینو، به ربات ساختهشده، جان ببخشیم. فرقی نمیکند از کدام مدل برد آردوینو استفاده کنیم. مهم این است که بستر اینترنت فعال باشد و ما قادر باشیم دادهها را از بستر اینترنت منتقل کنیم. راههای زیادی برای اتصال به اینترنت وجود دارد؛ مثل استفاده از بستر GPRS یا ADSL و راههای بسیارِ دیگر. ما سعی میکنیم سادهترین راه ممکن را انتخاب کنیم تا از پیچیدگیهای بیمورد کم کنیم. فکر میکنم سادهترین و کمهزینهترین راه ارتباطی، استفاده از بستر WIFI و ماژول ESP8266 باشد. این ماژول از یک پردازنده 80 یا 160 مگاهرتزی استفاده میکند که ما را قادر به برنامهنویسی مستقیم بر روی آن میکند.
برای اتصال و جان بخشیدن به ربات تلگرام با سیسوگ همراه باشد.
از چه آردوینویی استفاده خواهیم کرد؟
همانطور که قبلاً گفتیم فرقی نمیکند و شما بهراحتی و با درک نحوهی ارتباط، با هر برد دلخواهی، قادر به انجام این کار خواهید بود. تنها کافی است که بستر اینترنت را فراهم کنید. برای کاهش پیچیدگیِ کار ما از ماژول وای فای ESP8266 استفاده خواهیم کرد. ماژول ESP8266 یک ماژول Wifi ارزانقیمت است که امکان اتصال wifi را فراهم میکند. از این ماژول به دو صورت میتوان در پروژه استفاده کرد:
در حالت اول ماژول را به برد آردوینو وصل میکنیم و با استفاده از دستورات AT و پورت سریال با آن ارتباط برقرار می کنیم. در این روش وجود یک برد پردازندهی مستقل الزامی است.
شاید برای شما مفید باشد: پروژه های آردوینو
در حالت دوم، برنامه را بر روی حافظه ESP8266 بارگذاری میکنیم و برنامه توسط پردازنده ESP8266 اجرا میشود و نیازی به برد دیگری نیست. قطعاً این روش کمهزینهتر و سریعتر است. لازم نیست که حتماً از بردهای آردوینو موجود استفاده کنید. میتوانید ماژول را تهیه کرده و با چند رشته سیم به یک مبدل سریال وصل نمایید. خوب کار تمام است و فقط کافی است برنامه را بنویسید.
از چه ویرایشگری استفاده میکنیم؟
هنگامیکه اسم آردوینو میآید همه به یاد ادیتور ساده و ابتدایی آردوینو میافتند. البته این ویرایشگر برای شروع کار مناسب است ولی وقتیکه قصد داریم بهصورت حرفهای از آردوینو استفاده کنیم، نقایص این ویرایشگر بیشتر از پیش مشخص میشود. شاید اصلا کار به جایی برسد که کلاً قید کد نویسی برای آردوینو را بزنید.
برای جبران نقایص موجود در این ویرایشگر، تیم سیسوگ قبلاً یک ویرایشگر حرفهای ایجاد و معرفی کرد که توصیه میکنیم حتماً از این ویرایشگر استفاده کنید. این ویرایشگر دارای قابلیتهای زیادی از جمله کدکامپلیشن است که روند برنامهنویسی را بسیار تسریع میکند.
در این آموزش هم از ویرایشگر سیسوگ استفاده خواهیم کرد. نگران نباشید، اگر تمایلی به استفاده از این ویرایشگر ندارید همچنان سورسهای نوشتهشده را میتوانید با ویرایشگر کلاسیک آردوینو کامپایل و از آنها استفاده کنید.
ربات ما قرار است چهکار کند؟
در قسمت قبلی از آموزشها نحوهی ساخت ربات تلگرام را با استفاده از ربات پدرخوانده (botfather) آموزش دادیم و مقدمات ابتدایی در خصوص نحوهی ارتباط با سرور تلگرام را توضیح دادیم. همانطور که در ابتدا گفته شد، در این مقاله قصد داریم که به ربات تلگرام جانبخشی کنیم؛ به صورتی که ربات ما قادر به تعامل با کاربران باشد و بتواند پیام های ارسال شده توسط کاربر را دریافت کند و بعد از پردازش، پاسخ صحیحی به آنها بدهد.
پس در واقع در این مرحله از آموزش، ربات باید قادر به انجام حداقل دو متد مختلف باشد: اول قادر باشد پیامهای دریافتی را از سرور تلگرام بخواند و دوم بتواند به کاربران پیام ارسال کند.
توضیح متدهای مورداستفاده
در نخستین گام ربات باید قادر باشد پیام کاربران را از سرور تلگرام دریافت کند. برای خواندن پیامِ کاربران، باید از متد getUpdates برای دریافت آخرین پیامها استفاده کنیم.
همانطور که در سایت تلگرام توضیح داده و در عکس زیر مشخص است این تابع دارای تعدادی پارامتر ورودی است که خوشبختانه همه آنها اختیاری هستند و در صورت وارد نکردن آنها خطایی دریافت نمیکنید و تابع اجرا خواهد شد.
خروجی تابع هم یک شیء از نوع Update است.
تنها ورودی که در این مرحله به آن احتیاج داریم ورودی offset است. برای روشن شدن موضوع بگذارید مسئلهای مطرح کنیم: سرور تلگرام از کجا متوجه میشود که شما پیام کاربرها را پردازش کردهاید؟ درخواست آپدیت بهتنهایی نمیتواند ملاک خوبی برای دریافت پیامها باشد چرا که شاید در هنگام دریافت پیام، اینترنت قطع شد و پیامها بهدست شما نرسید؛ آنوقت تعدادی از پیامها را از دست خواهید داد.
برای حل این مشکل راهحل جالبی وجود دارد که در واقع استفاده از offset است. هر پیامِ آپدیتی که از سمت سرور برای شما ارسال میشود دارای یک مشخصه ID است که در واقع یک عدد است. اگر شما عدد مذکور را در متغیر offset با فراخوانی این تایع ارسال کنید، تلگرام متوجه خواهد شد شما پیام مذکور را دریافت و پردازش کردهاید و پیام موردنظر را از لیست ارسال مجدد به شما حذف خواهد کرد.
برای فراخوانی تابع Getupdates و ارسال پارامتر offset میتوان از URL زیر استفاده کرد:
1 | https://api.telegram.org/bot<Your Bot Key>/getupdates?offset=2326742 |
ما بهعنوانمثال مقدار 2326742 را در متغیر offset قرار دادیم. در مثال فوق بهجای عبارت <Your Bot Key> باید کلیدی که هنگام ساخت ربات از تلگرام دریافت کردید را قرار دهید.
آخرین پیامی که دریافت کرده بودیم، مقدار update_id معادل 2326741 داشت که پیام مربوطه را دریافت و پردازش کردیم برای دریافت پیام بعدی مقدار آن را یکی افزایش دادیم که پیام بعدی را در صورت وجود بخوانیم.
همانطور که در عکس زیر میبینید، تلگرام پیام مربوطه را برای ما ارسال کرده است:
آپدیت ارسالشده حاوی مشخصات فرستنده و متن پیام است.
برای ارسال پیام باید از تابع SendMessage استفاده کنیم.
این تابع نیاز دارای چندین پارامتر ورودی است، ولی بهجز دو پارامتر chat_id و text، مابقی پارامترها اختیاری هستند و میتوان از آنها چشمپوشی کرد.
پارامتر chat_id در واقع یک عدد منحصربهفرد برای هر فردی است که دارد با ربات چت میکند. تلگرام از این طریق متوجه میشود که پیام موردنظر به چه شخصی ارسال شود. در عکس زیر مقدار آن مشخص شده است:
پارامتر دوم text در واقع متنی است که باید ارسال شود.
فرض کنید میخواهیم پیام salam sisoog را برای کاربر SIsoogOS ارسال کنیم. با توجه به عکس فوق، id کاربر عدد 334577197 است. تابع SendMessage به شکل زیر باید فراخوانی شود:
1 | https://api.telegram.org/bot<Your Bot Key>/sendMessage?chat_id=334577197&text=salam%20sisoog |
دقت داشته باشید در صورتی پیام به کاربر ارسال میشود که کاربر قبلاً ربات را Start کرده باشد؛ یعنی یک بار دستور /Start را برای ربات ارسال کرده باشد.
درصورتیکه پیام با موفقیت ارسال شده باشد، مطابق عکس فوق نتیجه را گزارش خواهد کرد.
برنامهی آردوینو
قبل از هر چیزی لازم است که تغییراتی در برنامه لحاظ کنید تا برنامه قادر باشد به WIFI و تلگرام متصل شود. پس مقادیر زیر را در برنامه اصلاح کنید:
1 2 3 | #define Ssid "Your_WIFI_SSID" #define Password "Your_WIFI_PASS" #define Bot_Key "Your_BOT_Key" |
SSID یا اسم شبکهی WIFI را باید در گزینهی اول وارد کنید. گزینهی دوم رمز عبور وای فای است و گزینهی سوم هم کلید ربات تلگرام است که باید درون کتیشنها (علامت نقلقول) بدون فاصله وارد کنید.
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 | #include "Arduino.h" #include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h> #include "ZeusTgBot.h" ESP8266WiFiMulti WiFiMulti; #define Ssid "Your_WIFI_SSID" #define Password "Your_WIFI_PASS" #define Bot_Key "Your_BOT_Key" Zeus_TgBot Bot(Bot_Key); // Witty Cloud Board specifc pins const int LDR = A0; const int BUTTON = 4; const int RED = 15; const int GREEN = 12; const int BLUE = 13; void Tg_Message_Prossess(uint32_t mgs_id,uint32_t sender_id,String msg); void setup() { // Add your initialization code here Serial.begin(115200); Serial.print("\n"); //Serial.setDebugOutput(true); // We start by connecting to a WiFi network WiFiMulti.addAP(Ssid, Password); Serial.println(); Serial.println(); Serial.print("Wait for WiFi... "); /*Wait For Connect to Server*/ while(WiFiMulti.run() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(); Serial.println("Connect to NetWork .... OK"); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); // Initialize LDR, Button and RGB LED pinMode(LDR, INPUT); pinMode(BUTTON, INPUT); pinMode(RED, OUTPUT); pinMode(GREEN, OUTPUT); pinMode(BLUE, OUTPUT); Bot.Set_Message_Event(&Tg_Message_Prossess); Zeus_TgBot::User_t User; if(Bot.GetMe(&User)) { Serial.println(); Serial.println("Bot Information"); Serial.println("first name: " + User.first_name); Serial.println("last_name: " + User.last_name); Serial.println("username: " + User.username); Serial.println(); } else { Serial.println("Can Not Get Bot Info"); } } void Tg_Message_Prossess(uint32_t mgs_id,uint32_t sender_id,String msg) { Serial.println("Get Message - "+msg); Serial.println(mgs_id); Bot.sendMessage(sender_id, msg); } // The loop function is called in an endless loop void loop() { //Add your repeated code here digitalWrite(GREEN, true); Bot.GetUpdates(); digitalWrite(GREEN, false); delay(1000); } |
درصورتیکه مشکلی وجود نداشته باشد، لاگی مطابق لاگ زیر دریافت خواهید کرد. در لاگ زیر وضعیت کانکت شدن به شبکه WIFI و مشخصات ربات را در شروع برنامه نمایش میدهد:
1 2 3 4 5 6 7 8 9 | Connect to NetWork .... OK WiFi connected IP address: 192.168.1.120 Bot Information first name: Sisoog_arduino last_name: username: Sisoog_arduinobot |
برنامه چطور کار میکند؟
تا جای ممکن سعی کردیم که برنامه را در سادهترین حالت ممکن پیادهسازی کنیم. برای همین یک کلاس (کتابخانه) به اسم Zeus_TgBot ایجاد کردیم که تمام اتفاقات مربوط به ربات و ارتباط با سرور تلگرام درون آن انجام می شود و از چشم کاربر دور بماند. البته شما میتوانید سورس این کتابخانه را مرور کنید و اطلاعاتی را راجع به آن بهدست بیاورید.
کلاس مذکور به شکل زیر تعریف شده است:
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 | typedef void (*Message_Event) (uint32_t mgs_id,uint32_t sender_id,String msg); class Zeus_TgBot { public: typedef struct { uint32_t id; String first_name; String last_name; String username; }User_t; Zeus_TgBot(String token); virtual ~Zeus_TgBot(); void Set_Message_Event(Message_Event Event_Call); bool GetMe(User_t *User); bool GetUpdates(); bool sendMessage(uint32_t chat_id, String text); private: String botkey; StaticJsonBuffer<4096> jsonBuffer; WiFiClientSecure client; volatile uint32_t UpdateID; String SendCommand(String command); void ProssessOneMessage(String msg); Message_Event Func_Message_Event; }; |
در واقع این کلاس در حال حاضر 4 متد برای کار با تلگرام دارد.
در ابتدا باید یک شیء از این کلاس ایجاد کنید. برای ایجاد یک شیء نیاز است که شما کلید ارتباطی با ربات را وارد کنید.
مطابق خط 13 برنامه اصلی:
1 | Zeus_TgBot Bot(Bot_Key); |
تابع بعدی تابع Set_Message_Event است که در واقع این تابع آدرس یک متد را دریافت میکند و هر وقت پیام جدیدی از کاربر دریافت شد آن متد را فراخوانی میکند. متد باید به شکل خاصی تعریف شود تا کلاس بتواند آن را فراخوانی کند.
این تایع در خط 58 از برنامهی اصلی مورداستفاده قرار گرفته است:
1 | Bot.Set_Message_Event(&Tg_Message_Prossess); |
تابع بعدی GetUpdates است که در واقع باید در بازههای خاص زمانی فراخوانی شود. با هر بار فراخوانی این تابع، بررسی میشود که آیا پیام جدیدی برای پردازش وجود دارد یا نه.
این تابع در خط 89 از برنامهی اصلی مورداستفاده قرار گرفته است:
1 | Bot.GetUpdates(); |
و آخرین تابع هم sendMessage است که در ورودی، ID کاربری را دریافت میکند و در ادامه متن پیامی که قرار است ارسال شود و پیام را برای کاربر موردنظر ارسال میکند.
1 2 3 4 5 6 7 | void Tg_Message_Prossess(uint32_t mgs_id,uint32_t sender_id,String msg) { Serial.println("Get Message - "+msg); Serial.println(mgs_id); Bot.sendMessage(sender_id, msg); } |
پیامی که دریافت کردهایم را مجدداً به فرستنده ارسال میکنیم و این اولین قدم است برای جان بخشیدن به ربات.
تا این مرحله، علاوه بر برقراری ارتباط با سرور تلگرام، قادر بودیم که پیامهای ارسالشده را دریافت کنیم و آنها را مجدداً به فرستنده ارسال کنیم. میتوانیم برای کاملتر شدن، پیامها را تغییر بدهیم و بعد ارسال کنیم. این کاری است که قرار است در مقالهی بعدی این آموزش به آن بپردازیم.
در مقالهی بعدی نحوه اتصال دستگاه به ربات تلگرام، بدون نیاز به فیلترشکن را آموزش خواهیم داد.
دانلود سورس آردوینو:
برای دانلود سورس کد به گیت هاب مراجعه کنید.
سلام،وقتتون بخیر
میخواستم ببینم بدون آردینو هم میشه با ربات تلگرام ارتباط برقرار کرد؟
سلام
شما با هر سخت افزار قابل برنامه ریزی که بشه به اینتررنت باهاش دسترسی داشت میتونید یه چنین کاری انجام بدیید
من مخیوام esp8266رو به تلگرام وصلکنم و چندتا رله رو کنترل کنم همه این روشا رو از خیلی از سایتهای دیگه رو هم امتحان کردم نمیشه میشه یکی کمک کنه
فکر کنم یه قسمت اموزش در خصوص اتصال در حالت فیلترینگ منتشر کردم
اینترنت اشیاء و اتصال به ربات تلگرام بدون محدودیت و فیلتر
سلام خسته نباشید کسی میدونه چرا تو این خط از برنامه ارور میده
Bot.Set_Message_Event(&Tg_Message_Prossess);
خوب احتمالا باید متن خطا رو بذارید که بشه گفت چرا خطا دریافت میکنید.
با سلام و تشکر بابت مطالب بسیار مفیدتان
ببخشید حتمن باید برنامه بر روی خوده ماژول پروگرام بشه یا اینکه بوسیله AT COMMAND هم میشه با تلگرام ارتباط برقرار کرد؟
قطعا با استفاده از at کامند هم میشه چنین کرد ولی احتمالا لازمه پروتکل های استفاده شده رو پیاده سازی کنید که احتمالا به مقدار حافظه زیادی نیاز دارید اگر چنین محدودیتی با حافظه وجود ندارد به سادگی میتوانید از at کامند هم استفاده کنید.
سلام لطفا نحوه اتصال به سرور با پروکسی رو هم بگین چون این کد عملا تو ایران بدرد نمیخوره دلیلشم فیلتر دایمی تلگرامه…
سلام خوب این مقاله برای قبل از فیلترینگ تلگرامه و البته باید بگم به زودی روش اتصال به ربات رو میگیم که تو شرایط حال حاظر هم کار کنه 🙂
با سلام
تشکر فراوان از زحمات بی دریغ شما
من این پروژه رو پیاده کردم و روی روترم هم چی چی ان رو زدم و تلگرام رو بدون فیلتر باز میکنه
ولی متاسفانه چون dns ها رو هم دوستان گل فیلتر کردن بنابراین host کار نمیکنه
حالا با توجه به اینکه برنامه “پیام رسان بله” دقیقا شبیه به تلگرامه یه تغییرات کوچولو به برنامه دادم ولی بازم کار نمیکنه
امکانش هست یه خرده راهنمایی کنید با هم درستش کنیم و publish اش کنیم؟
امم پشنهاد بدی نیست – ولی فکر نمیکنم بله دقیقا مثل تلگرام بوده باشه احتمالا نیاز به تغییر داره
قبلا بهش فکر بودم ولی فرصت نشده پیاده سازیش کنم
البته یه راه خیلی ساده تر داره که بشه تحریم ها رو دور زد (تحریم خودی رو میگم ) اگر فرصت شد آموزشش رو میذارم
سلام و درود خدمت زئوس عزیز،آموزشی که فرمودین رو آماده نمیکنین؟
آماه شده و تست هاش هم انجام شده و فقط باید مطلبش رو کامل کنم که احتمالا توی هفته آینده اتفاق می افته
با سلام و خسته نباشید.یه چند ماهیه تلگرامو فیلتر کردن.ایا مشکلی در ارتباط اردینو به سرور تلگرام پیش میاد؟{تو اردینو نمیشه کارای vpnرو برای فیلتر اجرا کرد}ممنون میشم جواب بدید.
سلام دوست عزیز ؛ بله قطعا ارتباط آردوینو با سرور تلگرام دچار مشکل خواهد شد ؛ پیاده سازی پروکسی داخل حافظه محدود Arduino کاری نیست که بشه انجامش داد یا احتمالا خیلی پیچیده خواهد بود ؛ احتمالا راحت تر باشه که پروکسی رو خارج از آردوینو رو روی روتر انجام بدید .
سلامخسته نباشید ممنون بابت این اطلاعات مفیدی که در اختیار عموم قرار میدید،میتونم ازتون خواهش کنم یه راهی قراربدید که بتونیم این فیلترنیگدوربزنیم و آردوینو بتونه با سرور تلگرامارتباط برقرار کنه؟ خیلی ممنون
سلام و درود به شما
هوم خوب یکی از کارایی که میشه کرد اینه که از http پراکسی استفاده کنید که البته مقداری نوشتنش سخته و تا اونجایی که خودم سرچ کردم کتابخانه آماده ای براش پیدا نکردم.
سلام
خسته نباشید
من الان چطوری میتونم که برد پای فای رو به برد اردینو uno متصلش کنم.ینی هر پین رو ب کدام پین اردینو بزنم.لطفا اینو یه مقداری ذقیق تپضیح بدید چون من بدجوری گیج شدم.
و واقعا ممنون از مقاله ی عالیتون منو تو پروژم خیلی کمک ککردش
سلام
خواهش میکنم دوست عزیز ، هدف ما هم دقیقا همین هست ، این که بتونیم کمکی کرده باشیم
فکر میکنم منظور شما برد wifi هستش ، خوب این که چطور می تونید به برد uno وصلش کنید برمیگرده به این که نوع ماژول Wifi مورد نظرتون چی هست
اگر از همین esp8266 میخواید استفاده کنید احتمالا با پورت سریال باید وصل کنید ماژول رو
البته نا گفته نماند که به راحتی می توانید برنامه آردوینو را روی خود ماژول esp8266 پروگرام کنید و نیاز به برد uno هم نیست
سلام ممنون بابت اموزش کاربردیتون
من ماژول NodeMcu تهیه کردم اگه میشه بگید اتصالات با این ماژول چطوریه؟
سپاس فراوان از زحماتتون
سلام دوست عزیز
در ابتدای پست ، توضیح داده شده که به چه صورت می تونید esp8266 رو پروگرام کنید.
سلام
من مقاله هارو مطالعه کردم . مقاله سومش نیست. چطوری باید ربات تلگرام رو راه اندازی کنم . گفته بودید مقاله سومی هم هست ولی من پیداش نکردم . میشه راهنماییم کنید
سلام و درود
برای مشاهده مقاله سوم به این مطلب مراجعه کنید.
آموزش اتصال ربات تلگرام به آردوینو
Mohammad Mahdi:
سلام .
خوب هستید.
وقت بخیر.
جناب من این ماژول تهیه کردم.و پایه vccوgndوrxوtxو gpoi0را به زمین وصل کردم.
اما هنگام پروگرم کردن کد اردینو در کامپلیر مشکل میگیرد.
راستی این نقاط به ماژول مبدل سریال به ttl وصل کردم .
اما کار نمی کند.و هنگام اپلود کردن هم یراد میگرید و پورتشم درست وصل کردم.
سلام دوست من
خوب ظاهر کارای که کردید درسته و نباید برای پروگرام کردن ماژول مشکلی وجود داشته باشه
چند تا نکنه رو میگم بررسی کنید ، اول این که ولتاژ کاری ماژول شما احتمالا 3.3 ولت است ، ولی تا وقتی که مدل ماژولی رو که تهیه کردید رو نگید نمیشه مطمئن بود
نگته دوم اینه که پایه RX ماژول به TX مبدل وصل میشه
و پایه TX ماژول به پایه RX مبدل وصل میشه ، مبدل شما هم باید از توع TTL باشد. ؛ همون چیزی که توی عکس همین پست مشاهده می کند.
پایه CP/PD رو هم باید با یه مقاومت مثلا 2.2 کیلو به مثبت وصل کنید
و پایه GPIO0 رو هم با مقاومت (مقاومت حتما باشد) به زمین وصل کنید !
با این ترتیب وصل کردن ماژول هنگام روشن شدن توی حالت بوت قرار میگره و شما میتونی اونو پروگرام کنید ، دقت کنید حتما بعد از این روش وصل باید ماژول ریست بشه تا بره تو حالت بوت قرار بگیره و برای خارج شدنش از این حالت هم باید ریست بشه.