Сирожиддин
#1
Assalomu alaykum. Men ba’zi bir sabablarga ko’ra telegramga bot yozishimga to’g’ri keldi. Buning natijasida ozmi ko’pmi tajribaga ega bo’ldim va ba’zilarini sizlar bilan bo’lishmoqchiman. Xozir biz php dasturlash tilida oddiygina bot yasaymiz.
Biz internet saytlarda yoki messenjerlarda turli xil qiziq narsalarni o’qiganimizda kim bilandir ulashgimiz, kimgadir junatgimiz keladi. Unda hech qanday messenjer yoki ijtimoiy tarmoqlardagi accout bo’lmasa unga bu o’qigan matnimizni sms tariqasi yubormoqchi bo’lamiz va o’qigan narsamizni belgilab smsga kirib joylashtiramiz. SMS xizmatini xam o’zini standartlari bor, ba’zi bir belgilar qo’shilgandan keyin smsimizni hajmi oshib ketib 4-5 ta sms bo’lib qoladi yoki mms ga o’tib qoladi. Natijada biz uni yubora olmaymiz. Xozir biz ana shunday vaziyatda kerakli matnni sms standartlariga moslab mmsga aylanib ketmaydigan qilib beradigan bot yasaymiz.

- Men PHP dasturlash tilida ishlayman.
- Bizda web – hostinglar asosan phpga moslashtirilgan yoki chetdan birorta bepul hosting olinsa xam asosan php sozlangan bo’ladi.

Shu sabablarga ko’ra botni PHP tilida yozishga qaror qildim.

Ishni bajarishni asosiy ketma – ketligi quyidagicha.

- Matndagi sms ga “xalaqit” beradigan simvollarni boshqasiga almashtiramiz, Kirilcha qo’shilib qolgan harflarni xam lotin alifbosidagisiga aylantirib chiqadigan funksiya yasaymiz (ko’chiramiz ).
- @botfather dan yangi bot yasab uni boshqarish uchun API kalitini olamiz.
- Fayllarni hostingga yuklab uni webhook sifatida ko’rsatamiz. (Ba’zi bir terminlarni maqola davomida tushuntirib ketaman).

PHPda berilgan matndagi simvollarni smsga moslab beradigan quyidagicha funksiya yozamiz.
"Funksiya" (+/-)
Сирожиддин
#2
Endi botga kimdir xabar yuborsa uni shu funksiya orqali qayta tahrirlab egasiga qaytarib yuborishi uchun maxsus kutubxonadan foydalanamiz. Biz ishlatgan kutubxonani quyidagi manzil bo’yicha olishingiz mumkin:
https://github.com/irazasyed/telegram-bot-sdk
Eslatib o’taman. Bu kutubxona keng imkoniyatli bo’lib men buni faqat ba’zi bir imkoniyatlaridan foydalanganman xolos. To’liq ma’lumot uchun kutubxonani dokumentatsiyasi: https://telegram-bot-sdk.readme.io/docs

