آموزش ارسال پیام از فریم ورک Laravel به Telegram

5 دیدگاه

تلگرام یک مسنجر جدید است مثل وایبر، واتز اپ و … .ولی برتری پیام رسان تلگرام در امنیت آن و سرعت بی نظیرش است. Telegram برای بسیاری از پلتفرم ها مثل Android, iPhone/iPad, Windows, PC/Mac/Linux طراحی شده است و اخیرا امکان ربات نیز به آن افزوده شده است که قابلیت های فراوانی به ارمغان می آورد.

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

[alert-note]نکته :برای اتصال به API تلگرام، برنامه تحت وب شما باید اتصال امن HTTPS را دارا باشد[/alert-note]

 

در این مقاله ما به سرور Telegram متصل خواهیم شد و با فشردن یه دکمه پیام را به گروهی در تلگرام ارسال خواهیم کرد. همه کدهای این مقاله در آدرس Github در دسترس است.

[button-blue url=”https://demo2.codingo.me/send” target=”_blank” position=””]پیش نمایش[/button-blue]

ابتدا باید یک نسخه از لاراول را نصب کنیم .طبیعتا اگر روی پروژه قبلی تان می خواهید این امکان را اضاف هکنید نیاز به نصب نسخه جدید نیست . برای آگاهی از جزئیات نصب لاراول می توانید این مطلب را مطالعه کنید.

بعد از نصب لاراول این دستور را در ترمینال وارد کنید تا کلید یکتایی برای لاراول در فایل .env ایجاد شود.

php artisan key:generate

نصب پکیج Telegram API برای Laravel

برای اتصال و تعامل با تلگرام ما باید به api رسمی تلگرام متصل شویم .برای راحتی کار از بسته آماده شده https://github.com/irazasyed/telegram-bot-sdk استفاده می کنیم.برای اینکه این بسته دریافت و روی لاراول نصب شود ، دستور زیر رو در ترمینال وارد کنید:

composer require irazasyed/telegram-bot-sdk

بعد از این نیاز هست دو خط زیر رو در فایل config/app.php اضافه کنیم . پس این فایل را باز کرده و در بخش providers خط زیر را وارد کنید:

Telegram\Bot\Laravel\TelegramServiceProvider::class

و در پایین بخش facade این خط رو اضافه کنید:

'Telegram'  => Telegram\Bot\Laravel\Facades\Telegram::class

در انتها دستور زیر را در ترمینال اجرا کنید تا فایل تنظیمات بسته تلگرام در پوشه config کپی شود:

php artisan vendor:publish --provider="Telegram\Bot\Laravel\TelegramServiceProvider"

حالا در پوشه فوق فایلی بنام telegram.php وجود دارد که ما باید توکن ربات تلگرام را در آن قرار دهیم.پس نیاز به ساختن ربات تلگرام داریم.

در همین رابطه :   لاراول 5.4 به صورت رسمی منتشر شد + امکانات جدید

ایجاد ربات تلگرام

انگار کسی در تلگرام شوخی اش گرفته و ما باید برای ایجاد ربات اول با پدر ربات صحبت کنیم .برای ملاقات پدر ربات تلگرام بعد از نصب تلگرام به این حساب برید : https://telegram.me/botfather

ارتباط با BotFather از طریق دستورات خواهد بود. برای ایجاد ربات جدید دستور /newbot رو داخل چت بنویسید. بعد از شما اسم ربات جدید و نام کاربری اش سوال میشه که باید وارد کنید. فقط در نام کاربری دقت کنید که آخرش عبارت “bot” وجود داشته باشه . مثل FotoliaBot .

creatingcodingobot

 

حالا توکن ربات را در دست داریم و در فایل .env لاراول تحت نام TELEGRAM_BOT_TOKEN وارد می کنیم:

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

ایجاد گروه تلگرام برای ایجاد دریافت پیام ها

ایجاد گروه در پیام رسان تلگرام بسیار آسان است.بعد از ایجاد گروه به قسمت Add Member گروه رفته و از بخش جستجوی کاربران (دکمه ذره بین) رباتی که ایجاد کرده اید را جستجو کنید و به گروه اضافه کنید.

codigno-group-1

بدست آوردن CHAT_ID گروه

برای ارسال پیام به افراد یا گروه ها در تلگرام نیاز به دانستن CHAT_ID داریم که شماره منحصر به فرد گفتگوی مورد نظر است.برای بدست آوردن این شماره راه ساده ای پیدا نکردم تا جایی که دیدم.برای همین یک متد در لاراول برای نمایش پیام های گروه ایجاد کردم.وقتی متد getUpdates فراخوانی میشه ، تلگرام همه فعالیت های مربوط به ربات رو برای ما می فرسته. از این طریق ما می فهمیم ربات در کدام گروه ها عضو هست و شماره CHAT_ID گروه مون رو هم می فهمیم.

در همین رابطه :   آموزش دستورات Prepend و Push در Blade لاراول

من یک کنترلر بنام Telegram ایجاد کردم و مسیر get-updates رو برای اون تعیین کردم.کدهای کنترلر به این صورت هست:

<?php namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Telegram\Bot\Laravel\Facades\Telegram;

class TelegramController extends Controller
{

    public function getHome()
    {
        return view('home');
    }

    public function getUpdates()
    {
        $updates = Telegram::getUpdates();
        dd($updates);
    }
}

نتیجه بازگشتی از تلگرام به این صورت خواهد بود:

get-updates-response

هر آپدیت دارای یک شی message است که داخلش آرایه chat دارد.همون چت که عنوانش Codingo و شماره -253307 رو داره مورد نظر من هست. با این اطلاعات ربات قادر خواهد بود پیام ها رو به گروه مورد نظر ارسال کند.

[alert-note]شاید برای شما مقدار خالی بازگشت داده شود.در این صورت کافی است مقداری با ربات کار کنید مثلا اون رو از گروه حذف کنید و دوباره اضافه کنید.بعد از این اگر دوباره برنامه رو اجرا کنید می بینید که 2 پیام دریافت شده است.[/alert-note]

در برنامه واقعی این شماره را می توان از راه برنامه نویسی دریافت کرد ولی در اینجا برای ساده تر شدن آموزش از ساده ترین روش استفاده شده است.

ارسال پیام

برای ارسال پیام یک فرم ساده با ورودی متن پیام و دکمه ارسال خواهیم داشت.در سمت سرور در لاراول چک می کنم که مقدار پیام معتبر باشد و در این صورت پیام را به متد sendMessage پاس می دهم.

public function getSendMessage()
    {
        return view('send-message');
    }

    public function postSendMessage(Request $request)
    {
        $rules = [
            'message' => 'required'
        ];

        $validator = Validator::make($request->all(), $rules);

        if($validator->fails())
        {
            return redirect()->back()
                ->with('status', 'danger')
                ->with('message', 'Message is required');
        }

        Telegram::sendMessage([
            'chat_id' => env('GROUP_ID'),
            'text' => $request->get('message')
        ]);

        return redirect()->back()
            ->with('status', 'success')
            ->with('message', 'Message sent');
    }

برای قالب کلی فرم از یک نمونه ساده Bootstrap استفاده می کنم :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <meta name="description" content="Laravel Telegram Chat Bot Tutorial and Live Demo. Send messages from browser to Telegram group.">

    <meta property="fb:app_id" content="356607781215457" />
    <meta property="og:locale" content="en_US" />
    <meta property="og:type" content="article" />
    <meta property="og:title" content="Laravel Telegram Chat Bot Live Demo | Codingo Tuts">
    <meta property="og:description" content="Laravel Telegram Chat Bot Tutorial and Live Demo. Send messages from browser to Telegram group.">
    <meta property="og:url" content="https://demo2.codingo.me/">
    <meta property="og:image" content="https://tuts.codingo.me/wp-content/uploads/2015/07/telegram-messenger-800x405.jpg">
    <meta property="og:site_name" content="Codingo Demo">
    <meta property="og:image:type" content="image/png">
    <meta property="article:author" content="https://www.facebook.com/ivanradunovic" />

    <link rel="shortcut icon" href="https://codingo.me/assets/img/box.png">

    <title>Laravel Telegram Chat Bot Live Demo - Codingo Tuts</title>

    <!-- Bootstrap core CSS -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    <link rel="stylesheet" href="/css/style.css">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
</head>

<body>

<div class="container">
    <div class="header clearfix">
        <nav>
            <ul class="nav nav-pills pull-right">
                <li role="presentation" class="{{ request()->path() == '/' ? 'active' : '' }}"><a href="/"><i class="fa fa-home"></i> Home</a></li>
                <li role="presentation" class="{{ request()->path() == 'send' ? 'active' : '' }}"><a href="/send"><i class="fa fa-send"></i> Send</a></li>
                <li role="presentation"><a href="https://tuts.codingo.me/using-telegram-messenger-for-laravel-application-notifications" title="External link to Tuts"><i class="fa fa-book"></i> Tutorial</a></li>
                <li role="presentation"><a href="https://github.com/codingo-me/telegram-laravel"><i class="fa fa-github"></i> GitHub</a></li>
            </ul>
        </nav>
        <h3 class="text-muted">Laravel & Telegram</h3>
    </div>

    @yield('content')





    <footer class="footer">
        <p>&copy; 2016 Codingo LTD</p>
    </footer>

</div> <!-- /container -->


<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
<script>
    (function () {
        'use strict';

        if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
            var msViewportStyle = document.createElement('style')
            msViewportStyle.appendChild(
                    document.createTextNode(
                            '@-ms-viewport{width:auto!important}'
                    )
            )
            document.querySelector('head').appendChild(msViewportStyle)
        }

    })();
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
</html>

