littlecodersh/ItChat

功能与意见反馈,报bug可以另开issue

littlecodersh opened this issue · 340 comments

都可以在这里交流,我会及时回复的~
也欢迎加入QQ群讨论:549762872

当我在运行run.py的时候遇到了如下问题?
请问是哪里错了??

D:\pythoncode\ItChat-master>python run.py
Getting uuidC:\Python27\lib\site-packages\requests-2.9.1-py2.7.egg\requests\packages\urllib3\util\ssl_.py:315: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.
  SNIMissingWarning

@weixiaoqiang
一方面,requests已经给出了修复建议的网址,要参照具体的情况修复,在此只能建议阅读。
另一方面,这不是本项目程序的问题,如果确认需要提交issue,建议到requests提交。

这个项目需要手机一直登录着微信号吗?

@KJlmfe 需要的,本项目基于扫码登陆,目前所有扫码登陆在对应的手机登出后都会自动登出。
另外,如果要保持本项目超长时间(数月等)在线,建议手机保持联网。

xzjs commented

如何主动给群发消息了,我原先的思路不对,诸位有什么办法么

@xzjs 这里需要用到两个方法,get_contact和send。get_contract方法可以返回过滤后仅剩用户的用户列表,你可以打印出来看一下。之后将每个用户的UserName键传入send函数的第二个值即可。api都封装好了,你可以研究一下文档,其中我有介绍。

xzjs commented

@littlecodersh 谢谢你的思路,现在的情况是这样,已经有一个存在的群,里面有一些人并不是我的好友,我需要在这个群里发消息而不能重新创建一个群,我尝试获取过群的@@XXX,但是把它填入第二个参数是无用的,但是在demo的群回复中是有效的

@xzjs 每一次登陆后群的UserName都会变化,使用的是否是同一次的UserName?
我们可以重新开一个issue讨论这个问题。

请问下,如何获得某个群讨论里面的暱称?

比如说 aa1 在某个群里面暱称是 aa2
这个 aa1 是 NickName ,那 aa2 从哪里获得?

@1265858594 建议尝试这两个方法:get_chatroomsupdate_chatroom
通过第一个方法获取群UserName,并将其传递给第二个方法。

0x94 commented

@littlecodersh get_chatrooms获取不到数据

@0x94
你有保存到通讯录的群聊吗?如果没有的话需要在获取第一个新的群聊消息后重新载入群聊列表才能读取到群聊。
这和没有聊天记录的时候使用微信是一个道理。

@littlecodersh 这个教程看过了,可以发送图片,这个没问题,但是我想发送自定义动画表情,是表情,虽然本质上也是图片,但显示效果不一样,现在只找到了内置表情和图片的发送,自定义的动画表情没有

@237rxd 动图么?把后缀改成.gif当图片发送即可

djtu commented

@littlecodersh 使用的是示例代码,二维码显示不全

@djtu 有试过这个命令吗?

itchat.auto_login(enableCmdQR=2)

@littlecodersh 抱歉提出这么多问题,我发现几个问题。

  1. 为什么我发信息给别人也会触发text_reply这个函数,这能不能设置不触发?
  2. 假若我收到一条信息触发了text_reply函数,在一次触发中 我写了一个循环,想发几条信息itchat.send(),但是似乎每次都是发1 2条就停下来了,不能一次触发中send多条信息?
  3. msg['ActualNickName']这个是不是只能在群聊里才有?似乎私聊中报错。

@Peteling 没事,我看到肯定都会回复的。

  1. 在方法中判断FromUserName是否为自己即可
  2. 可以的,是没有加延时的问题,不加延时连续发送多条信息微信端后台会不接受。
  3. 是的,私聊中没有,直接使用NickName即可。
if msg['FromUserName'] == itchat.originInstance.storageClass.userName:
    return

@littlecodersh 一个小问题 ,收到视频图像时候能不能获得原来视频图片的命名?

@Peteling 如果是以文件的形式发送的话是可以的,在FileName键里

djtu commented

请问群@回复的@是真正的@吗?

@djtu 不是的,网页版目前没有办法@人,所以做了个样子

FromUserName获取出来是一个乱码。。@asdads2321312.。请问一下这个怎么解码成正常的文字啊?