Endi yangi php fayl yaratib kutubxonani va funksiyanimiz unga birlashtiramiz:
Natijaviy php kodlar
  1. <?php
  2.  
  3. include('vendor/autoload.php'); // Kutubxonani chaqiramiz
  4.  
  5. use Telegram\Bot\Api;
  6.  
  7.  
  8. $telegram = new Api('token'); // BotFatherdan olingan tokenni o'rnatamiz
  9.  
  10. $result = $telegram -> getWebhookUpdates(); // Foydalanuvchidan kelib tushgan xabar va boshqa ma'lumotlarni o'zgaruvchiga olib olamiz
  11.  
  12.  
  13.  
  14. $text = $result["message"]["text"]; // Qabul qilingan xabar matni
  15.  
  16. $chat_id = $result["message"]["chat"]["id"]; // Yozishma IDsi
  17.  
  18. $name = $result["message"]["from"]["username"]; // Yuborgan odamning manzili (username)
  19.  
  20. $keyboard = [["Men xaqimda"]]; // Klaviatura (shart emas lekin kimdir men xaqimda qiziqib qolsa )
  21.  
  22.  
  23. if($text){
  24. // Agar botga yuborilgan xabar matndan iborat bo'lsa quyidagilar bajariladi
  25. if ($text == "/start") {
  26. // Agar kimdir botga start bersa ya'ni yozishmani boshlasa unga birinchi xabar matni
  27. $reply = "Bu botni shunchaki o'zim uchun yozganman, jiddiy olinmasin!";
  28.  
  29. $reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]);
  30.  
  31. $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]);
  32.  
  33. }elseif ($text == "Men xaqimda") {
  34. // Agar kimdir botni muallifi bilan qiziqib "Men xaqimda"ni bossa
  35. $reply = "Bu bot juda ko'p turdagi yozuvlarni lotin alifbosiga o'tkazib beradi. Boshida o'zim uchun bu botni yaratish fikri kelgan edi, lekin mendanam boshqa odamlarga kerak bo'lib qolar deb o'yladim. Fikr, mulohaza, taklif yoki kamchiliklar bo'lsa @ErkinPardayev";
  36. $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]);
  37. }
  38. else{
  39. // Yuborilgan matnli xabar hech biriga to'g'ri kelmasa demak u qayta ishlash uchun matn yuborgan
  40. // Matnni funksiyamiz orqali qayta ishlab o'ziga yuboramiz
  41. $reply = toUniversalString($text); // Matnni qayta ishlash
  42.  
  43. $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]); // Matnni yuborish
  44.  
  45. }
  46.  
  47. }else{
  48.  
  49. $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => "Men faqat mant ko'rinishidagi xabarlarni qayta ishlay olaman." ]);
  50.  
  51. }
  52.  
  53. function toUniversalString($str, $options = array())
  54. {
  55. $str = mb_convert_encoding((string)$str, 'UTF-8', mb_list_encodings());
  56. $defaults = array
  57. (
  58. 'delimiter' => ' ',
  59. 'limit' => null,
  60. 'lowercase' => true,
  61. 'replacements' => array(),
  62. 'transliterate' => true,
  63. );
  64.  
  65. $options = array_merge($defaults, $options);
  66. $char_map = array
  67. (
  68. // Latin
  69. 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A', 'Æ' => 'AE', 'Ç' => 'C',
  70. 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I',
  71. 'Ð' => 'D', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', 'Ő' => 'O',
  72. 'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ű' => 'U', 'Ý' => 'Y', 'Þ' => 'TH',
  73. 'ß' => 'ss',
  74. 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'ae', 'ç' => 'c',
  75. 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i',
  76. 'ð' => 'd', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ő' => 'o',
  77. 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u', 'ű' => 'u', 'ý' => 'y', 'þ' => 'th',
  78. 'ÿ' => 'y',
  79. // Latin symbols
  80. '©' => '(c)',
  81. // Greek
  82. 'Α' => 'A', 'Β' => 'B', 'Γ' => 'G', 'Δ' => 'D', 'Ε' => 'E', 'Ζ' => 'Z', 'Η' => 'H', 'Θ' => '8',
  83. 'Ι' => 'I', 'Κ' => 'K', 'Λ' => 'L', 'Μ' => 'M', 'Ν' => 'N', 'Ξ' => '3', 'Ο' => 'O', 'Π' => 'P',
  84. 'Ρ' => 'R', 'Σ' => 'S', 'Τ' => 'T', 'Υ' => 'Y', 'Φ' => 'F', 'Χ' => 'X', 'Ψ' => 'PS', 'Ω' => 'W',
  85. 'Ά' => 'A', 'Έ' => 'E', 'Ί' => 'I', 'Ό' => 'O', 'Ύ' => 'Y', 'Ή' => 'H', 'Ώ' => 'W', 'Ϊ' => 'I',
  86. 'Ϋ' => 'Y',
  87. 'α' => 'a', 'β' => 'b', 'γ' => 'g', 'δ' => 'd', 'ε' => 'e', 'ζ' => 'z', 'η' => 'h', 'θ' => '8',
  88. 'ι' => 'i', 'κ' => 'k', 'λ' => 'l', 'μ' => 'm', 'ν' => 'n', 'ξ' => '3', 'ο' => 'o', 'π' => 'p',
  89. 'ρ' => 'r', 'σ' => 's', 'τ' => 't', 'υ' => 'y', 'φ' => 'f', 'χ' => 'x', 'ψ' => 'ps', 'ω' => 'w',
  90. 'ά' => 'a', 'έ' => 'e', 'ί' => 'i', 'ό' => 'o', 'ύ' => 'y', 'ή' => 'h', 'ώ' => 'w', 'ς' => 's',
  91. 'ϊ' => 'i', 'ΰ' => 'y', 'ϋ' => 'y', 'ΐ' => 'i',
  92. // Turkish
  93. 'Ş' => 'S', 'İ' => 'I', 'Ç' => 'C', 'Ü' => 'U', 'Ö' => 'O', 'Ğ' => 'G',
  94. 'ş' => 's', 'ı' => 'i', 'ç' => 'c', 'ü' => 'u', 'ö' => 'o', 'ğ' => 'g',
  95. // Russian
  96. 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'Ye', 'Ё' => 'Yo', 'Ж' => 'J',
  97. 'З' => 'Z', 'И' => 'I', 'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O',
  98. 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'X', 'Ц' => 'Ts',
  99. 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sh', 'Ъ' => '\'', 'Ы' => 'Y', 'Ь' => '', 'Э' => 'E', 'Ю' => 'Yu',
  100. 'Я' => 'Ya',
  101. 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo', 'ж' => 'j',
  102. 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o',
  103. 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'x', 'ц' => 'ts',
  104. 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sh', 'ъ' => '\'', 'ы' => 'y', 'ь' => '', 'э' => 'e', 'ю' => 'yu',
  105. 'я' => 'ya',
  106. // Ukrainian
  107. 'Є' => 'Ye', 'І' => 'I', 'Ї' => 'Yi', 'Ґ' => 'G',
  108. 'є' => 'ye', 'і' => 'i', 'ї' => 'yi', 'ґ' => 'g',
  109. // Czech
  110. 'Č' => 'C', 'Ď' => 'D', 'Ě' => 'E', 'Ň' => 'N', 'Ř' => 'R', 'Š' => 'S', 'Ť' => 'T', 'Ů' => 'U',
  111. 'Ž' => 'Z',
  112. 'č' => 'c', 'ď' => 'd', 'ě' => 'e', 'ň' => 'n', 'ř' => 'r', 'š' => 's', 'ť' => 't', 'ů' => 'u',
  113. 'ž' => 'z',
  114. // Polish
  115. 'Ą' => 'A', 'Ć' => 'C', 'Ę' => 'e', 'Ł' => 'L', 'Ń' => 'N', 'Ó' => 'o', 'Ś' => 'S', 'Ź' => 'Z',
  116. 'Ż' => 'Z',
  117. 'ą' => 'a', 'ć' => 'c', 'ę' => 'e', 'ł' => 'l', 'ń' => 'n', 'ó' => 'o', 'ś' => 's', 'ź' => 'z',
  118. 'ż' => 'z',
  119. // Latvian
  120. 'Ā' => 'A', 'Č' => 'C', 'Ē' => 'E', 'Ģ' => 'G', 'Ī' => 'i', 'Ķ' => 'k', 'Ļ' => 'L', 'Ņ' => 'N',
  121. 'Š' => 'S', 'Ū' => 'u', 'Ž' => 'Z',
  122. 'ā' => 'a', 'č' => 'c', 'ē' => 'e', 'ģ' => 'g', 'ī' => 'i', 'ķ' => 'k', 'ļ' => 'l', 'ņ' => 'n',
  123. 'š' => 's', 'ū' => 'u', 'ž' => 'z',
  124. // Uzbek
  125. "Ў"=>"O'", "ў"=>"o'", "Ғ"=>"G'", "ғ"=>"g'", "Ҳ"=>"H", "ҳ"=>"h", "Қ"=>"Q", "қ"=>"q",
  126. //Symbols
  127. "\"" => "'", "–" => "-", "‘" => "'", "“" => "\"", "”" => "\"", "’" => "'", "´" => "'",
  128. );
  129.  
  130. $str = preg_replace(array_keys($options['replacements']), $options['replacements'], $str);
  131. if ($options['transliterate']) {
  132. $str = str_replace(array_keys($char_map), $char_map, $str);
  133. }
  134.  
  135. $str = preg_replace('/(' . preg_quote($options['delimiter'], '/') . '){2,}/', '$1', $str);
  136. $str = mb_substr($str, 0, ($options['limit'] ? $options['limit'] : mb_strlen($str, 'UTF-8')), 'UTF-8');
  137. $str = trim($str, $options['delimiter']);
  138. return $str;
  139. }
  140. ?>


