116 lines
4.6 KiB
Markdown
116 lines
4.6 KiB
Markdown
|
---
|
|||
|
title: 利用itchat定时转发微信消息
|
|||
|
date: 2019-03-23 19:48:46
|
|||
|
tags:
|
|||
|
- itchat
|
|||
|
- 微信
|
|||
|
categories:
|
|||
|
- 杂七杂八
|
|||
|
---
|
|||
|
我们实验室有个光荣传统,每天早上起床叫醒我的不是闹钟,而是群里雷打不动的安全新闻(其实我免提醒了2333)
|
|||
|
而这个发送新闻的人,一代一代的传承,我没想到竟然有一天会落在我头上,哭了o(╥﹏╥)o
|
|||
|
为了不暴露我的起床时间,同时能保质保量的完成任务,我决定做个机器人帮我完成。
|
|||
|
这就是这片po文的由来啦!
|
|||
|
# 大杀器itchat
|
|||
|
## introduction
|
|||
|
先来一段[itchat](https://itchat.readthedocs.io/zh/latest/)的官方介绍吧
|
|||
|
>itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。
|
|||
|
>使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人。
|
|||
|
>当然,该api的使用远不止一个机器人,更多的功能等着你来发现,比如这些。
|
|||
|
>该接口与公众号接口itchatmp共享类似的操作方式,学习一次掌握两个工具。
|
|||
|
>如今微信已经成为了个人社交的很大一部分,希望这个项目能够帮助你扩展你的个人的微信号、方便自己的生活。
|
|||
|
|
|||
|
实际上,itchat是对微信网页端的爬虫,所以,网页端可以实现的功能都有,那么,我想要的定时群发微信消息,自然不在话下!
|
|||
|
|
|||
|
## 初步尝试
|
|||
|
- 安装
|
|||
|
```
|
|||
|
pip install itchat
|
|||
|
```
|
|||
|
- 一个简单实例:实现给文件传输助手发送消息
|
|||
|
|
|||
|
```
|
|||
|
import itchat
|
|||
|
itchat.auto_login()
|
|||
|
itchat.send('Hello, filehelper', toUserName='filehelper')
|
|||
|
```
|
|||
|
|
|||
|
# 实现定时转发
|
|||
|
这个的实现需要注册msg_register,逻辑很简单,当收到指定群里的指定消息时,将消息转发到另一个群。
|
|||
|
```
|
|||
|
import itchat
|
|||
|
from datetime import datetime
|
|||
|
import time
|
|||
|
import re
|
|||
|
import threading
|
|||
|
from itchat.content import TEXT
|
|||
|
from itchat.content import *
|
|||
|
from apscheduler.schedulers.blocking import BlockingScheduler
|
|||
|
|
|||
|
@itchat.msg_register([TEXT], isFriendChat=True, isGroupChat=True, isMpChat=True)
|
|||
|
def getContent(msg):
|
|||
|
global g_msg
|
|||
|
groups = itchat.get_chatrooms(update = True)
|
|||
|
for g in groups:
|
|||
|
#print(g['NickName'])
|
|||
|
if g['NickName'] == '被转发的群名':
|
|||
|
from_group = g['UserName']
|
|||
|
if '每日安全简讯' in msg['Content']:
|
|||
|
print("get message from " + msg['FromUserName'])
|
|||
|
if msg['FromUserName'] == from_group:
|
|||
|
g_msg = msg['Content']
|
|||
|
print('成功获得群消息,等待转发')
|
|||
|
print(int(time.strftime("%H%M%S")))
|
|||
|
while(1):
|
|||
|
if int(time.strftime("%H%M%S")) > 80000:
|
|||
|
SendMessage(g_msg,'发送的对象群名')
|
|||
|
g_msg = ''
|
|||
|
break
|
|||
|
|
|||
|
def SendMessage(context,gname):
|
|||
|
itchat.get_chatrooms(update = True)
|
|||
|
users = itchat.search_chatrooms(name=gname)
|
|||
|
userName = users[0]['UserName']
|
|||
|
itchat.send_msg(context,toUserName=userName)
|
|||
|
print("\n发送时间: " + datetime.now().strftime("%Y-%m-%d %H:%M:%S") + "\n" "发送到:" + gname + "\n" + "发送内容:" + context + "\n")
|
|||
|
print("*********************************************************************************")
|
|||
|
|
|||
|
if __name__ == '__main__':
|
|||
|
itchat.auto_login(hotReload=True,enableCmdQR=2)
|
|||
|
itchat.run(blockThread=False)
|
|||
|
```
|
|||
|
|
|||
|
# 添加周期防掉线
|
|||
|
据说每三十分钟发送一次消息可防止网页端微信掉线~~
|
|||
|
```
|
|||
|
def loop_send():
|
|||
|
nowTime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|||
|
context = '现在是北京时间 :\n'+ nowTime +'\n\n我们还活着'
|
|||
|
itchat.get_chatrooms(update = True)
|
|||
|
users = itchat.search_friends(name=u'chengkun')
|
|||
|
userName = users[0]['UserName']
|
|||
|
itchat.send_msg(context,toUserName=userName)
|
|||
|
|
|||
|
if __name__ == '__main__':
|
|||
|
sched = BlockingScheduler()
|
|||
|
sched.add_job(loop_send,'interval',minutes=30)
|
|||
|
sched.start()
|
|||
|
```
|
|||
|
|
|||
|
# 把程序放在服务器上
|
|||
|
我是在腾讯云有个服务器,因为自己的电脑不可能时时刻刻开机,所以就放在服务器上,方法是:
|
|||
|
```
|
|||
|
sudo nohup python -u auto_Send.py >> auto_Send.log 2>&1 &
|
|||
|
```
|
|||
|
- 使用nohup可以让程序在后台运行
|
|||
|
- 然后将日志输出到auto_Send.log,方便我们后期出bug了排错
|
|||
|
- -u可以防止输出到python缓冲区
|
|||
|
|
|||
|
# 遇到的坑
|
|||
|
## 线程阻塞问题
|
|||
|
这里有两个线程,一个是定时转发,一个是循环发送,因此要设置为itchat.run(blockThread=False)以及sched = BlockingScheduler()否则会卡在某个方法。
|
|||
|
## 找不到群组
|
|||
|
这是因为users = itchat.search_chatrooms(name=gname),在搜索的是你保存到通讯录的群组。
|
|||
|
## 二维码显示不全
|
|||
|
itchat.auto_login(hotReload=True,enableCmdQR=2),需要设置为2
|