آموزش امنیت و تست نفوذ

آموزش امنیت و مبانی امنیت شبکه و اطلاعات

آموزش امنیت و تست نفوذ

آموزش امنیت و مبانی امنیت شبکه و اطلاعات

آموزش امنیت و تست نفوذ

این سایت تابع قوانین جمهوری اسلامی ایران میباشد.
مطالب درصورت درخواست کارگروه تعیین مصادق مجرمانه اینترنتی حذف خواهد شد.

طبقه بندی موضوعی

Let's play with Telegram Bot API

Monday, 13 Ordibehesht 1395، 07:41 PM

از عنوان پست  مشخصه که میخوام داخل این پست چیکار کنم (: ؛ میخوام یکمی با Telegram API آشناتون کنم ، یه سری کارهای جالبی هم میشه باهاش انجام داد ، مثلا Flood کردن یه Group که با هم بررسیش میکنیم 

سعی من بر اینه که جوری بگم که بتونید از Python گرفته تا LUA با کمک این پست کارها رو انجام بدید ، من بر مبنای PHP کار میکنم. ولی از Library خاصی استفاده نمیکنم تا Base رو یاد بگیریم و به Library متکی نباشیم..

نمیدونم توی تلگرام بودید یا نه ، ولی یک روباتی هست که باهاتون یه جورایی صحبت میکنه ، اسمش « تینا » هست ، یه صحبتی هم روی اینکه چجوری این روبات کار میکنه خواهم داشت ، البته من با سازنده ی این ربات ارتباطی نداشتم ، اما برداشت خودم رو میگم ، که البته فکر میکنم سازنده ی روبات هم از همین راه جلو رفته باشه : )

من همیشه در مورد موارد تئوری کمی زیاده روی میکنم ، از این بابت عذر میخوام. سعی میکنم زود تئوری را تمام کنم ; )

اگر بخوایم کلا ببینیم API چیه و ماهیت اون چیست ، میشه گفت API یک رابطی هست که توسط یک نرم افزار تعریف میشه ، و به دیگر برنامه ها اجازه میده توسط اون رابط ، به برنامه ی تعریف کننده دسترسی داشته باشند و باهاش تعامل داشته باشن (Application Programming Interface)

خب بر مبنای این تعریف ، مثلا توابع API ویندوز یا Google API و... API محسوب میشن

بر همین مبنا ، تلگرام اومده چنین API رو برای روبات ها تدارک دیده ، در IRC وقتی میومدیم مثلا با Python یا PHP یک روبات مینوشتیم باید سوکت را خودمون مهیا میکردیم ، اما با ورود MSL اینکار یکمی راحت تر شد و یه سری متدهایی مثل on join و... رو در اختیارمون قرار میداد که با وجودشون نیاز به Handle این متدها نبود

خب ، قصد من اینه که اینجا مراحل ساخت یک روبات را بررسی کنیم ، اولین مرحله ی ساخت یک روبات برای تلگرام اینه که با BotFather@ روبات را رجیستر کنیم و یک Token براش دریافت کنیم ، من بیش از این توضیح نمیدم چون میخوام به مباحث دیگه ای بپردازم ، به این لینک مراجعه کنید اگر روباتتون رو نساختید هنوز :

http://apkfa.ir/telegram-bot-botfather/

خب اگر طبق آموزش بالا پیش رفته باشید در آخر BotFather یک Token میده بهتون به این شکل :

کد:
Done! Congratulations on your new bot. You will find it at telegram.me/MyBot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. Use this token to access the HTTP API: 56923213:AAFcPd-QK4jdR5Ye8YdbV_VkHHkKgJR7xoU For a description of the Bot API, see this page: https://core.telegram.org/bots/api

خب Token رو قرمز کردم ، این Token برای ما ، تا حدودی شبیه به دستگاه های یک بار رمز هست که بانک ها میدن بهمون برای حواله ی اینترنتی ، یعنی اگر این دستگاه یکبار رمز رو نداشته باشیم امکان حواله یا ورود به اینترنت بانکمون ممکن نیست ، Token هم دقیقا همینطوره ، اگر Token رو نداشته باشیم امکان کار با روبات خودمون رو نداریم.

بسی خوب ، شکل کلی Request هایی که به تلگرام میدیم به این صورته :

کد PHP:
https://api.telegram.org/bot[COLOR="#FF0000"]123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11[/COLOR]/getMe  

ما میتونیم به دو صورت POST و GET به این API درخواست بدیم ، که در ادامه هر 2 حالتشو بررسی میکنیم ، فعلا ببینید خروجی این دستور چیه :

کد:
{"ok":true,"result":{"id":56944213,"first_name":"MyBot","username":"MyBot"}}