Mana kodlarni xam yozib oldik. Endi uni hostingga yoki shaxsiy serverga chiqarib bot bilan xabar almashishini ta’minlashimiz kerak. Buni esa botni yasab bo’lganimizdan keyin amalga oshirishga qoldiramiz.

Biz yangi bot yasab unga birorta dastur bilan murojaat qilishimiz uchun uni API kalitini olishimiz kerak bo’ladi.
API kalit bilan uni boshqarish uchun va unga xabar yuborilganda u xabarni bizni dasturimizga yuborishi uchun unga webhook sozlamasiga php scriptimizni manzilini ko’rsatib qo’yamiz. Buning uchun telegramda @botfather bilan salomlashamiz ))
Biriktirilgan fayllar [1]:
 screen_1.jpg (65.7 KB) (387 ↴)
Сирожиддин
#3
Yangi bot yasash uchun \new buyrug’ini yuboramiz
Keyin bizdan botimizga nom berishimizni so’raydi. Men uni String2UTF8 deb nomladim.
Keyin biz unga manzil kiritishimiz kerak bo’ladi va u oxirida bot qo’shimchasi bilan tugashi kerak. Men uni String2UTF8_bot deb nomladim. Agar biz tanlagan manzil band bo’lsa boshqa manzil topishimiz kerak. Manzilni (username) xam to’g’ri kiritganimizda bizga botfather buni takidlab bizga HTTP API beradi. API xabarda "Use this token to access the HTTP API: 445482470:AAGNmQbhHZTOaqe2Aj9R9FY2lffqqCXRd94" kabi yozilgan bo’ladi.
Mana bizni botimiz ishlatishga tayyor bo’ldi va u qo’ygan manzilimiz bo’yicha ishlatishga tayyor. https://t.me/String2UTF8_bot manzili bo’yicha murojaat qilinsa bo’ladi. Lekin u xozircha so’rovlarimizga javob qaytara olmaydi. Botga buyruqni https://api.telegram.org/botAPI/buyruq ko’rinishida berishimiz mumkin. Mavjud buyruqlar to’liq ro’yhatini https://core.telegram.org/bots/api manzilida o’qishingiz mumkin.
Botga kimdir nimadir yozsa uni 24 soat mobaynida telegramning serverida JSON shakida saqlanib turadi. Uni quyidagi manzil bo’yicha o’qishimiz mumkin: https://api.telegram.org/botAPI/getUpdates
Endi maqsadimiz botga kimdir nimadir yozganda u xabarni o’sha zaxotiyoq qayta ishlab egasiga yuborishimiz kerak bo’ladi. Buning uchun botimizga webhook tayinlaymiz, ya’ni botga nimadir yozilganda bot xabarni avtomatik tarzda o’sha manzilga json ko’rinishida yuboradi. Buning uchun https://api.telegram.org/bot[token]/setwebhook?url=[webhook] manzilini ishlatamiz.

