چند سالی میشود که تلگرام و کلیه متعلقاتش فیلتر شده است و دوجین نرم افزارهای پیامرسان داخلی جهت جایگزینی معرفی شدهاند. اما همچنان کاربرهای ایرانی با توجه به آمار رسمی منتشر شده و همچنین میزان دانلود پیامرسانهای داخلی، تمایلی به استفاده از نرم افزارهای پیام رسان داخلی نشان نمیدهند و به کمک انواع و اقسام فیلترشکنها سعی میکنند که دسترسی خود را به تلگرام حفظ کنند. از طرفی با رشد روز افزون دستگاههای IOT و کاربردی شدن آنها نیاز بستر تعاملی ساده با این دستگاهها بیش از پیش حس میشود! و چه بستری مناسبتر و در دسترس تر از پیامرسان! با جزییات بیشتر این اتصال هیجان انگیز به ربات تلگرام بدون فیلتر با سیسوگ همراه باشید:)
چرا و چطور پیام رسان تلگرام
همانطور که در مقدمه اشاره کردم همچنان پیامرسان تلگرام جزو پر استفاده ترین پیامرسانها بین کاربران ایرانی است. پس اگر قرار باشد پیامرسانی را برای این اتصال (اتصال دستگاههای IOT و پیامرسان) انتخاب کنیم بهترین گزینه همچنان با اختلاف زیاد تلگرام است. تا قبل از فیلترینگ رسمی تلگرام در کشور در چند مقاله (آموزش اتصال ربات تلگرام به آردوینو – قسمت اول و آموزش اتصال ربات تلگرام به آردوینو – قسمت دوم) سعی کردیم نحوه اتصال دستگاههای IOT را با این پیامرسان آموزش دهیم و در ادامه طی “پروژه آموزش اتصال ربات تلگرام به آردوینو ESP8266 – ربات تلگرام در خانه” با ذکر یک مثل عملی جهت خاموش و روشن کردن لامپهای یک خانه نمونه کاربردی آن را بررسی کردیم.
اما با فیلتر شدن تلگرام ورق برگشت! هرچند که تلگرام از انواع مختلف پراکسی پشتیبانی میکند، اما پیاده سازی آنها در دستگاههایی که مقدار حافظه RAM و قدرت پردازشی محدودی دارند کاری ست بس دشوار! (البته که نشدنی نیست و پروتکلهای سبک مثل socks و http را به راحتی میتوان پیاده سازی کرد.) برای همین سعی کردیم که یک راه حل ساده و البته ارزان را در این مقاله بررسی کنیم که در ادامه بیشتر آن را توضیح خواهیم داد.
چرا از پروتکل های استاندارد استفاده نکنیم ؟
همانطور که احتمالا میدانید پروتکل های متنوعی وجود دارند که میتوان از آنها برای دسترسی به یک سرور (مثلا تلگرام) استفاده کرد. پروتکل های سبک و سنگینی که پیاده سازی آن در سخت افزار گاهی نشدنی و در مواردی هم بسیار دشوار است. اما چیزی که ممکن است ندانید این است که برخی از این پروتکلها تنها در داخل ایران قابل دسترسی دارند به عنوان نمونه پروتکل VPN برای ارتباط داخل به خارج از ایران مسدود است (البته اینجا منظور خود VPN است نه انواع رمزگذاری شده آن) یا پروتکل SOCKS هم چنین شرایطی دارد. پس اگر آنها را حتی در سخت افزار پیاده سازی کنیم با چالش دیگری روبرو خواهیم بود و آن هم امکان دسترسی است.
البته کار نشد ندارد. مثلاً برای ایجاد دسترسی SOCKS ابتدا باید یک سرور داخلی داشته باشید که دستگاههای شما از طریق SOCKS با این سرور در ارتباط باشند (قبلاً گفتیم این پروتکلها در شبکه داخل ایران همچنان کار میکنند) بعد سرور شما با یکی از پروتکلهای رمز شده ارتباط با خارج از ایران داشته باشد و بدین طریق قادر خواهید بود که دستگاه IOT خود را به ربات تلگرام متصل کنید. اما این راه فارغ از چالشهای فنی که ممکن است ایجاد کند هزینه زیادی در بر خواهد داشت که شاید برای خیلی کسب و کارها انجام این هزینه منطقی نباشد.
ایده اولیه راه حل اتصال به سرور تلگرام
با توجه به استدلال قبل، راه حل مورد نظر نباید هزینه زیادی داشته باشد و تا جای ممکن باید ساده باشد تا بتوان به آن را بر روی پلتفرمهای IOT پیاده سازی کرد! اما چطور چنین چیزی ممکن میشود؟ خوب مسئله زیاد پیچیدهای نیست.
یک مدل حمله و اسنیف اطلاعات وجود دارد به اسم Man-in-the-middle! نحوه کار به این شکل است که هکر بین فرستنده و گیرنده قرار میگیرد و ترافیک را رصد میکند! ما در اینجا نمیخواهیم ترافیک خودمان را رصد کنیم، بلکه میخواهیم از داخل ایران به خارج از ایران منتقل کنیم. پس از همین الگو استفاده خواهیم کرد. یعنی یک نرم افزاری خواهیم داشت که بین دستگاههای اینترنت اشیاء (IOT) و سرور تلگرام قرار خواهد گرفت و کارش این است که اطلاعات را از دستگاه دریافت کند به سرور تلگرام ارسال کند، سپس جواب را از سرور تلگرام دریافت کرده و بدون فیلتر به برنامه ربات تلگرام در دستگاه برساند.
حالا که کلیت موضوع و راه مشخص شد، انتخاب پلتفرم مناسب باقی میماند، این برنامه واسط را با هر زبانی میشود نوشت، اما ارزان بستری که میشود پیدا کرد بسترهاست اشتراکی و زبان PHP است. هزینه سالیانه تهیه یکهاست اشتراکی در مثلاً آلمان حدود ۲۵ هزار تومان یا حتی کمتر از این مقدار است و دامنه هم حدود ۱۵ تومان برای ۳ سال است. واقعاً چه چیزی کم هزینهتر از این میتوان پیدا کرد؟
تغییرات لازم در کتابخانه ZeusTg
قبلاً در “پروژه آموزش اتصال ربات تلگرام به آردوینو ESP8266 – ربات تلگرام در خانه” کتابخانه ZeusTg را از صفر نوشتیم و سورس آن را میتوانید از طریق گیت هاب سیسوگ پیدا کنید. در این کتابخانه از SOCKET برای اتصال به سرور استفاده میکنیم. لازم است که مکانیسم سوکت را به وب کلاینت تغییر دهیم تا قادر باشیم درخواستها را از طریق متدهای POST و GET به سرور ارسال کنیم.
خوشبختانه برای این کار نیاز نبود تا کل کتابخانه را از اول بازنویسی کنیم. تنها تغییرات کوچکی لازم بود تا در فانکشن SendCommand اعمال بشود:
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 | String Zeus_TgBot::SendCommand(String command, JsonObject& payload) { static String lUrl = ""; String ReqUrl = zHost; if(IsProxy == true) /*make Proxy URL*/ { ReqUrl = zHost + "?bot=" + botkey + "&api=" + command; } else { ReqUrl = zHost + "/" + botkey + "/" + command; } if( client.connected() && ReqUrl!=lUrl ) /* Change Req Url */ { if(is_debug) { Serial.println("#Zt Url Change. Disconnect"); } } // Connect with api.telegram.org if(!client.connected() || ReqUrl!=lUrl ) { if(is_debug) { Serial.print("#ZT Try Connect to "); Serial.println(ReqUrl); } if(!client.begin(ReqUrl)) { if(is_debug) { Serial.print("Can not connect to "); Serial.println(zHost); } return ""; } lUrl = ReqUrl; /*store req url*/ if(is_debug) { Serial.println("#ZT Connect OK"); } } String postData; payload.printTo(postData); client.addHeader("Content-Type", "application/json"); //Specify content-type header if(is_debug) { Serial.print("Send:"); Serial.println(postData); } String response = ""; int httpResponseCode = client.POST(postData); /*post data to server*/ if(httpResponseCode>0) { response = client.getString(); if(is_debug) { Serial.println("Send Ok."); Serial.print("Get:"); Serial.println(response); } } else { if(is_debug) { Serial.print("Error on sending POST: "); Serial.println(client.errorToString(httpResponseCode)); } } client.end(); return response; } |
البته فانکشنی هم برای تنظیم کردن آدرس پراکسی به کتابخانه اضافه شده است که تنها لازم است آدرس پراکسی را در آن تنظیم کنیم و دیگر تمام! همه چیز به خوبی کار خواهد کرد.
1 | void SetProxyHost(String pHost); |
دانلود و راه اندازی کد آردوینو ESP8266
فایل پروژه در انتهای پست پیوست شده است و شما میتوانید بهصورت رایگان آن را دانلود کنید. کدها درون نرم افزار VSCODE و با استفاده از افزونه platformIO نوشته شدهاند. با توجه به اینکه هنوز IDE حرفهای تر و رسمی آردوینو منتشر نشده است، بهتر است به جای نرم افزار فعلی آردوینو، از platformIO استفاده کنید. آموزش پلت فرم آی او قبلاً در سیسوگ منتشر شده است. همچنین شما میتوانید کد برنامه را بدون هیچ مشکلی درون نرم افزار خود آردوینو باز کنید. به یاد داشته باشید که درون کد، حتماً مقادیر زیر را با اطلاعات مربوط به خود تکمیل کنید:
1 2 3 4 | #define Ssid "WiFi SSID" #define Password "WIFI PASS" #define Bot_Key "BOT KEY" #define ProxyPage "PROXY URL" |
راه اندازی پراکسی سمت سرور
برای خریدهاست حتماً باید دقت داشته باشید که هاست ایران خریداری نکنید و حتماً هاست خارج از ایران باشد. همچنین قادر به پشتیبانی PHP نیز باشد. تنظیم دامنه نیز معمولاً توسط خود شرکتهای هاستینگ انجام میشود. تنها کافی است که یک فایل با اسم دلخواه درونهاست خود ایجاد کنید و محتوای زیر را درون آن قرار دهید:
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 | <?php /* Proxy For ZeusTg Arduino library by Zeus Sisoog.com */ $data = json_decode(file_get_contents('php://input'), true); if(!isset($_GET['bot']) || !isset($_GET['api'])) die('<center><h1>ZTg Proxy by sisoog.com</h1></center>'); $requrl = "https://api.telegram.org/" . $_GET['bot'] . "/" . $_GET['api']; $data_string = json_encode($data); //Setup cURL $ch = curl_init(); //The site we'll be sending the POST data to. curl_setopt($ch, CURLOPT_URL, $requrl); //Tell cURL that we want to send a POST request. curl_setopt($ch, CURLOPT_POST, 1); //Attach our POST data. curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string ); //Tell cURL that we want to receive the response that the site //gives us after it receives our request. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($data_string)) ); //Finally, send the request. $response = curl_exec($ch); //Close the cURL session curl_close($ch); //Do whatever you want to do with the output. echo $response; |
برای اطمینان از این که تمام کارها را به درستی انجام دادهاید، اگر آدرس فایل را در مرورگر وارد کنید باید با صفحهای به شکل زیر مواجه شوید.
اگر نوشته بالا رو دیدید، یعنی همه چیز آماده تست است و ربات تلگرام شما میتواند بدون فیلتر کار کند.
ممکن است این سؤال برایتان پیش آمده باشد که آدرس صفحه را چگونه به دست بیاورید؟ فرض کنید نام دامنه شما example.ir باشد و فایل را با اسم xbot.php در سرور ذخیره کرده باشید. بدیهی است که آدرس فایل به شکل زیر خواهد بود.
1 | http://example.ir/xbot.php |
و به شکل زیر باید در تابع SetProxyHost استفاده شود:
1 | Bot.SetProxyHost("http://example.ir/xbot.php"); |
شما با استفاده از این کتابخانه و برنامه میتوانید طیف وسیعی از دستگاههای اینترنت اشیاء IOT را بدون فیلتر به ربات پیام رسان تلگرام متصل کنید و این که چه وسیلهای را به چه شکلی متصل کنید، برمی گردد به میزان خلاقیت شما در استفاده از این کتابخانه. از درب ورودی منزل یا کرکره برقی مغازه و پارکینگ تا سیستمهای حضور و غیاب … همه و همه قادر هستند از این کتابخانه استفاده کنند.
لینکهای دانلود
اسم فایل
- Esp82Telegram.7z
سلام بر شما.
اگر بخواهیم از طریق اینترنت و از طریق همین سرور دیواس خودمون رو کنترل کنیم باید چیکار کنیم؟ با کمی تغییر در کد php و سمت سرور این کار شدنیه؟
سلام
ببخشید منظورتون رو درست متوجه نشدم
ولی هر چیزی با تغییر کد امکان پذیر هست :دی
با سلام و تشکر از مطالب ارزنده سایتتون. اگه امکانش هست همین آموزش رو برای پیام رسانهای وطنی هم بذارید.با تشکر
سلام دوست عزیز خواهش میکنم
برای پیام رسان های داخلی محدویتی وجود نداره – سعی میکنیم مطلبی در این خصوص آماده کنیم
با سلام و تشکر از مطالب ارزنده شما. امکانش هست همین پروژه رو برای پیام رسان های وطنی هم بذارید ؟
سلام
کدوم کتابخوبه رو باید تغییر داد؟؟؟ZeusTgBot.cpp or ZeusTgBot.h و کدام خط را؟؟
توی فایل main سمپل هست
و متغییر های لازم که باید تغییر کنن توی اون تعریف شدن.
درود
اگر واسه ارتباط iot بجای استفاده از ربات تلگرام تو یه پروژه از mqtt استفاده بشه چه تفاوت هایی خواهد داشت ؟
یعنی تفاوت استفاده از ربات تلگرام و mqtt چی هستش؟
mqtt یکی از پروتکل هایی هست که الانم زیاد داره استفاده میشه
اما شما برای mqtt لازمه که احتمالا برنامه اختصاصی خودتون رو بنوسید ولی استفاده از ربات توی یک پیام رسان خیلی کار رو از بابت دم دست بودن راحت میکنه – اگر نه mqtt اصلا برای این منظور طراحی شده و قبلا توی سیسوگ در موردش مقاله هم نوشتیم توی سایت
خیلی هم سبک تره
خب درسته ارتباط با تلگرام آسونتره نسبت به mqtt ولی الان با توجه به فیلتر بودن تلگرام و استفاده از هاست اختصاصی به عنوان یه روش برای دور زدن فیلتر که باز دردسر و هزینه خودش رو داره بهترین راه همون mqtt و یه بروکر مثل hivemq واسه یه ارتباط iot هستش
خوب البته که اگر بتونید یه نرم افزار اندورید اختصاصی با نیاز خودتون پیاده سازی کنید (که البته هزینه اش کم هم نیست) قطعا پروتکل های سبک مثل mqtt و امثالهم بهترین انتخاب هستن !
البته اگر بخواید حرفه ای کار کنید نباید سراغ بروکر های رایگان بردید و بهتره که بروکر خودتون رو راه اندازی کنید !
زئوس جان راجب امنیت backend این پروژه هم یه بحثی میکنید؟ مثلا حملات DDoS روی سرور یا اسنیف کردن اطلاعات
سلام به نکته خیلی خوبی اشاره کردید- لازمه اشاره کنم که این یه مثال خیلی ساده است نکات امنیتی توش دیده نشده ولی کارهایی که میشه کرد برای امنیت زیادن مثلا انکریپت کرد اطلاعات ارسالی رو با یه الگرویتم امن نظیر aes
یا مثلا اضافه کردن یک فیلد توی پست دیتا ها که هر درخواست دهنده ای نتونه از سرویس شما استفاده کنه و امثالهم ….