Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
messense committed Apr 11, 2015
2 parents 8e4acc4 + 7f2fd32 commit 8e70bd7
Show file tree
Hide file tree
Showing 9 changed files with 218 additions and 51 deletions.
18 changes: 18 additions & 0 deletions tests/fixtures/customservice_getrecord.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"recordlist": [
{
"worker": " test1",
"openid": "oDF3iY9WMaswOPWjCIp_f3Bnpljk",
"opercode": 2002,
"time": 1400563710,
"text": " 您好,客服test1为您服务。"
},
{
"worker": " test1",
"openid": "oDF3iY9WMaswOPWjCIp_f3Bnpljk",
"opercode": 2003,
"time": 1400563731,
"text": " 你好,有什么事情? "
}
]
}
9 changes: 9 additions & 0 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,15 @@ def test_customservice_get_wait_case(self):
result = self.client.customservice.get_wait_case()
self.assertEqual(150, result['count'])

def test_customservice_get_records(self):
with HTTMock(wechat_api_mock):
result = self.client.customservice.get_records(
123456789,
987654321,
1
)
self.assertEqual(2, len(result))

def test_datacube_get_user_summary(self):
with HTTMock(wechat_api_mock):
result = self.client.datacube.get_user_summary(
Expand Down
21 changes: 18 additions & 3 deletions tests/test_replies.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,6 @@ def test_reply_init_ok(self):
self.assertEqual('user2', reply.target)
self.assertTrue(timestamp <= reply.time)

def test_reply_init_fail(self):
self.assertRaises(AttributeError, TextReply, go_to_hell='hehe')

def test_reply_render(self):
timestamp = int(time.time())
reply = TextReply(
Expand Down Expand Up @@ -68,7 +65,13 @@ def test_video_reply_properties(self):
reply = VideoReply()
reply.media_id = '123456'
reply.title = 'test'
self.assertEqual('123456', reply.media_id)
self.assertEqual('test', reply.title)

reply = VideoReply(
media_id='123456',
title='test'
)
self.assertEqual('123456', reply.media_id)
self.assertEqual('test', reply.title)

Expand All @@ -81,7 +84,19 @@ def test_music_reply_properties(self):
reply.description = 'test'
reply.music_url = 'http://www.qq.com'
reply.hq_music_url = None
self.assertEqual('123456', reply.thumb_media_id)
self.assertEqual('test', reply.title)
self.assertEqual('test', reply.description)
self.assertEqual('http://www.qq.com', reply.music_url)
self.assertTrue(reply.hq_music_url is None)

reply = MusicReply(
thumb_media_id='123456',
title='test',
description='test',
music_url='http://www.qq.com',
hq_music_url=None
)
self.assertEqual('123456', reply.thumb_media_id)
self.assertEqual('test', reply.title)
self.assertEqual('test', reply.description)
Expand Down
35 changes: 35 additions & 0 deletions wechatpy/client/api/customservice.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import hashlib
import time
import datetime

from wechatpy.utils import to_binary, NotNoneDict
from .base import BaseWeChatAPI
Expand Down Expand Up @@ -194,3 +196,36 @@ def get_wait_case(self):
:return: 返回的 JSON 数据包
"""
return self._get('customservice/kfsession/getwaitcase')

def get_records(self, start_time, end_time, page_index,
page_size=10, user_id=None):
"""
获取客服聊天记录
详情请参考
http://mp.weixin.qq.com/wiki/19/7c129ec71ddfa60923ea9334557e8b23.html
:param start_time: 查询开始时间,UNIX 时间戳
:param end_time: 查询结束时间,UNIX 时间戳,每次查询不能跨日查询
:param page_index: 查询第几页,从 1 开始
:param page_size: 每页大小,每页最多拉取 1000 条
:param user_id: 普通用户的标识,对当前公众号唯一
:return: 返回的 JSON 数据包
"""
if isinstance(start_time, datetime.datetime):
start_time = time.mktime(start_time.timetuple())
if isinstance(end_time, datetime.datetime):
end_time = time.mktime(end_time.timetuple())
record_data = {
'starttime': int(start_time),
'endtime': int(end_time),
'pageindex': page_index,
'pagesize': page_size
}
if user_id:
record_data['openid'] = user_id
res = self._post(
'customservice/getrecord',
data=record_data
)
return res['recordlist']
35 changes: 0 additions & 35 deletions wechatpy/client/api/misc.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import time
import datetime

from .base import BaseWeChatAPI


Expand All @@ -25,38 +22,6 @@ def short_url(self, long_url):
}
)

def get_customservice_record(self, start_time, end_time, page_index,
page_size=10, user_id=None):
"""
获取客服聊天记录
详情请参考
http://mp.weixin.qq.com/wiki/19/7c129ec71ddfa60923ea9334557e8b23.html
:param start_time: 查询开始时间,UNIX 时间戳
:param end_time: 查询结束时间,UNIX 时间戳,每次查询不能跨日查询
:param page_index: 查询第几页,从 1 开始
:param page_size: 每页大小,每页最多拉取 1000 条
:param user_id: 普通用户的标识,对当前公众号唯一
:return: 返回的 JSON 数据包
"""
if isinstance(start_time, datetime.datetime):
start_time = time.mktime(start_time.timetuple())
if isinstance(end_time, datetime.datetime):
end_time = time.mktime(end_time.timetuple())
record_data = {
'starttime': int(start_time),
'endtime': int(end_time),
'pageindex': page_index,
'pagesize': page_size
}
if user_id:
record_data['openid'] = user_id
return self._post(
'customservice/getrecord',
data=record_data
)

def get_wechat_ips(self):
"""
获取微信服务器 IP 地址列表
Expand Down
11 changes: 11 additions & 0 deletions wechatpy/enterprise/client/api/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,14 @@ def set(self,
'agent/set',
data=agent_data
)

def list(self):
"""
获取应用概况列表
详情请参考
http://qydev.weixin.qq.com/wiki/index.php?title=获取应用概况列表
:return: 应用概况列表
"""
res = self._get('agent/list')
return res['agentlist']
34 changes: 34 additions & 0 deletions wechatpy/enterprise/client/api/batch.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
from wechatpy.client.api.base import BaseWeChatAPI


class WeChatBatch(BaseWeChatAPI):

def invite_user(self):
pass

def sync_user(self):
pass

def replace_user(self):
pass

def replace_party(self):
pass

def get_result(self, job_id):
"""
获取异步任务结果
详情请参考
http://qydev.weixin.qq.com/wiki/index.php?title=异步任务接口
:param job_id: 异步任务id,最大长度为64字符
:return: 返回的 JSON 数据包
"""
return self._get(
'batch/getresult',
params={
'jobid': job_id
}
)
86 changes: 84 additions & 2 deletions wechatpy/enterprise/events.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-

from __future__ import absolute_import, unicode_literals
from ..fields import IntegerField
from ..fields import IntegerField, BaseField
from .. import events


Expand All @@ -17,56 +17,111 @@ def register(cls):

@register_event('subscribe')
class SubscribeEvent(events.SubscribeEvent):
"""
成员关注事件
详情请参阅
http://qydev.weixin.qq.com/wiki/index.php?title=接受事件
"""
agent = IntegerField('AgentID', 0)


@register_event('unsubscribe')
class UnsubscribeEvent(events.UnsubscribeEvent):
"""
成员取消关注事件
详情请参阅
http://qydev.weixin.qq.com/wiki/index.php?title=接受事件
"""
agent = IntegerField('AgentID', 0)


@register_event('click')
class ClickEvent(events.ClickEvent):
"""
点击菜单拉取消息事件
详情请参阅
http://qydev.weixin.qq.com/wiki/index.php?title=接受事件
"""
agent = IntegerField('AgentID', 0)


@register_event('view')
class ViewEvent(events.ViewEvent):
"""
点击菜单跳转链接事件
详情请参阅
http://qydev.weixin.qq.com/wiki/index.php?title=接受事件
"""
agent = IntegerField('AgentID', 0)


@register_event('location')
class LocationEvent(events.LocationEvent):
"""
上报地理位置事件
详情请参阅
http://qydev.weixin.qq.com/wiki/index.php?title=接受事件
"""
agent = IntegerField('AgentID', 0)


@register_event('scancode_push')
class ScanCodePushEvent(events.ScanCodePushEvent):
"""
扫码推事件的事件
详情请参阅
http://qydev.weixin.qq.com/wiki/index.php?title=接受事件
"""
agent = IntegerField('AgentID', 0)


@register_event('scancode_waitmsg')
class ScanCodeWaitMsgEvent(events.ScanCodeWaitMsgEvent):
"""
扫码推事件且弹出“消息接收中”提示框的事件
详情请参阅
http://qydev.weixin.qq.com/wiki/index.php?title=接受事件
"""
agent = IntegerField('AgentID', 0)


@register_event('pic_sysphoto')
class PicSysPhotoEvent(events.PicSysPhotoEvent):
"""
弹出系统拍照发图事件
详情请参阅
http://qydev.weixin.qq.com/wiki/index.php?title=接受事件
"""
agent = IntegerField('AgentID', 0)


@register_event('pic_photo_or_album')
class PicPhotoOrAlbumEvent(events.PicPhotoOrAlbumEvent):
"""
弹出拍照或相册发图事件
详情请参阅
http://qydev.weixin.qq.com/wiki/index.php?title=接受事件
"""
agent = IntegerField('AgentID', 0)


@register_event('pic_weixin')
class PicWeChatEvent(events.PicWeChatEvent):
"""
弹出微信相册发图器事件
详情请参阅
http://qydev.weixin.qq.com/wiki/index.php?title=接受事件
"""
agent = IntegerField('AgentID', 0)


@register_event('location_select')
class LocationSelectEvent(events.LocationSelectEvent):
"""
弹出地理位置选择器事件
详情请参阅
http://qydev.weixin.qq.com/wiki/index.php?title=接受事件
"""
agent = IntegerField('AgentID', 0)


Expand All @@ -75,7 +130,34 @@ class EnterAgentEvent(events.BaseEvent):
"""
用户进入应用的事件推送
详情请参阅
http://qydev.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E6%94%B6%E4%BA%8B%E4%BB%B6#.E7.94.A8.E6.88.B7.E8.BF.9B.E5.85.A5.E5.BA.94.E7.94.A8.E7.9A.84.E4.BA.8B.E4.BB.B6.E6.8E.A8.E9.80.81
http://qydev.weixin.qq.com/wiki/index.php?title=接受事件
"""
agent = IntegerField('AgentID', 0)
event = 'enter_agent'


@register_event('batch_job_result')
class BatchJobResultEvent(events.BaseEvent):
"""
异步任务完成事件
详情请参阅
http://qydev.weixin.qq.com/wiki/index.php?title=接受事件
"""
event = 'batch_job_result'
batch_job = BaseField('BatchJob')

@property
def job_id(self):
return self.batch_job['JobId']

@property
def job_type(self):
return self.batch_job['JobType']

@property
def err_code(self):
return self.batch_job['ErrCode']

@property
def err_msg(self):
return self.batch_job['ErrMsg']

0 comments on commit 8e70bd7

Please sign in to comment.