微信公众平台 Python 开发包(wechat-python-sdk) 更新至 v0.5.0,支持模拟登陆,上下文对话,验证码,欢迎拍砖 >_< - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
doraemonext

微信公众平台 Python 开发包(wechat-python-sdk) 更新至 v0.5.0,支持模拟登陆,上下文对话,验证码,欢迎拍砖 >_<

  •  1
     
  •   doraemonext
    doraemonext 2014 年 12 月 9 日 9221 次点击
    这是一个创建于 4155 天前的主题,其中的信息可能已经有所发展或是发生改变。

    发现原来那篇主题( http://v2ex.com/t/129474 )发布时间太久远了……提不上来了……重开一贴……

    项目地址: https://github.com/doraemonext/wechat-python-sdk

    文档地址: http://wechat-python-sdk.readthedocs.org/

    做了一次比较大的更新,与上个版本比较:

    • 新增了针对 Django 的上下文对话支持
    • 新增了非官方接口下的验证码登录及获取验证码功能
    • 新增了在素材库中创建图文消息功能
    • 新增了二维码事件的获取
    • 修正了编码转换问题
    • 修正了自定义菜单跳转事件获取
    • 更正了 WechatBasic 中的解释说明链接
    • 更新文档,增加了一个快速上手示例
    • 增加了FAQ文档

    这次更新兼容历史版本,可以无缝升级。

    ======== 我是分割线,下面是一点乱七八糟的东西 ========

    然后做个预告,正在写另外一个微信公众号的开源平台( https://github.com/doraemonext/wechat-platform ),BSD许可证,主要面向群体是订阅号的运营者,支持多公众号。
    对订阅号而言,深度集成各种模拟登陆功能,支持全部/随机/顺序/逆序回复规则里面的内容,支持混合回复语音/图片/文字/图文/音乐,支持插件扩展,自带人工识别腾讯验证码等等。目前后台基本完成,正在疯狂写管理后台的前端,发两张图 =.=

    http://ww1.sinaimg.cn/large/c6b77a54gw1en3esah81ej21110q944d.jpg
    http://ww4.sinaimg.cn/large/c6b77a54gw1en3esbfs6yj21110q9ae8.jpg

    希望寒假之前能够搞定并发布第一个版本 >_<

    ======== 乱七八糟的东西结束,下面直接贴 wechat-python-sdk 的 README ========

    非官方微信公众平台 Python 开发包,包括官方接口和非官方接口。

    • 官方接口依据公众平台开发者文档编写,可以实现公众平台开发者文档中的所有内容,具体不列举,请查看 WechatBasic 文档;

    • 非官方接口采用模拟登陆的方式,可以实现更多高级功能,但也存在相应风险。

    目前提供的非官方接口功能有:

    • 主动对指定用户发送文本消息
    • 主动对指定用户发送图片消息
    • 主动对指定用户发送语音消息
    • 主动对指定用户发送视频消息
    • 获取指定用户的个人信息
    • 获取用户列表
    • 获取分组列表
    • 获取图文信息列表
    • 获取与指定用户的对话内容
    • 向指定用户发送图文消息(必须从图文库里选取消息ID传入)
    • 在素材库中创建图文消息
    • 上传素材至素材库 (图片/语音/视频)
    • 向特定用户发送媒体文件 (图片/语音/视频)
    • 获取素材库文件列表
    • 获取用户头像
    • 获取新消息的数目
    • 获取最新一条消息
    • 获取消息列表
    • 根据消息ID获取图片消息内容
    • 根据消息ID获取语音消息内容
    • 根据消息ID获取视频消息内容

    请注意:本开发包并不打算提供一个独立的完整微信解决方案,我们更希望这个开发包可以非常融洽的在各个框架中进行集成并使用,对于HTTP请求及响应方面并不涉及,该开发包仅仅接受必要参数,提供各种微信操作的方法,并返回相应的可以响应微信服务器的数据(Response)或操作执行结果。

    25 条回复    2014-12-21 14:18:21 +08:00
    abelyao
        1
    abelyao  
       2014 年 12 月 9 日
    “主动对指定用户发送消息” 是不是需要48小时内用户有发东西给本号?或者是利用每月发送限制的次数发的?
    doraemonext
        2
    doraemonext  
    OP
       2014 年 12 月 9 日
    @abelyao 需要48小时内用户有发东西给本号,不是利用每月发送限制的次数发的。

    这个功能的目的主要是为了当用户发送请求后,可以不用管微信的限制,直接通过这些方法主动发送任意多的文字、图片、语音、图文等给用户。
    abelyao
        3
    abelyao  
       2014 年 12 月 9 日
    恕我直言,总觉得以模拟登陆去实现的功能,很坑,如果哪天官网改变了,就会影响到嵌入这个 SDK 的业务,而除非 SDK 有时时进行更新,不然就又是一个坑。之前我们也利用模拟登录做了有几个小功能,后来觉得不妥,改变业务的方向,使用官方 API 进行操作了。

    不过还是支持楼主,无论是坚持写一个 SDK 持续力,还是把 SDK 公开出来给别人参考学习使用,都得要你点个赞。
    doraemonext
        4
    doraemonext  
    OP
       2014 年 12 月 9 日
    @abelyao 谢谢 :-)
    momo1999
        5
    momo1999  
       2014 年 12 月 9 日
    不知道用户分享公众号的时候有没有什么消息可以获取到这个事件。
    doraemonext
        6
    doraemonext  
    OP
       2014 年 12 月 9 日
    @shuax 不清楚诶 =.=
    virusdefender
        7
    virusdefender  
       2014 年 12 月 9 日
    看了看很棒~~过段时间有空看看能不能帮忙~
    doraemonext
        8
    doraemonext  
    OP
       2014 年 12 月 9 日
    @virusdefender 谢谢啦~
    14
        9
    14  
       2014 年 12 月 9 日 via Android
    谢谢楼主,上次用你的SDK重构了微信平台,微信的API文档没有楼主文档那么详细的权限说明,因为是个通用平台,但是我无法根据用户填的设置判断他是未认证还是已认证是订阅号还是服务号,我只能根据报错判断,不知道有没有什么好的实践= =
    kxxoling
        10
    kxxoling  
       2014 年 12 月 9 日
    赞!已 star。
    doraemonext
        11
    doraemonext  
    OP
       2014 年 12 月 9 日
    @14 可以把选择权交给用户 =.=

    如果必须是自动判定的话,那只能调用一些无关痛痒的接口然后看看是否出错了……
    doraemonext
        12
    doraemonext  
    OP
       2014 年 12 月 9 日
    @kxxoling 谢谢 :-)
    14
        13
    14  
       2014 年 12 月 9 日 via Android
    @doraemonext 用户最不靠谱了。。。
    14
        14
    14  
       2014 年 12 月 9 日 via Android
    @doraemonext 对,可是对于未认证的订阅号,似乎没有任何自动化的方法,它能够调用的只有被动发消息接口。。。
    doraemonext
        15
    doraemonext  
    OP
       2014 年 12 月 9 日
    @14 可能也会有用户想把认证服务号当普通订阅号来用的吧(逃

    未认证订阅号在调用WechatBasic的get_menu()获取自定义菜单时会抛出OfficialAPIError
    认证订阅号或未认证服务号在调用WechatBasic的get_groups()获取用户分组时会抛出OfficialAPIError

    先试get_groups(),如果成功就是认证服务号,如果抛出异常,再试get_menu(),如果成功就是认证订阅号或未认证服务号,否则就是未认证订阅号。

    上面这两个方法都是只读的,属于无关痛痒的调用 =。=
    doraemonext
        16
    doraemonext  
    OP
       2014 年 12 月 9 日
    @14 对于没有权限的调用,wechat-python-sdk会直接抛出对应异常,直接捕获就可以了,具体异常信息参考: http://wechat-python-sdk.readthedocs.org/zh_CN/master/exceptions.html
    14
        17
    14  
       2014 年 12 月 9 日
    @doraemonext 谢,这样对于未认证的订阅号,还是无法区分有没有填错。然后发现去验证没有太大意义,万一中途用户又去认证了,还是按照正常逻辑捕获异常吧。说起异常,刚开始眼花没分清NeedParamError和NeedParseError导致误入歧途= =
    doraemonext
        18
    doraemonext  
    OP
       2014 年 12 月 10 日
    @14 其实可以根据异常的信息来区分的,刚才做了一下实验,下面是实验结果:

    无论公众号是什么类型,如果appid或appsecret输入错误,抛出的OfficialAccount异常内容为字符串"40001: invalid credential"

    对于未认证订阅号,不管是调用get_menu()还是get_groups()都会抛出OfficialAccount异常,异常内容为字符串"50001: user unauthorized"

    对于已认证订阅号或未认证服务号,调用get_groups()会抛出OfficialAccount异常,异常内容为字符串"48001: api unauthorized"

    对于认证服务号,什么异常都不会抛出
    doraemonext
        19
    doraemonext  
    OP
       2014 年 12 月 10 日
    @14 上面的异常名字全都写错了。。还改不了。。。全都是OfficialAPIError。。。
    blue7wings
        20
    blue7wings  
       2014 年 12 月 10 日
    支持,支持。。。
    doraemonext
        21
    doraemonext  
    OP
       2014 年 12 月 10 日
    @14 感觉可以根据这个再增加一个判断用户公众号类型的方法 =。=
    ddkangfu
        22
    ddkangfu  
       2014 年 12 月 14 日   1
    已经fork代码,加油啊楼主~~~
    doraemonext
        23
    doraemonext  
    OP
       2014 年 12 月 14 日
    @ddkangfu 谢谢 :-)
    icewent
        24
    icewent  
       2014 年 12 月 17 日
    赞!
    14
        25
    14  
       2014 年 12 月 21 日
    @doraemonext 未认证的订阅号只有原始ID和Token,连AppID都没有,这个怎么处理。。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1043 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 53ms UTC 18:28 PVG 02:28 LAX 11:28 JFK 14:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86