خب این خروجی که به ما داده ، اسمش JSON هست ، نمیدونم با جاوااسکریپت چقدر آشنایی دارید ، JSON همون Object هست در Javascript ، یه جورایی هم شبیه به XML ؛ خب میخوام این JSON رو مرتب کنم که بهتر بتونیم روش کار کنیم :

کد:
{
    "ok":true,
    "result":{
        "id":56944213,
        "first_name":"MyBot",
        "username":"MyBot"
    }
}

الآن راحت تر میتونیم به عناصر دسترسی داشته باشیم ، خب در آینده ما نیاز داریم که عنصر خاصی از این خروجی JSON را بدست بیاریم ، پس بذارید نشون بدم چجوری باید اینکار بکنیم :

کد PHP:
<?php
$json 
'{"ok":true,"result":{"id":56944213,"first_name":"MyBot","username":"MyBot"}}';
$obj json_decode($json);
echo 
$obj->result->username;
?>

فکر کنم متوجه شدید چیکار کردیم ، رشته ی JSON را با تابع json_decode دیکد کردم تا بتونم به Object های اون دسترسی داشته باشم ، بعد از اون از obj$ که والد کل هست ، به ولدهای result و username رفتم ، خروجی کد بالایی MyBot هست که همون Username سایت ما هست

خب اینجا کاری که انجام دادیم این بود که JSON را ما دادیم ، میخوایم ما آدرس سایت رو بدیم و خودش بره JSON رو بگیره ، راه معمولی این کار در PHP استفاده از cURL هست ، از یه سری Library ها مثل Guzzle هم میتونیم استفاده کنیم که کدنویسی ما کمتر بشه ، اما از cURL استفاده میکنم تا با بقیه ی زبان ها شباهت بیشتری داشته باشه کارمون.

کد PHP:
<?php
$curl 
curl_init();
curl_setopt($curl,CURLOPT_URL,"https://api.telegram.org/bot56923213:AAFcPd-QK4jdR5Ye8YdbV_VkHHkKgJR7xoU/getMe");
curl_setopt($curlCURLOPT_SSL_VERIFYPEERfalse);
curl_setopt($curlCURLOPT_RETURNTRANSFERtrue);
$json=curl_exec($curl);
$obj json_decode($json);
echo 
$obj->result->username;
?>

1 نکته باید اینجا مد نظر داشت ، اینکه CURLOPT_SSL_VERIFYPEER رو روی False قرار بدید ، من اینجا Certificate رو Ignore کردم ، مشکلی هم نداره از نظر من ، ولی اگر میخواید Ignore نکنید با آپشن CURLOPT_CAINFO مسیر گواهینامه رو مشخص کنید.

