christophrumpel / bcwp-laraconeu-chatbot

This the code for the Laracon EU chatbot from my book "Build Chatbots with PHP"
5 stars 3 forks source link

Nothing happens when I click on "Yes please" or "Nope" on Messenger #3

Closed andreshg112 closed 6 years ago

andreshg112 commented 6 years ago

"Hi" and "Start conversation" work. FAQs don't work, neither GET_STARTED does. Telegram still works (see the last image).

image

image

image

If I enable message_postbacks, my server receives a request. However, nothing happens.

image

image

It's still working with Telegram. image

christophrumpel commented 6 years ago

Hey, for both Telegram and Facebook you have activate the GET STARTED function. Have you done that like mentioned in the book?

andreshg112 commented 6 years ago

I think I did it.

Telegram:

image

Facebook:

image If a click on Get started, ngrok doesn't detect anything.

And I did this: php artisan botman:facebookAddStartButton

andreshg112 commented 6 years ago

If I type in on Facebook GET_STARTED or /start, It works. But now I clicked on Yes please for subscribing me, and I receive a lot of requests.

Chat

image

ngrok

image

christophrumpel commented 6 years ago

So you mean typing GET_STARTED or /'start works but clicking the buttons that Telegram and Facebook provide?

andreshg112 commented 6 years ago

Everything works perfectly in Telegram. On Facebook, GET_STARTED was not working, and Facebook was sending me a lot of requests that my server didn't answer. https://github.com/christophrumpel/bcwp-laraconeu-chatbot/issues/3#issuecomment-414544164

andreshg112 commented 6 years ago

I restarted the server and set up everything again. I'm getting the same error when I click on "Yes please". After clicking on "yes please", It stops working on Facebook. image

After some minutes I'm still receiving the request "Yes please" from Facebook. image

It's still working on Telegram. image

andreshg112 commented 6 years ago

Do I have to enable this? What is this for? image

andreshg112 commented 6 years ago

I have to click on Unsubscribe in order to stop receiving requests from Facebook. image

Now, I noticed something strange.

This is my code. Notice that I put some echo lines.

<?php

namespace App\Http\Conversations;

use App\Subscriber;
use BotMan\BotMan\Messages\Conversations\Conversation;
use BotMan\BotMan\Messages\Incoming\Answer;
use BotMan\BotMan\Messages\Outgoing\Actions\Button;
use BotMan\BotMan\Messages\Outgoing\Question;

class OnboardingConversation extends Conversation
{
    /**
     * Start the conversation.
     *
     * @return mixed
     */
    public function run()
    {
        $this->welcomeUser();
    }

    private function welcomeUser()
    {
        $this->say('Welcome! This is the Laracon EU chatbot.');
        $this->say(
            'I can provide you with info about the Laracon EU conference. You can ask me about speakers, the schedule, or sponsors.'
        );
        $this->askAboutNotifications();
    }

    private function askAboutNotifications()
    {
        $question = Question::create(
            'I am also able to send you important notifications about new speakers or schedule changes during the conference. To make that possible I need to store your chat ID and your first name. Are you fine with that? (You can change your answer at any time.)'
        )->addButtons([
            Button::create('Yes please')->value('yes'),
            Button::create('Nope')->value('no'),
        ]);

        $this->ask($question, function (Answer $answer) {
            echo json_encode($answer) . "\n";
            echo $answer->getText() . "\n";
            switch ($answer->getText()) {
                case 'no':
                    echo "no way";
                    Subscriber::deleteUserIfGiven($this->bot->getUser()->getId());
                    $this->say('Ok, no problem.');

                    return $this->showGeneralInfo();
                case 'yes':
                    echo "yes way";
                    Subscriber::storeFromBotManUser(
                        $this->bot->getDriver()->getName(),
                        $this->bot->getUser()
                    );
                    $this->say('Perfect.');

                    return $this->showGeneralInfo();
                default:
                    echo "default way";
                    $this->say('I am not sure what you meant. Can you try again?');
                    return $this->repeat();
            }
        });
    }