@mxd54lq UserName本来就是这个格式的
你需要获取该用户的其他信息的话可以使用`

itchat.search_friends(userName=theUserNameYouGet)

@littlecodersh 请问现在py3和py2合并了吗,还是py3还是一个分支,我觉得py3和py2应该引用一份代码就可以了,需要我写一下吗?

@chyroc 已经是一份啦:)

获取用户信息时,userName都被加密成@a98f72h2o13p13u5这样的随机码,而且重新登陆机器人后,同一个好友用户的userName会不同,有办法永久识别一个唯一好友用户吗?

@marslabtron 最简单的做法是每个好友都设置不同的昵称,itchat提供了set_alias方法。

如何指定给自己发消息....看了一下没有找到

@chyroc itchat.send('msg')就可以了。
不过有些账号是收不到自己发给自己的信息的,那些账号可以试一下发给‘filehelper’

djtu commented

请问,itchat 能够接收到 面对面 扫码转账信息吗? 需要怎么编写代码呢?

@djtu 能收到转账信息,是个sharing,但是并不能知道是谁转的

请问能否增加回复类型为分享的功能?

@CosimoZi 目前不可以,被微信特别封掉了。

请问这个库调用的微信哪一套接口?是官方承认的接口还是自己hacking的接口?

@littlecodersh 刚开始看项目功能时都没意识到这个不是微信公众号机器人而是普通微信号的。这个原理是模仿pc客户端扫码登录么?

@landall 公众号项目的话有itchatmp,这个项目是模拟的网页版登陆。

hi,add_friend方法可以关注公众号不,
itchat.add_friend(userName='LittleCoder')返回“请求成功”,但实际上并没有关注上;
itchat.add_friend(userName='@abcdefg1234567')返回结果为空

itchat.add_friend(userName='@abcdefg1234567')
<ItchatReturnValue: {u'BaseResponse': {u'ErrMsg': u'', u'Ret': -1, 'RawMsg': u''}}>

另外,在不是好友的前提下,如何搜索公众号,itchat.search_mps(userName='@abcdefg1234567')没有结果返回,谢谢!

@littlecodersh 登陆之后可不可以返回一个对象,然后在程序其他地方需要发送微信的时候可以调用这个对象的send方法来发送数据?可能我的需求是需要按照外部数据来发送微信信息。

@breadsh 直接存储UserName,然后调用itchat.send方法

请问在群聊的时候, 如何只回复别人@自己的对话, 如果我设置isGroupChat=True, 机器人会回复群里面每个人说的话. msg_register有没有什么参数可以针对@自己的信息? 谢谢大神!

@chvlyl msg['isAt']

Hi, I have read your project and analyzed the apis also. I noticed perhaps you had made some mistakes because of wechat's incorrectly naming and ambiguous actions.
First, you could find the get_contact method would never fetch chatrooms' information. The reason is this information does not be contained in the returning value.
In initial processing, you could observe there are two requests fetching data from /cgi-bin/mmwebwx-bin/webwxbatchgetcontact. The first one, have hold pre-request chatroom's names just as if they are from the air....
Actually, they are contained in the frist response of /cgi-bin/mmwebwx-bin/webwxinit. There is a field called ChatSet.
And the next /cgi-bin/mmwebwx-bin/webwxbatchgetcontact request, well, the chatroom's names are contained in the result of /cgi-bin/mmwebwx-bin/webwxsync called StatusNotifyUserName.
I hope a little help to you.
Thanks.

@SeavantUUz Thx for your suggestion.

  1. get_contact contains chatrooms that have been added to your contact.
  2. As is given the name ChatSet, it's contains information of contact's arrangement.
  3. Also, StatusNotifyUserName is for UserNames with unread messages.
  4. There are many ways to fetch a chatroom, if you are interested, you may want to know how itchat get it done.
    You analyzed the http requests and did a good job! I strongly suggest you to join our qq chatroom: 549762872, there you will find many people tried that before.

你好,我不是很明白是怎样安装itchat的,我直接在python里面输出了pip install itchat 这样吗?

@xixiwo 是的,然后就可以用了。

在接收到有 下载原图选项的图片信息时候 是否有提供原图的URL 供下载?
谢谢.

@kuyagic web微信,有收图片原图的功能么?

请问:

#coding=utf8
import itchat, time
from itchat.content import *

@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING, SYSTEM])
def text_reply(msg):
    print('%s: %s' % (msg['Type'], msg['Text']), msg['FromUserName'])

itchat.auto_login(True)
itchat.run()

好像收不到公众号发的消息,该如何修改?

你好,想问下当运行itchat.run()后,是不是只能响应事件?当运行itchat.run()后,想定时发出消息到指定的用户该如何实现。谢谢。

hz commented

@iochan, 如果你做到了,可否贡献一个代码片段给大家做例子呢?
我不是作者,大体思路: itchat.run( blockingThread=False), 然后你需要itchat.newInstance(), 在这个instance里发消息出去; 如果你需要接收另一个程序的指令,你需要在这个newInstance里监听一个zmq或者一个socket, 接收指令,然后发出去。只是思路,我没测试过。而且欢迎@ittlecodersh 来建议。

hz commented

@suse110, 现在这个是png, login(picDir='/tmp/qr.png')。 文本模式显示不完整,可以尝试 login(enableCmdQR=2), 记得好像是。

新手上路,几个问题
目的是自己的系统监控告警信息多一个告警渠道,目前是短信+QQ+邮件
目前遇到了这样几个问题
1.send_msg()只能用username么?当然不是大问题,search一下就好。
2.在前期测试的时候发现几率性failed to establish a new connection,开始以为是写测试的地方公共wifi很烂,但是切换到联通/电信的4G信号之后还是有这个问题,写了一个随机延迟发送send_msg的脚本测试了一下,出现概率大概在5%,是有什么代码没敲么

@guotie

@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING, SYSTEM], isMpChat=True)

@iochan

itchat.run(blockThread=False)

@GregoryGT 监控的话建议用公众号项目:itchatmp

@littlecodersh
iaas工作,只是为了降低自己的工作强度,一些预防故障发生的阈值类告警。业务监控平台有商业解决方案在运行,然而只支持邮件与短信。
主要目的是针对相关工作人员的定制化发送。后端已经写好运行很久了,有额外监控也有从业务监控平台的API上拉信息的,主要依赖与QQ和邮件,但是实时性都比不上微信和短信,而微信功能又强好多。公众号似乎显示条件实际上比普通的chatroom还要多。

另外关于描述的第二个问题再次测试了一下,发现问题仅局限在使用IDLE的情况下,编辑器写好扔IDLE里运行也没关系,很奇怪。相关现象我继续测试一下。
(非专业人士就是这么非专业地还在使用IDLE)
P.S.请问QQ讨论群仅限讨论tichat还是欢迎所有新手?

@GregoryGT 欢迎所有人。

jkq10 commented

你好!目前微信对于某些表情是有对应词语的,比如我输入“嘿嘿”,那么可能就会有一个嘿嘿的表情出现。
另外在收到某个表情时,在手机屏保页的信息提示里,也会有类似[嘿嘿]的信息提示。
所以想问下目前库支持上述功能吗?也即,如果我收到一个[嘿嘿]的表情的时候,不但能获取该表情,也能获取该表情对应的文本信息,比如在TEXT属性中,但是我自己测试了下没有找到。
如果不支持的话,可否尝试支持下呢?感谢!

您好,每次运行有content的代码的时候都会显示AttributeError: 'module' object has no attribute 'content',想请问一下是什么原因呢。运行平台是mac python2.7,Itchat的版本是0.1b

Tz-H commented

@littlecodersh

Quick question: is the current ItChat able to reply a message which type is a geo place (map) card?

E.g. if I have had geo data latitude=xxxxx, longitude=xxxxx, can I reply it via itchat.send() then the received message is actually a map type card with this geo data info embedded?

@TianziHou web微信不支持的东西,一般情况来说我们都无能为力

请问,用账号密码登录微信有思路吗

楼主好!请问好多函数是不是都被限定了使用频率?我试着写一段代码批量修改一些人的备注名(使用的itchat.set_alias),然而发现每次都只能修改成功9个人,这是什么原因呢,麻烦不吝指导,非常感谢!

@x-f1v3 思路要别人讲是最可悲的。
@yanglei091991 有限定频率,具体经验值可以加群探讨。

额 不敢苟同

@x-f1v3 思路不自己想的话,人和机器又有什么区别呢?

我的网络平时一直需要proxy才能访问外网,请问现在有没有方法设置?

@littlecodersh 您好,能否加入“修改群成员备注”的接口?

你好,请问itchat的原理是利用微信给出的开发者接口吗?还是会分析一下网页版微信,然后获取更多的接口?

UC10D commented

支持发送语音吗

程序可以运行但命令行显示
File "E:/WFimg/test/test_robot.py", line 12, in text_reply if msg['isAt']: KeyError: 'isAt'
这是什么意思呢?哪里有问题吗?

代码片段:

@itchat.msg_register([TEXT, PICTURE], isGroupChat=True)
def text_reply(msg):
    if msg['isAt']:
        if msg['Content'][4:] == '获取图片':

@duskmoon314 你更新一下pip的最新版:

pip install itchat -U

@littlecodersh 已经显示最新版了


(test) E:\WFimg\test\Scripts>pip install itchat -U
Requirement already up-to-date: itchat in e:\wfimg\test\lib\site-packages
Requirement already up-to-date: requests in e:\wfimg\test\lib\site-packages (from itchat)
Requirement already up-to-date: pyqrcode in e:\wfimg\test\lib\site-packages (from itchat)
Requirement already up-to-date: pypng in e:\wfimg\test\lib\site-packages (from itchat)

还是有时会显示KeyError: 'isAt',虽然程序仍然可以正常运行

@littlecodersh 不能发送带中文名字的文件,会是什么原因?

发送成功的例子,目录有中文名:
D:\share\05特贩培训资料\培训\wine.ppt
{'BaseResponse': {'Ret': 0, 'ErrMsg': '请求成功', 'RawMsg': '请求成功'}, 'MsgID': '5072751624573715267', 'LocalID': '14904033498970'}

发送失败的例子,文件名有中文:
D:\share\05特贩培训资料\培训\麦卢卡蜂蜜.ppt
{'BaseResponse': {'Ret': 1, 'ErrMsg': '', 'RawMsg': ''}, 'MediaId': '', 'StartPos': 0, 'CDNThumbImgHeight': 0, 'CDNThumbImgWidth': 0}

@zhihuaqiu 你看主页的FAQ

一个小疑问:
请问假如我现在收到了一条群里某人的消息,我怎么才能知道这条消息来自哪个群呢?
似乎消息(msg)里并没有消息来源的信息

@weixiaoqiang msg.fromUserName就是群的标识符,msg.user就是那个群。

@littlecodersh 原来如此!fromUserName是群标识符,actualUserName是用户本身的名字对吧

@winterszhangdong 本身的标识符,昵称在msg.actualNickName里面

你好!我正在尝试捕捉群聊中新人加入的消息,我尝试使用@itchat.msg_register(SYSTEM, isGroupChat=True) 来获取系统消息,但是似乎没有能成功(拉人不会回复)。请问可能是哪里出了问题?或者有什么已知的方法可以使用来解决这个问题?

使用了INCOME_MSG类型+MsgType 10000 判断,再加上内容关键词加入,似乎成功了=w=

Tz-H commented

@littlecodersh

我在测试使用 itchat 作为微信机器人助理进行聊天,文件解析传输等操作,但是最近频繁出现(近三周内已出现两次)测试用微信帐号被报告为「该微信账号因登陆环境异常,已被限制登录」的信息,导致微信帐号被锁定而需解锁,请问应该如何使用 itchat 才可以避免这种情况频繁发生?

mytbk commented

有没有办法在登陆的时候根据Uin获取聊天室的userName?我看了文档,没太看懂,是不是说没有这种方法?

能否获取用户的备注名?

翻源码找到了friend['RemarkName']

【咨询】能否实现加群功能,根据微信群二维码,加入该群。

想问一下怎么主动发送文件给某个特定群啊

您好,请问我在设置自动回复的时候如何获取发送消息用户的用户名?我尝试了msg.userName但是好像是一段乱码

yjx7 commented

Traceback (most recent call last):
File "wx.py", line 11, in
subprocess.call(['xdg-open', QR_DIR])
File "/usr/lib/python2.7/subprocess.py", line 522, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 710, in init
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory

ubuntu下报这个错误,想问下怎么解决

你好, 这个库支持定时发送消息吗? 我试了下如果使用
itchat.run()
之后, 就不能单独使用
itchat.send_msg('testa', toUserName='filehelper')
这样的命令了, 必须要在监听到消息的时候才能发送指定消息给指定的用户.

比如:
if name == 'main':
itchat.auto_login(hotReload=True)

itchat.send_msg('testa', toUserName='filehelper')
itchat.run()
itchat.send_msg('testb', toUserName='filehelper')

能够发送testa, 不能发送testb.

在linux命令行下面出现登录成功后马上就log out的问题,是否不支持linux?代码在windows上面没有任何问题

如何保持长时间在线?

@mrujowfi
itchat.run(blockThread=False)

翻翻记录,这个问题以前有人提过。

@littlecodersh 请问 API 是否支持设置 "消息免打扰" ?

error:
No module named 'itchat.content'; 'itchat' is not a package

@wenlibin02 你自己的脚本不要叫itchat.py

@tempdban 你 @ 错人了... @blackjws
你能顺便回答我问题么...