Endi tayyor php scriptimizni hostingga yuklab uni bot orqali ishlatishga kiritamiz. Bot birorta web servis bilan xabar almashishi uchun o’rtadagi muloqot shifrlangan (himoyalangan) bo’lishi kerak ya’ni SSL sertifikat kerak bo’ladi. SSL sertifikat esa yaxshigina pul turadi. Bizni oldimizda Let's Encrypt dan bepul sertifikat olib o’rnatish yoki o’zimiz yaratishimiz yoki shunga o’xshash yo’llar turibdi. Men Let's Encryptdan sertifikat olib uni uzinfocomni oddiy hostinggiga sozlab botni ishlataman deganimda hosting bilan muammolar yuzaga keldi va boshqa yo’l izlashimga to’g’ri keldi. Izlanishlarim natijasida COMODO CA Limited tomonidan beriladigan bepul sertifikatli bepul hosting va bepul 3-darajali domen beradigan sayt/firma/tizim xullas “ajib bir narsa” chiqib qoldi )) Manzil quyidagicha: https://www.000webhost.com/ Uni tariflarini bizni hostingerlarimiz yaqin orada hayoliga ham keltira olishmaydi. Ex essiz uzcard bilan tulov qilib bo’lganda pulli tarifidan sotib olardim. Mayli xozircha bepul tarifini tanlab ro’yhatdan o’tamiz va o’zimizga yangi akkount ochamiz. Yangi akkount ochib unga yangi sayt ochishni tushuntirib o’tmayman, o’ylaymanki o’zingiz qila olasiz.

Yangi sayt ochganimizdan keyin unga ftp orqali fayllarimizni yuklaymiz. O'ylaymanki buni xam o'zingiz qila olasiz (jarayonni bajarishda muammolarga duch kelinsa bemalol murojaat qilishingiz mumkin)

