Skip to content

Commit

Permalink
first time here? request fb profile
Browse files Browse the repository at this point in the history
  • Loading branch information
hyzhak committed Oct 19, 2016
1 parent 0e76a3b commit fbd236a
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 50 deletions.
35 changes: 20 additions & 15 deletions botstory/integrations/fb/messenger.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,14 @@ def add_storage(self, storage):
logger.debug(storage)
self.storage = storage

async def request_profile(self, facebook_user_id):
return await self.http.get(
'{}/{}'.format(self.api_uri, facebook_user_id),
params={
'access_token': self.token,
},
)

async def handle(self, data):
logger.debug('')
logger.debug('> handle <')
Expand All @@ -95,34 +103,31 @@ async def handle(self, data):
user = await self.storage.get_user(facebook_user_id=facebook_user_id)
if not user:
logger.debug(' should create new user {}'.format(facebook_user_id))
user = await self.storage.new_user(
facebook_user_id=facebook_user_id,
)

"""
Make request to facebook
to receive more information about user
curl -X GET "https://graph.facebook.com/v2.6/<USER_ID>?fields=first_name,last_name,profile_pic,locale,timezone,gender&access_token=PAGE_ACCESS_TOKEN"
"first_name": "Peter",
"last_name": Chang",
"profile_pic": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xpf1/v/t1.0-1/p200x200/13055603_10105219398495383_8237637584159975445_n.jpg?oh=1d241d4b6d4dac50eaf9bb73288ea192&oe=57AF5C03&__gda__=1470213755_ab17c8c8e3a0a447fed3f272fa2179ce",
"locale": "en_US",
"timezone": -7,
"gender": "male"
More: https://developers.facebook.com/docs/messenger-platform/user-profile
"""
messager_profile_data = await self.request_profile(facebook_user_id)

user = await self.storage.new_user(
facebook_user_id=facebook_user_id,
first_name=messager_profile_data.get('first_name', None),
last_name=messager_profile_data.get('last_name', None),
profile_pic=messager_profile_data.get('profile_pic', None),
locale=messager_profile_data.get('locale', None),
timezone=messager_profile_data.get('timezone', None),
gender=messager_profile_data.get('gender', None),
)

session = await self.storage.get_session(facebook_user_id=facebook_user_id)
if not session:
logger.debug(' should create new session for user {}'.format(facebook_user_id))
session = await self.storage.new_session(
facebook_user_id=facebook_user_id,
stack=[],
user=user,
)

Expand Down
110 changes: 80 additions & 30 deletions botstory/integrations/fb/messenger_test.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import aiohttp
import logging
import pytest

Expand Down Expand Up @@ -138,6 +139,55 @@ async def test_setup_webhook():
)


@pytest.mark.asyncio
async def test_should_request_user_data_once_we_do_not_know_current_user():
fb_interface = story.use(messenger.FBInterface(
page_access_token='qwerty',
webhook_url='/webhook',
webhook_token='some-token',
))
http = story.use(mockhttp.MockHttpInterface(get={
'first_name': 'Peter',
'last_name': 'Chang',
'profile_pic': 'https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xpf1/v/t1.0-1/p200x200/13055603_10105219398495383_8237637584159975445_n.jpg?oh=1d241d4b6d4dac50eaf9bb73288ea192&oe=57AF5C03&__gda__=1470213755_ab17c8c8e3a0a447fed3f272fa2179ce',
'locale': 'en_US',
'timezone': -7,
'gender': 'male'
}))
story.use(mockdb.MockDB())

await fb_interface.handle({
'object': 'page',
'entry': [{
'id': 'PAGE_ID',
'time': 1473204787206,
'messaging': [
{
'sender': {
'id': 'USER_ID'
},
'recipient': {
'id': 'PAGE_ID'
},
'timestamp': 1458692752478,
'message': {
'mid': 'mid.1457764197618:41d102a3e1ae206a38',
'seq': 73,
'text': 'hello, world!'
}
}
]
}]
})

http.get.assert_called_with(
'https://graph.facebook.com/v2.6/USER_ID',
params={
'access_token': 'qwerty',
},
)


# integration

@pytest.fixture
Expand Down Expand Up @@ -177,23 +227,23 @@ def store_result(message):
incorrect_trigger.receive(message)

await fb_interface.handle({
"object": "page",
"entry": [{
"id": "PAGE_ID",
"time": 1473204787206,
"messaging": [
'object': 'page',
'entry': [{
'id': 'PAGE_ID',
'time': 1473204787206,
'messaging': [
{
"sender": {
"id": "USER_ID"
'sender': {
'id': 'USER_ID'
},
"recipient": {
"id": "PAGE_ID"
'recipient': {
'id': 'PAGE_ID'
},
"timestamp": 1458692752478,
"message": {
"mid": "mid.1457764197618:41d102a3e1ae206a38",
"seq": 73,
"text": "hello, world!"
'timestamp': 1458692752478,
'message': {
'mid': 'mid.1457764197618:41d102a3e1ae206a38',
'seq': 73,
'text': 'hello, world!'
}
}
]
Expand Down Expand Up @@ -232,24 +282,24 @@ def store_result(message):
incorrect_trigger.receive(message)

await fb_interface.handle({
"object": "page",
"entry": [{
"id": "PAGE_ID",
"time": 1473204787206,
"messaging": [{
"sender": {
"id": "USER_ID"
'object': 'page',
'entry': [{
'id': 'PAGE_ID',
'time': 1473204787206,
'messaging': [{
'sender': {
'id': 'USER_ID'
},
"recipient": {
"id": "PAGE_ID"
'recipient': {
'id': 'PAGE_ID'
},
"timestamp": 1458692752478,
"message": {
"mid": "mid.1457764197618:41d102a3e1ae206a38",
"seq": 73,
"text": "Green!",
"quick_reply": {
"payload": "GREEN"
'timestamp': 1458692752478,
'message': {
'mid': 'mid.1457764197618:41d102a3e1ae206a38',
'seq': 73,
'text': 'Green!',
'quick_reply': {
'payload': 'GREEN'
}
}
}]
Expand Down
10 changes: 6 additions & 4 deletions botstory/integrations/mockhttp/mockhttp.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ def stub(name=None):


class MockHttpInterface:
post = aiohttp.test_utils.make_mocked_coro(return_value=True)
webhook = stub('webhook')
start = aiohttp.test_utils.make_mocked_coro(return_value=True)
stop = aiohttp.test_utils.make_mocked_coro(return_value=True)
def __init__(self, get={}, post=True, start=True, stop=True):
self.get = aiohttp.test_utils.make_mocked_coro(return_value=get)
self.post = aiohttp.test_utils.make_mocked_coro(return_value=post)
self.start = aiohttp.test_utils.make_mocked_coro(return_value=start)
self.stop = aiohttp.test_utils.make_mocked_coro(return_value=stop)
self.webhook = stub('webhook')
3 changes: 2 additions & 1 deletion botstory/integrations/tests/integration_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import pytest

from . import fake_server
from .. import fb, aiohttp, mongodb
from .. import fb, aiohttp, mongodb, mockhttp
from ... import story, chat, utils

logger = logging.getLogger(__name__)
Expand All @@ -28,6 +28,7 @@ async def builder(db, no_session=False, no_user=False):

story.use(db)
interface = story.use(fb.FBInterface(page_access_token='qwerty'))
story.use(mockhttp.MockHttpInterface())

return interface, user

Expand Down

0 comments on commit fbd236a

Please sign in to comment.