    private function showGeneralInfo()
    {
        return $this->say("These are some example sentences that you can use:\n
        - \"Show me the speakers.\"
        - \"Who is sponsoring this year?\"
        ");
    }
}

Look this: If I type in "Hi", I get the default message. You can see that the server answers with:

{}
Hi
default way

image

This is what I get on ngrok if I type in "Hi". image

If I click on "Yes please" or "Nope", nothing happens: image

This is what I get clicking on "yes" or "no". You can't see the result from echo "no way"; or echo "yes way"; image

Everything still works perfectly on Telegram.

andreshg112 commented 6 years ago

I just noticed something: If I comment the database call, It works: image

andreshg112 commented 6 years ago

I just saw laravel.log:

[2018-08-22 04:56:12] local.ERROR: Error sending payload: (#100) Insufficient permission to access user profile. {"exception":"[object] (BotMan\\Drivers\\Facebook\\Exceptions\\FacebookException(code: 0): Error sending payload: (#100) Insufficient permission to access user profile. at /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/botman/driver-facebook/src/FacebookDriver.php:503)
[stacktrace]
#0 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/botman/driver-facebook/src/FacebookDriver.php(460): BotMan\\Drivers\\Facebook\\FacebookDriver->throwExceptionIfResponseNotOk(Object(Symfony\\Component\\HttpFoundation\\Response))
#1 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/botman/botman/src/BotMan.php(236): BotMan\\Drivers\\Facebook\\FacebookDriver->getUser(Object(BotMan\\BotMan\\Messages\\Incoming\\IncomingMessage))
#2 closure://function (\\BotMan\\BotMan\\Messages\\Incoming\\Answer $answer) {
            switch ($answer->getText()) {
                case 'no':
                    \\App\\Subscriber::deleteUserIfGiven($this->bot->getUser()->getId());
                    $this->say('Ok, no problem.');

                    return $this->showGeneralInfo();
                case 'yes':
                    \\App\\Subscriber::storeFromBotManUser(
                        $this->bot->getDriver()->getName(),
                        $this->bot->getUser()
                    );
                    $this->say('Perfect.');

                    return $this->showGeneralInfo();
                default:
                    $this->say('I am not sure what you meant. Can you try again?');
                    return $this->repeat();
            }
        }(12): BotMan\\BotMan\\BotMan->getUser()
#3 [internal function]: App\\Http\\Conversations\\OnboardingConversation->{closure}(Object(BotMan\\BotMan\\Messages\\Incoming\\Answer), Object(App\\Http\\Conversations\\OnboardingConversation))
#4 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/botman/botman/src/Traits/HandlesConversations.php(293): call_user_func_array(Object(Closure), Array)
#5 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/botman/botman/src/Traits/HandlesConversations.php(271): BotMan\\BotMan\\BotMan->prepareConversationClosure(Object(Closure), Object(App\\Http\\Conversations\\OnboardingConversation), Array)
#6 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/botman/botman/src/Traits/HandlesConversations.php(233): BotMan\\BotMan\\BotMan->callConversation(Object(Opis\\Closure\\SerializableClosure), Array, Object(BotMan\\BotMan\\Messages\\Incoming\\IncomingMessage), Array)
#7 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Support/Collection.php(397): BotMan\\BotMan\\BotMan->BotMan\\BotMan\\Traits\\{closure}(Object(BotMan\\BotMan\\Messages\\Incoming\\IncomingMessage), 0)
#8 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/botman/botman/src/Traits/HandlesConversations.php(235): Illuminate\\Support\\Collection->each(Object(Closure))
#9 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/botman/botman/src/BotMan.php(405): BotMan\\BotMan\\BotMan->loadActiveConversation()
#10 /opt/lampp/htdocs/book-laraconeu-chatbot/app/Http/Controllers/BotManController.php(18): BotMan\\BotMan\\BotMan->listen()
#11 [internal function]: App\\Http\\Controllers\\BotManController->handle()
#12 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): call_user_func_array(Array, Array)
#13 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction('handle', Array)
#14 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Route.php(212): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\BotManController), 'handle')
#15 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Route.php(169): Illuminate\\Routing\\Route->runController()
#16 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Router.php(665): Illuminate\\Routing\\Route->run()
#17 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#18 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#19 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#20 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#21 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(68): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#22 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#23 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#24 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#25 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#26 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#27 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(63): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#28 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#29 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#30 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#31 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#32 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#33 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(66): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#34 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#35 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#36 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(104): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#37 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Router.php(667): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#38 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Router.php(642): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))
#39 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Router.php(608): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))
#40 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Router.php(597): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))
#41 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(176): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))
#42 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))
#43 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#44 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Fideloper\\Proxy\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#45 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#46 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(31): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#47 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#48 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#49 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(31): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#50 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#51 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#52 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#53 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#54 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#55 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(62): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#56 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#57 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#58 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(104): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#59 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(151): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#60 /opt/lampp/htdocs/book-laraconeu-chatbot/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))
#61 /opt/lampp/htdocs/book-laraconeu-chatbot/public/index.php(55): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
#62 {main}
"} 
andreshg112 commented 6 years ago

Solved by using getUserWithFields() when Facebook is the driver:

private function askAboutNotifications()
    {
        $question = Question::create(
            'I am also able to send you important notifications about new speakers or schedule changes during the conference. To make that possible I need to store your chat ID and your first name. Are you fine with that? (You can change your answer at any time.)'
        )->addButtons([
            Button::create('Yes please')->value('yes'),
            Button::create('Nope')->value('no'),
        ]);

        $this->ask($question, function (Answer $answer) {
            switch ($answer->getText()) {
                case 'no':
                    $user = $this->getUser();
                    Subscriber::deleteUserIfGiven($user->getId());
                    $this->say('Ok, no problem.');

                    return $this->showGeneralInfo();
                case 'yes':
                    $user = $this->getUser();
                    Subscriber::storeFromBotManUser(
                        $this->bot->getDriver()->getName(),
                        $user
                    );
                    $this->say('Perfect.');

                    return $this->showGeneralInfo();
                default:
                    $this->say('I am not sure what you meant. Can you try again?');
                    return $this->repeat();
            }
        });
    }

    /**
     * Returns the user depending the driver.
     *
     * @return \BotMan\BotMan\Users\User
     */
    private function getUser() : User
    {
        $driverName = $this->bot->getDriver()->getName();
        switch ($driverName) {
            case 'Facebook':
                $user = $this->bot->getUserWithFields([
                    'id', 'name', 'first_name', 'last_name', 'profile_pic'
                ]);
                break;
            default:
                $user = $this->bot->getUser();
                break;
        }
        return $user;
    }
christophrumpel commented 6 years ago

@andreshg112 great you solved it. There was a change with FB and this is why you need the new method now. I think we will change it in BotMan so we can use the normal method again. Waiting for a decision here. Then Ill update the book.