Meni yuklagan faylim https://erkin.000webhostapp.com/tbot.php manzili bo’yicha joylashdi. Demak webhookni shu manzil bo’yicha sozlaymiz. Buning uchun brouzerimiz manzillar qatoriga quyidagini yozamiz va murojaat yuboramiz. (enterni bosamiz)
https://api.telegram.org/bot445482470:AAGNmQbhHZTOaqe2Aj9R9FY2lffqqCXRd94/setwebhook?url=https://erkin.000webhostapp.com/tbot.php
Natija ijobiy bo’lsa brouzerimizda quyidagicha natija chiqadi:
Biriktirilgan fayllar [1]:
 screen_2.jpg (17.38 KB) (1257 ↴)
Сирожиддин
#4
Endi Botfatherdan telegram orqali botimizni izoxini, rasmini va boshqa sozlamalarini o’zgaritirishimiz mumkin.

Tayyor bo’lgan bot: https://t.me/String2UTF8_bot

P.S. Anchadan beri maqola yozmagan edim. Xar xil joydan xar xil o’qigan ma’lumotlarim orqali yasagan botimni eslab ushbu maqolani yozdim. Xato va kamchiliklar bo’lsa uzur surayman va ular yuzasidan menga murojaat qilsangiz albatta to’g’irlash kiritib qo’yaman.
P.P.S Agar natijaviy scriptga optimizatsiya kiritmoqchi bo’lganlar bo’lsa fikrlaringizni kutib qolaman.

Manba: http://itex.uz/programming/108-php-dasturlash-tilida-telegram-bot-yozish.html
MrShaXRuX
#5
Savolim bor edi mavzuga oid masalan saytimiz johncmsda qurilgan !
Agar saytga misol kutubxonaga birorta yangi maqola yozilsa uni automatik botga yuboradigan qilsa boladimi ? Keyin , botni saytga ulashni toliq tushuntirib bering iltimos !?
.
Maqolangizni o'qib juda hursand boldim men izlagan maqola boldi maqolani tayyorlaganiz uchun raxmat !
Сирожиддин
#6
MrShaXRuX, Telegramdan BOT va Guruh yaratib turavering maqola qilib yozishga harakat qilaman
298
STRaKER
#7
Salom, menda ham kichik savol...
shu botga t.me/bizningbot?file_id=12 deb jo'natsek faylni idsini oddiy $_GET['file_id'] bilan olaveramizmi?
298
STRaKER
#8
obbbooo, 000webhostdan narmalni ishlab turgan botim ishlame qoldiii, bu bu xosting bloklab qo'ydimikinaa? uxledigon paytimasuu o'zidan o'zi ikki kundan beri ishlame qoldiii
Aspiron
#9
STRaKER, textni qirqib olasiz
298
STRaKER
#10
Aspiron, yok text hammasi joyida, adminlar birnima qilgan, biror faylni o'chirgan shekilli ishlamadi, keyin saytni o'chirib boshka ochdim 000webhostda mana ishlayapti @EnUz_bot - Inglizcha-O'zbekcha lug'at
Aspiron
#11
STRaKER, shu botga t.me/bizningbot?file_id=12 deb jo'natsek faylni idsini oddiy $_GET['file_id'] bilan olaveramizmi?
shu gapizga javob yozgandim
298
STRaKER
#12
Aspiron, aha tushunarli, men buni yo'lini topdim, bundey bo'larkan t.me/robot_bot/start=xxxx lekin uni ishi ko'p ekandaaa
Aspiron
#13
STRaKER, Azgina qiyin lekin qilsa bõladigan ish
298
STRaKER
#14
CallbackQuery orqali qilinar ekan lekin hozi bu sdkda bunda ishlash qiyin ekan, kodlarni togri yozdim lekin ishlamayaptiii
Aspiron
#15
STRaKER, boshqasini topib ishlang
Aspiron
#16
kodga moslashing yoki kodni moslang
298
STRaKER
#17
Aspiron, # Aspiron (29.12.2017 / 22:57)
STRaKER, boshqasini topib ishlang
kxeee boshqasi topib ishleng?
ee telegram apidan ko'ringchi callbackqueryni boshqa shunaqa funksiya bormikin
Aspiron
#18
STRaKER, framework boshqasini topib ishlang dedim.
super_master
#19
salom bot yasaydigan ustalar bormi man aytganday bot yasashni orgatsa pulini tolayman
Сирожиддин
#20
super_master, @Aspiron shu bola ham bot yasaydi

Kunduzi: 11°C

26 Apr 2024 yil
Joylashuv aniqlanmadi