و صفحه دارای فرم ارسال پیام به این شکل هست:

@extends('layout')

@section('content')

        <div class="row">
            <div class="col-md-12">
                <form action="/send" class="form-signin" method="post">
                    {{ csrf_field() }}
                    <h2 class="form-signin-heading">Send Message as Telegram Bot</h2>
                    <label for="inputText" class="sr-only">Message</label>
                    <textarea name="message" type="text" id="inputText" class="form-control" placeholder="Message" required autofocus></textarea>
                    <br />
                    <button class="btn btn-lg btn-primary btn-block" type="submit">Send Message</button>
                </form>
                <br />
                @if(Session::has('message'))
                    <div class="alert alert-{{ Session::get('status') }} status-box">
                        <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
                        {{ Session::get('message') }}
                    </div>
                @endif
            </div>
        </div>


@stop

در فایل web.php لاراول هم 4 روت یا مسیردهی خواهم داشت:

<?php

Route::get('/', 'TelegramController@getHome');
Route::get('get-updates',   'TelegramController@getUpdates');
Route::get('send',  'TelegramController@getSendMessage');
Route::post('send', 'TelegramController@postSendMessage');

خوب کارمان تمام شد و حالا با ارسال پیام بایست فورا آن را در گروه ببینید . البته در صورت نیاز می توانید پیام ها را زمانبندی کنید با استفاده از Queues در لاراول و …

در همین رابطه :   لاراول 5.6 از الگوریتم هش رمز عبور جدید Argon2i پشتیبانی خواهد کرد!

پیش نمایش

امیدوارم در برنامه های آینده تون مورد استفاده قرار بدین و لذت ببرید.منتظر نظرات و پیشنهادات تون هستیم.

منبع

دسته بندی : Laravel

5 نظر

  1. سلام ممنون برای من کار نمیکنه روش دیگری ندارید ؟
    برای خرید ممبر جای معتبری میشناسید ممنون میشم راهنمایی کنید

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

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