youfou / wxpy

微信机器人 / 可能是最优雅的微信个人号 API ✨✨
http://wxpy.readthedocs.io
MIT License
14.04k stars 2.39k forks source link

卡在登录后二维码那步了 #1

Closed ideago closed 7 years ago

ideago commented 7 years ago

大虾,首先为你创造了这么nb的项目点个赞哈……👍

然后我有个问题求教,就是登录之后返回验证码的问题

关于这个问题我尝试了以下两种方案

================================================= 1.控制台输出二维码,二维码太长了,超出屏幕了,分辨率也太低了,根本不行

2.保存二维码到指定路径,根本保存不出来,我去看了下二维码相关的代码,好像也没有保存逻辑呢

youfou commented 7 years ago

NB的项目是 littlecodersh 大虾创造的 itchat ,wxpy 只是尝试优化接口而做了一层封装哈哈。

二维码图片消失的问题之前也有其他朋友提出过,这是因为 itchat 会在登陆成功后删除原先创建的二维码。具体逻辑请见 这里login() 函数,大约在第60~65行。

    # 到这里已经登陆成功
    if hasattr(loginCallback, '__call__'):
        r = loginCallback()
    else:
        utils.clear_screen()
        if os.path.exists(picDir or config.DEFAULT_QR):
            os.remove(picDir or config.DEFAULT_QR)

不过好在 itchat 分别提供了获取二维码和登陆成功的回调参数: qrCallback / loginCallback,这两个参数在 wxpy 中为了统一代码风格,被改名为 qr_callback / login_callback (Robot 对象初始化时使用)。

所以,通过传入以上两个回调,即可实现获取到二维码后的额外操作,以及修改登陆成功后是否删除二维码文件等表现。

对于你目前的需求,除了修改 qr_path 外,还需传入一个不会删除文件,或干脆什么都不作的 login_callback 函数即可。

ideago commented 7 years ago

多谢大虾,现在已经跑起来了,但是有个python回调的问题想请教下。

from wxpy import * import os

robot = None

def getChats(): print('chats : %s' % Robot(robot).friends().stats_text())

def handleQrCode(uuid, status, qrcode): path= os.path.abspath('./haha.png') file = open(path,'wb') print(path) print("uuid %s " % uuid) print("status %s" % status) print("qrcode %s" % qrcode) file.write(qrcode)

robot = Robot(login_callback=getChats(),qr_callback=handleQrCode) robot.start()

上面代码中的login_callback我需要实例化后的robot对象,这个该怎么传递过去呢?我现在这种写法好像是创建了两个Robot实例呢,getCharts方法那里应该怎么去调用实例化之后的Robot对象呢?

在 2017年3月2日,下午3:00,Youfou <notifications@github.com mailto:notifications@github.com> 写道:

NB的项目是 littlecodersh 大虾创造的 itchat https://github.com/littlecodersh/ItChat ,wxpy 只是尝试优化接口而做了一层封装哈哈。

二维码图片消失的问题之前也有其他朋友提出过,这是因为 itchat 会在登陆成功后删除原先创建的二维码。具体逻辑请见 这里 的 login() 函数,大约在第60~65行。

# 到这里已经登陆成功
if hasattr(loginCallback, '__call__'):
    r = loginCallback()
else:
    utils.clear_screen()
    if os.path.exists(picDir or config.DEFAULT_QR):
        os.remove(picDir or config.DEFAULT_QR)

不过好在 itchat 分别提供了获取二维码和登陆成功的回调参数: qrCallback / loginCallback,这两个参数在 wxpy 中为了统一代码风格,被改名为 qr_callback / login_callback (Robot对象初始化时使用)。

所以,通过传入以上两个回调,即可实现获取到二维码后的额外操作,以及修改登陆成功后是否删除二维码文件等表现。

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/youfou/wxpy/issues/1#issuecomment-283573200, or mute the thread https://github.com/notifications/unsubscribe-auth/AHHLRWHghvMPQpVmB7aQeeXylYAFHx2dks5rhmkTgaJpZM4MQify.

youfou commented 7 years ago
# 初始化机器人
robot = Robot(qr_path='my_qr.jpg', login_callback=lambda *agrs: None)

初始化后就可以用 robot 实例继续操作了,希望能解决你的问题。

ideago commented 7 years ago

多谢大虾,我还有一个回调的人问题想请教下……😳

发自我的 iPhone

在 2017年3月2日,15:14,Youfou notifications@github.com 写道:

初始化机器人

robot = Robot(qr_path='my_qr.jpg', login_callback=lambda *agrs: None) — You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or mute the thread.

youfou commented 7 years ago

麻烦描述下具体的需求,比如保存二维码是为了做什么处理,是为了传输到远程来扫码吗?

ideago commented 7 years ago

二维码的问题现在已经解决了,保存下来就是为了扫而已,关键现在是回调那个我好像创建了两个robot对象,带回调的那个是我自己处理的二维码,不带回调参数的那个你写的类会自动保存二维码还会调用系统图片浏览器自动打开……我!不想创建两个对象,我觉得login_callback那里应该返回robot实例的,因为是异步的嘛所以那里不返回的话我没法进一步操作哇……😳

发自我的 iPhone

在 2017年3月2日,15:33,Youfou notifications@github.com 写道:

麻烦描述下具体的需求,比如保存二维码是为了做什么处理,是为了传输到远程来扫码吗?

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or mute the thread.

youfou commented 7 years ago

login_callback 本身是用来做一些登陆成功后顺带要做的事情,比如写个日志之类的。 如果只是要在登陆成功后做一些事情的话,初始化完成后直接用实例操作就可以,不需要使用回调的方式,毕竟回调也麻烦,而且不方便在回调里注册消息。 Robot的初始化不是异步的,登陆成功后才会继续执行。

ideago commented 7 years ago

现在试了下确实是同步的竟然,那会好像是写了qrcode_callback 然后扫描自己保存的二维码之后,控制台有TERM environment variable not set.所以错误地以为是还没登录成功就执行了拉取好友列表的逻辑,以为是异步呢。现在跑通了,谢谢大虾哈。后续有问题还得麻烦你呢,公司把网易邮箱封了,只能手机码字发邮件,回复稍微慢点……😳

发自网易邮箱大师 在2017年03月02日 15:55,Youfou 写道:

login_callback 本身是用来做一些登陆成功后顺带要做的事情,比如写个日志之类的。 如果只是要在登陆成功后做一些事情的话,初始化完成后直接用实例操作就可以,不需要使用回调的方式,毕竟回调也麻烦,而且不方便在回调里注册消息。 Robot的初始化不是异步的,登陆成功后才会继续执行。

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or mute the thread.

youfou commented 7 years ago

哈哈,搞清楚了就好