- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python基于itchat实现微信群消息同步机器人由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
最近 全栈数据工程师养成攻略 的微信群已经将近500人,开了二群之后为了打通不同微信群之间的消息,花了点时间做了个消息同步机器人,在任意群收到消息时同步到其他群,并且将聊天内容上传至数据库,以供进一步分析、统计和展示.
基本思路是,用 Python 模拟微信登陆,接收到群里消息后,对文本、图片、分享等各类消息类型分别处理,并转发至其他群.
前期准备 。
首先得有一个微信号,用于代码模拟登陆。由于我的微信号得自己留着用,现阶段注册微信又必须要手机号,于是只好特意办了个电信号,用来申请了一个新的微信,微信号是 honlanbot。虽说似乎可以用阿里小号来注册微信,不过听说存在反复回收和安全隐患问题,故不采用.
其次,需要用到一个Python库 itchat,这个库已经做好了用代码调用微信的大多数功能,非常好用,官方文档在这里,安装的时候使用 pip 即可.
1
|
pip
install
itchat
|
我的手机支持双卡双待,于是把两张卡都装手机里,再双开微信,同时保持两个微信号手机在线,差不多就可以开始写代码了。用 itchat 调用微信主要是模拟微信网页版登陆,所以必须保持微信号手机在线,因为手机端微信一旦退出,其在网页、PC、MAC、IPAD等相应终端认证的账号也会随之退出.
初步尝试 。
itchat 提供了一些官方代码,让我们在自己的本本或电脑上新建一个 py 文件,初步尝试一下.
运行以下代码,会出现出现一张二维码,扫码登陆之后将会给“文件传输助手”发送一条消息.
1
2
3
4
5
6
|
# 加载包
import
itchat
# 登陆
itchat.auto_login()
# 发送文本消息,发送目标是“文件传输助手”
itchat.send(
'Hello, filehelper'
, toUserName
=
'filehelper'
)
|
以下代码则注册了一个消息响应事件,用来定义接收到文本消息后如何处理。在 itchat 里定义了文本、图片、名片、位置、通知、分享、文件等多种消息类型,可以分别执行不同的处理.
1
2
3
4
5
6
7
8
9
10
|
import
itchat
# 注册消息响应事件,消息类型为itchat.content.TEXT,即文本消息
@itchat.msg_register(itchat.content.TEXT)
def text_reply(msg):
# 返回同样的文本消息
return
msg[
'Text'
]
itchat.auto_login()
# 绑定消息响应事件后,让itchat运行起来,监听消息
itchat.run()
|
再来看看如何处理其他类型消息,可以把在消息响应事件里把 msg 打印出来,是一个字典,看看有哪些感兴趣的字段.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
import
itchat
# import全部消息类型
from itchat.content
import
*
# 处理文本类消息
# 包括文本、位置、名片、通知、分享
@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
def text_reply(msg):
# 微信里,每个用户和群聊,都使用很长的ID来区分
# msg['FromUserName']就是发送者的ID
# 将消息的类型和文本内容返回给发送者
itchat.send(
'%s: %s'
% (msg[
'Type'
], msg[
'Text'
]), msg[
'FromUserName'
])
# 处理多媒体类消息
# 包括图片、录音、文件、视频
@itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
def download_files(msg):
# msg['Text']是一个文件下载函数
# 传入文件名,将文件下载下来
msg[
'Text'
](msg[
'FileName'
])
# 把下载好的文件再发回给发送者
return
'@%s@%s'
% ({
'Picture'
:
'img'
,
'Video'
:
'vid'
}.get(msg[
'Type'
],
'fil'
), msg[
'FileName'
])
# 处理好友添加请求
@itchat.msg_register(FRIENDS)
def add_friend(msg):
# 该操作会自动将新好友的消息录入,不需要重载通讯录
itchat.add_friend(**msg[
'Text'
])
# 加完好友后,给好友打个招呼
itchat.send_msg(
'Nice to meet you!'
, msg[
'RecommendInfo'
][
'UserName'
])
# 处理群聊消息
@itchat.msg_register(TEXT, isGroupChat=True)
def text_reply(msg):
if
msg[
'isAt'
]:
itchat.send(u
'@%s\u2005I received: %s'
% (msg[
'ActualNickName'
], msg[
'Content'
]), msg[
'FromUserName'
])
# 在auto_login()里面提供一个True,即hotReload=True
# 即可保留登陆状态
# 即使程序关闭,一定时间内重新开启也可以不用重新扫码
itchat.auto_login(True)
itchat.run()
|
开发消息同步机器人 。
经过以上示例代码,可以总结出消息同步机器人的开发思路:
直接上代码好了,首先定义一个消息响应函数,文本类消息我感兴趣的是 TEXT 和 SHARING 两类,使用 isGroupChat=True 指定消息来自于群聊,这个参数默认为 False.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
@itchat
.msg_register([TEXT, SHARING], isGroupChat
=
True
)
def
group_reply_text(msg):
# 获取群聊的ID,即消息来自于哪个群聊
# 这里可以把source打印出来,确定是哪个群聊后
# 把群聊的ID和名称加入groups
source
=
msg[
'FromUserName'
]
# 处理文本消息
if
msg[
'Type'
]
=
=
TEXT:
# 消息来自于需要同步消息的群聊
if
groups.has_key(source):
# 转发到其他需要同步消息的群聊
for
item
in
groups.keys():
if
not
item
=
=
source:
# groups[source]: 消息来自于哪个群聊
# msg['ActualNickName']: 发送者的名称
# msg['Content']: 文本消息内容
# item: 需要被转发的群聊ID
itchat.send(
'%s: %s\n%s'
%
(groups[source], msg[
'ActualNickName'
], msg[
'Content'
]), item)
# 处理分享消息
elif
msg[
'Type'
]
=
=
SHARING:
if
groups.has_key(source):
for
item
in
groups.keys():
if
not
item
=
=
source:
# msg['Text']: 分享的标题
# msg['Url']: 分享的链接
itchat.send(
'%s: %s\n%s\n%s'
%
(groups[source], msg[
'ActualNickName'
], msg[
'Text'
], msg[
'Url'
]), item)
|
再来处理下图片等多媒体类消息.
1
2
3
4
5
6
7
8
9
10
11
12
|
# 处理图片和视频类消息
@itchat
.msg_register([PICTURE, VIDEO], isGroupChat
=
True
)
def
group_reply_media(msg):
source
=
msg[
'FromUserName'
]
# 下载图片或视频
msg[
'Text'
](msg[
'FileName'
])
if
groups.has_key(source):
for
item
in
groups.keys():
if
not
item
=
=
source:
# 将图片或视频发送到其他需要同步消息的群聊
itchat.send(
'@%s@%s'
%
({
'Picture'
:
'img'
,
'Video'
:
'vid'
}.get(msg[
'Type'
],
'fil'
), msg[
'FileName'
]), item)
|
以上代码实现了对文本、分享、图片、视频四类消息的处理,如果对其他类型的消息也感兴趣,进行相应的处理即可。在前面补上 import 的代码,在后面补上登陆和运行的代码,就大功告成了.
成果展示 。
目前两个群之间可以进行消息同步了,一群和二群的小伙伴终于可以畅快地聊了起来(当群主不容易,经常要发很多红包 = =).
进一步工作 。
当然,我不可能一直在笔记本上运行这么个 py 代码,所以把它部署到服务器上运行就好了,开个 screen 或者用 IPython 都可以。如果账号偶尔下线了,再运行一下就好.
另外,我还写了个 API,响应消息的时候会把相应的数据 POST 到我的服务器并存到数据库,以供进一步的分析、统计和展示,这也是我身为一个群主应尽的职责~ 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://www.jianshu.com/p/7aeadca0c9bd 。
最后此篇关于python基于itchat实现微信群消息同步机器人的文章就讲到这里了,如果你想了解更多关于python基于itchat实现微信群消息同步机器人的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!