خیلی خب اینجا اسم روبات رو دریافت کردم ، کار بعدی که میخوام انجام بدم اینه که ببینم روبات من در چه گروه هایی عضو هست و چه کامندهایی بهش داده شده ، برای این کار 2 راه تعبیه کردند ، یکی کامند getUpdates هست و دیگری WebHook
توی getUpdates ما باید مدام Req بدیم ببینیم کامند جدیدی بهمون داده شده یا نه ، اما توی WebHook اینطوری نیست ، WebHook وقتی کامند به ما داده میشه خودش برامون ارسالش میکنه ، و نیازی به ریکوئست ما نیست. مسلماً WebHook خیلی راحت تره نه !؟ (:

الآن بیشتر روبات های انجمن ها Request ـی هستند ، یعنی باید مدام Request بدیم ببینیم مثلا تاپیک Duty آپدیت شده یا نه !؟ 
اما در WebHook این ما نیستیم که به تاپیک Duty ریکوئست میدیم تا ببینیم آپدیت شده یا نه!! بلکه این انجمن آشیانه هست که به ما Request میده و میگه تاپیک Duty آپدیت شده ، این هم پست هاش

خب یه جورایی میشه گفت پیاده سازی WebHook در Telegram یکمی سخت هست ، ولی من 1 روز وقت گذاشتم روش و تونستم انجامش بدم ، اما الآن با هم متد GetUpdates رو بررسی می کنیم ، در آینده WebHook رو.
یه چیزی که باید بهش توجه داشته باشیم اینه که ولدهایی که از GetUpdates نشأت میگیرند با WebHook یکمی تفاوت دارند که اون رو هم جداگانه بررسی میکنیم

اولین کار اینه که ببینیم چه پیام هایی در گروه هایی که روبات ما در اون عضو هست داده شده ، در BotFather@ میتونید تنظیم کنید که پیام هایی که با / شروع میشن (مثلا salam/) براتون فرستاده بشن یا همه ی پیام ها. شما همه ی پیام ها رو انتخاب کنید چون در آینده لازمش داریم

خب اینجا GetUpdates رو بررسی میکنم ، Url ـی که به ما خروجی میده به این صورته :

کد:
https://api.telegram.org/bot56923213:AAFcPd-QK4jdR5Ye8YdbV_VkHHkKgJR7xoU/getUpdates

خب خروجی این ، 100 پیام آخر هست ، به این صورت : 

http://pastebin.com/raw.php?i=pVHjYR8V

خب اینجا میخوام برای راحتی کار همیشه آخرین ولد رو بگیرم ، نه همه ی ولدها رو ، متد GetUpdates یک فیلد به نام offset داره که میشه update_id مورد نظر رو داخلش قرار بدیم تا فقط اون رو بگیریم ، Update_id یکی یکی جلو میره ، در قدم اول لازمه من کل JSON رو بگیرم ، و در آخر به ولد آخر اشاره کنم و Update ID رو تنظیم کنم روی اون ،

خب کد PHP من به این شکل میشه :

کد PHP:
<?php
$up_id
='';
function 
GetUpdateId(){
    
$obj=json_decode(file_get_contents("https://api.telegram.org/bot56923213:AAFcPd-QK4jdR5Ye8YdbV_VkHHkKgJR7xoU/getUpdates"));
    
$fin=end($obj->result);
    
$GLOBALS['up_id']=$fin->update_id;
}
GetUpdateId();
$fin=json_decode(file_get_contents("https://api.telegram.org/bot56923213:AAFcPd-QK4jdR5Ye8YdbV_VkHHkKgJR7xoU/getUpdates?offset=".$up_id++));
echo 
$fin->result[0]->message->text;
?>

اول یک متغیر up_id تعریف میکنم که update_id رو در اون ذخیره میکنم ، بعد یک تابع GetUpdateId تعریف میکنم که میره به متد getUpdates ، مقدار JSON را دیکد میکنه و آخرین update_id را درون متغیر up_id قرار میده ، و در اخر یک بار تابع GetUpdateId را اجرا میکنم تا آخرین UpdateID رو بدست بیارم و متن آخرین پیامی که در گروههای روباتم ارسال میشن رو به دست بیارم ، ممکنه سوال پیش بیاد که چرا اینکارو کردم ، به خاطر اینکه متد GetUpdates والدهای ارسالیش محدود به 100 تا هست ، یعنی با ارسال پیام 101 ام ، پیام ئه اول را در اختیار نخواهیم داشت..

خیلی خب الآن پیام رو گرفتم ، میخوام یه پیام بفرستم ، میخوام اگر کسی در گروه گفت "سلام" من بهش بگم : "سلام. خوبی!؟"

متد دریافت پیام ها رو که کار کردیم ، متد بعدی متد ارسال پیامه ، 

کد:
https://api.telegram.org/bot56923213:AAFcPd-QK4jdR5Ye8YdbV_VkHHkKgJR7xoU/sendMessage?chat_id={Chat_ID}&text={Message Text}

خب 2 قسمت قرمز مشخص کردم که حتما باید به این متد بدیمش ، اولی Chat_ID هست ، Chat_ID منظور گروهی هست که در اون پیام "سلام" داده شده و ما باید بهش جواب بدیم ، یه بار دیگه خروجی JSON ـی که متد GetUpdates بهمون داده رو ببینین :

http://pastebin.com/raw.php?i=pVHjYR8V

داخل والد Message ولد Chat رو می بینیم که والد ولدهای title و id هست ، title عنوان گروهی هست که در اون پیام ارسال کردیم و id هم ایدی اون گروه که ما اینجا باهاش کار داریم.

خب الآن سورس من میشه چیزی شبیه به این :

https://gist.github.com/anonymous/293774dd163f66c84713

تابع GetUpdateID رو که قبلا توضیح دادم ، الآن یک متغیر جدید می بینید به نام Message_ID ، فکر میکنید چرا این رو ایجاد کردم !؟
به خاطر اینکه اگر این متغیر وجود نداشته باشه ، یک بار که یه کاربر بگه "سلام" روبات تا ابد بهش میگه : "سلام ، خوبی!؟"
اما وقتی Message_ID رو ست کنیم و در شرط ببینیم که متفاوت باشه با پیام قبلی ، این اتفاق نمی افته.
ما اینجا یک حلقه ی بی نهایت داریم ، توی این حلقه ی بی نهایت GetUpdateID رو صدا می زنیم ، آخرین پیام هارو میگیریم ، و اگر متن پیام برابر بود با "سلام" و آیدی پیام ، با آیدی پیام قبلی برابر نبود ، پیام "سلام. خوبی!؟" را در همون گروه ارسال می کنیم


مشکلی که این روبات داره اینه که real Time نیست ، یعنی ما باید هی Request بدیم و چک کنیم ، در پست بعدی در مورد WebHook صحبت میکنم که اصلا چجوری باید باهاش کار کنیم...


منبع : BL4CK.Blog.ir

موفق پیروز باشید 

  • امیر امینی

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی