Введение в эту статью
Я давно не обновлял статью, потому что недавно спешил с вводной книгой по Py, а сегодня случайно выгнал эту статью. И многие дети, присоединившиеся к группе, интересовались, как построить робота WeChat, поэтому эта глава была опубликована. Есть три практических примера: регулярная отправка информации, интеграция Turing API для реализации чат-бота и реализация анти-снятия средств WeChat, чего в принципе достаточно для игры. Кроме того, WeChat пересмотрел веб-страницу, и многие интерфейсы стали непригодными для использования, например объединение людей в группы, доступ к которым можно получить через службы специальных возможностей или Xposed, чтобы решить, как играть, можно обратиться к предыдущей главе, спасибо.
21 января 2011 года WeChat запустил первую официальную версию, и с тех пор прошло 7 лет. От того, что вначале было плохо видно, до нынешнего числа пользователей, превышающего 1 миллиард, повседневная жизнь общества становится все более неотделимой от WeChat. Жизнь коротка, я использую Python, есть ли способ использовать Python, чтобы обеспечить нам удобство использования WeChat? Ответ определенно да.На Github есть библиотека с открытым исходным кодом WeChat, основанная на интерфейсе веб-интерфейса WeChat:itchat, вы можете легко реализовать робота WeChat с помощью десятков строк кода. В этой главе мы узнаем об этой библиотеке, а затем воспользуемся тремя практическими примерами, которые помогут вам поиграть с этой библиотекой.
19.1 Подробное описание библиотеки itchat
Давайте следовать документации, чтобы интерпретировать использование библиотеки itchat.
19.1.1 Документация и установка
Адрес склада itchat:GitHub.com/little co второй… официальная документация:itchat.readthedocs.io
Установка также очень проста, вы можете установить ее напрямую через команду pip, команда выглядит следующим образом:
pip install itchat
19.1.2 Простой пример использования
На простом примере позвольте читателю убедиться, насколько просто написать робота WeChat через itchat.Функции кода: После сканирования кода для входа в систему отправьте сообщение файловому помощнику, отслеживайте полученную информацию о файле и распечатывайте ее.Конкретный код выглядит следующим образом.
import itchat
import time
@itchat.msg_register(itchat.content.TEXT)
def reply_msg(msg):
print("收到一条信息:",msg.text)
if __name__ == '__main__':
itchat.auto_login()
time.sleep(5)
itchat.send("文件助手你好哦", toUserName="filehelper")
itchat.run()
результат выполнения кода:
Сначала появится изображение QR-кода.После сканирования вы войдете в WeChat на веб-странице.Через некоторое время файловый помощник получит информацию, показанную на рисунке 19.1.
Рисунок 19.1 Информация, полученная помощником по передаче файлов
Затем используйте другую учетную запись, чтобы отправить сообщение на эту учетную запись, и консоль распечатает полученное сообщение.
Getting uuid of QR code.
Downloading QR code.
Please scan the QR code to log in.
Please press confirm on your phone.
Loading the contact, this may take a little while.
TERM environment variable not set.
Login successfully as Robot Pig
Start auto replying.
收到一条信息: 你好
С помощью приведенных выше 8 строк эффективного кода реализован простой человек с навыками, крутой или нет.С этой идеей мы можем расширить, например, добавить функцию автоматического ответа, например, когда кто-то отправляет вам сообщение, когда вы заняты, автоматический ответ: "я занят, отвечу позже" и т.д.
19.2 Примечания по использованию itchat
Прежде чем подробно изучить использование itchat, позвольте читателю сказать кое-что, на что следует обратить внимание.
(1) itchat не является библиотекой, официально предоставляемой WeChat, а это означает, что использование этой библиотеки сопряжено с риском.Труба автора является микроконвертом в течение определенного периода времени, и вход в WeChat на веб-странице запрещен. , но мобильные и компьютерные клиенты по-прежнему могут нормально использоваться.Действие WeChat направлено на то, чтобы заблокировать распространение роботов для микробизнеса. (2) Как уменьшить вероятность быть заблокированным: не отправлять сообщения слишком часто, не отправлять слишком много повторных сообщений, старайтесь как можно реже вызывать интерфейс добавления людей; (3) Как разблокировать после блокировки: После блокировки нет возможности найти вход в обращение, поэтому я могу разблокировать его только наугад.После того, как неделю настаивал на чате по мобильному телефону, и комментировал круг друзей я вдруг разблокировал. (4) WeChat медленно сужает функции веб-страницы, а это означает, что некоторые интерфейсы будут постепенно выходить из строя, например, интерфейс для перетаскивания людей в групповые чаты, который раньше работал, теперь не будет работать. Если вы не получили ожидаемого результата при вызове интерфейса, возможно, интерфейс недействителен.Вы можете перейти на официальный склад, чтобы найти связанные проблемы. (5) WeChat поддерживает только вход в систему с двумя терминалами.Если вы не используете черную технологию, вы можете добавить веб-страницу или ПК-клиент в мобильный терминал. (6) Недавно зарегистрированные учетные записи WeChat не могут войти в систему с помощью веб-версии.
Наконец, я хотел бы поблагодарить авторов открытого исходного кода за их самоотверженную работу.
19.3 Подробное использование itchat
Без риса умнице сложно готовить.Прежде чем расширять,пройдите документ с автором и почти разберитесь,а потом начинайте расширять,чтобы эффективность была намного выше.
19.3.1 Вход в систему
пройти при входеitchat.auto_login()сделанная этой функцией,без параметровВ этом случае будет создан файл изображения QR-кода, который вы сможете отсканировать и войти в систему. Вообще говоря, наш компьютер будет выключен.Если роботу нужно быть онлайн в течение длительного времени, мы можем повесить скрипт на сервер и запустить его на 24 часа.Однако общий облачный сервер не имеет интерфейса и управляется через командной строке терминала. Это когда вы можете добавитьenableCmdQR=Trueдля отображения QR-кода в командной строке.В других системах может быть другая ширина символов, как показано на рисунке 19.2, которую можно настроить, назначив enableCmdQR определенному множителю.
Рисунок 19.2 Расположение QR-кода командной строки
Например, после enableCmdQR=2 изображение QR-кода показано на рис. 19.3.
Рис. 19.3 Обычное изображение QR-кода после настройки
После сканирования кода для входа, если вы хотите временно сохранить статус входа после выхода из программы, вы можете добавить параметры без сканирования кода при повторном запуске программы.hotReload=True.
19.3.2 Выход
Если параметр hotReload=True не установлен при запуске, программа автоматически отключится через некоторое время после выхода.Если вы хотите выйти быстро, вы можете вызвать **itchat.logout()**, чтобы выйти из состояния входа в систему. Кроме того, иногда мы можем захотеть выполнить некоторые операции после успешного входа в систему или выхода из системы.Мы можем добавить два параметра метода loginCallback и exitCallback при вызове входа в систему.Простой пример выглядит следующим образом:
import itchat
import time
def after_login():
print("登录后调用")
def after_logout():
print("退出后调用")
if __name__ == '__main__':
itchat.auto_login(loginCallback=after_login, exitCallback=after_logout)
time.sleep(5)
itchat.logout()
Результат выполнения кода следующий:
Getting uuid of QR code.
Downloading QR code.
Please scan the QR code to log in.
Please press confirm on your phone.
Loading the contact, this may take a little while.
登录后调用
退出后调用
19.3.3 Поиск пользователей
itchat предоставляет четыре метода поиска для поиска пользователей,
(1)Получите собственную информацию о пользователеПример выглядит следующим образом:
# 获取自己的用户信息,返回自己的属性字典
result = itchat.search_friends()
print(result)
Результат выполнения кода следующий:
{'MemberList': <ContactList: []>, 'UserName': '@299f59697878267efb48e8cad07xxxxcadd0efbb63xxxxxxx0964c51f028e8474', 'City': '', 'DisplayName': '', 'PYQuanPin': '', 'RemarkPYInitial': '', 'Province': '', 'KeyWord': '', 'RemarkName': '', 'PYInitial': '', 'EncryChatRoomId': '', 'Alias': '', 'Signature': '(´v`o)♡', 'NickName': 'Robot Pig', 'RemarkPYQuanPin': '', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=1663312400&username=@299f59697878267efb48e8cad07f5f1cadd0efbb63ae19610964c51f028e8474&skey=@crypt_2d4a1972_5e7829c893346a53135fb03affa39f9c', 'UniFriend': 0, 'Sex': 2, 'AppAccountFlag': 0, 'VerifyFlag': 0, 'ChatRoomId': 0, 'HideInputBarFlag': 0, 'AttrStatus': 0, 'SnsFlag': 1, 'MemberCount': 0, 'OwnerUin': 0, 'ContactFlag': 0, 'Uin': 3454488193, 'StarFriend': 0, 'Statues': 0, 'WebWxPluginSwitch': 0, 'HeadImgFlag': 1}
(2)Запрос пользователя по нику, пример кода выглядит следующим образом:
# 根据姓名查找用户
result = itchat.search_friends(name='培杰')
print(result)
Результат выполнения кода следующий:
[<User: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@xxb096c3036543exx2d4de4fc222xxxx', 'NickName': '培杰', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=625711027&username=@40b096c3036543e5b2d4de4fc22208ed&skey=@crypt_2d4a1972_ac0122b1740b332921afc9f2fffa546f', 'ContactFlag': 3, 'MemberCount': 0, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 1, 'Signature': 'Expectation is the root of all heartache.', 'VerifyFlag': 0, 'OwnerUin': 0, 'PYInitial': 'PJ', 'PYQuanPin': 'peijie', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 33783847, 'Province': '广东', 'City': '江门', 'Alias': '', 'SnsFlag': 17, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': 'zpj', 'EncryChatRoomId': '', 'IsOwner': 0}>]
(3)Поиск пользователей по WeChat ID, пример кода выглядит следующим образом:
# 根据微信号查找用户
result = itchat.search_friends(wechatAccount='zpj779878443')
print(result)
Результат выполнения кода следующий:
[<User: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@xxb096c3036543exx2d4de4fc222xxxx', 'NickName': '培杰', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=625711027&username=@40b096c3036543e5b2d4de4fc22208ed&skey=@crypt_2d4a1972_ac0122b1740b332921afc9f2fffa546f', 'ContactFlag': 3, 'MemberCount': 0, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 1, 'Signature': 'Expectation is the root of all heartache.', 'VerifyFlag': 0, 'OwnerUin': 0, 'PYInitial': 'PJ', 'PYQuanPin': 'peijie', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 33783847, 'Province': '广东', 'City': '江门', 'Alias': '', 'SnsFlag': 17, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': 'zpj', 'EncryChatRoomId': '', 'IsOwner': 0}>]
Кроме того, одновременно можно использовать 2 и 3 функции, напримерitchat.search_friends(name='Peijie', wechatAccount='zpj779878443')
(4)Поиск пользователей по имени пользователя, которое является полем UserName, за которым следует возвращаемый результат выше, строка таких вещей, как @xxxx, пример кода выглядит следующим образом:
# 根据UserName查找用户
result = itchat.search_friends(userName='@xxb096c3036543exx2d4de4fc222xxxx')
print(result)
Результат выполнения кода следующий:
[<User: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@xxb096c3036543exx2d4de4fc222xxxx', 'NickName': '培杰', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=625711027&username=@xxb096c3036543exx2d4de4fc222xxxx&skey=@crypt_2d4a1972_ac0122b1740b332921afc9f2fffa546f', 'ContactFlag': 3, 'MemberCount': 0, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 1, 'Signature': 'Expectation is the root of all heartache.', 'VerifyFlag': 0, 'OwnerUin': 0, 'PYInitial': 'PJ', 'PYQuanPin': 'peijie', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 33783847, 'Province': '广东', 'City': '江门', 'Alias': '', 'SnsFlag': 17, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': 'zpj', 'EncryChatRoomId': '', 'IsOwner': 0}>]
19.3.4 Отправка информации
itchat предоставляет несколько функций для отправки разного типа информации.Причина отсутствия отправки голоса в том, что в веб-версии нет этого интерфейса, который можно вызвать Функция показана в таблице 19.1.
Имя функции | эффект |
---|---|
send_msg() | отправить текстовое сообщение |
send_file() | Отправить файлы |
send_video() | отправить видео |
send_image() | отправить фотографии |
Используйте пример кода следующим образом:
import itchat
import time
def after():
user_info = itchat.search_friends(name='培杰')
if len(user_info) > 0:
# 拿到用户名
user_name = user_info[0]['UserName']
# 发送文字信息
itchat.send_msg('培杰你好啊!', user_name)
# 发送图片
time.sleep(10)
itchat.send_image('cat.jpg', user_name)
# 发送文件
time.sleep(10)
itchat.send_file('19_2.py', user_name)
# 发送视频
time.sleep(10)
itchat.send_video('sport.mp4', user_name)
if __name__ == '__main__':
itchat.auto_login(loginCallback=after)
itchat.run()
Результат выполнения кода следующий:
19.2.4 Информация мониторинга
В дополнение к активной отправке информации он также может отслеживать информацию и поддерживает мониторинг различных типов информации, как показано в таблице 19.2. Кроме того, существует мониторинг множественной регистрационной информации, приоритет информации, зарегистрированной позже, выше, чем информации, зарегистрированной первой, а информация с параметрами выше, чем информация без параметров.
тип информации | объяснять |
---|---|
itchat.content.TEXT | текстовое содержание |
itchat.content.MAP | текст позиции |
itchat.content.Card | визитная карточка |
itchat.content.Note | текст уведомления |
itchat.content.Sharing | поделиться именем |
itchat.content.RECORDING | запись |
itchat.PICTURE | изображение/выражение |
itchat.content.VOICE | запись |
itchat.content.ATTACHMENT | Приложение |
itchat.content.VIDEO | короткое видео |
itchat.content.FRIENDS | приглашение друга |
itchat.content.SYSTEM | системное сообщение |
Пример кода, который прослушивает текстовые сообщения и отвечает на них, выглядит следующим образом:
import itchat
@itchat.msg_register(itchat.content.TEXT)
def reply_msg(msg):
if msg['Content'] == u'你好':
itchat.send_msg(msg['User']['NickName'] + "你好啊!", msg['FromUserName'])
if __name__ == '__main__':
itchat.auto_login()
itchat.run()
Результат выполнения кода следующий:
19.2.5 Групповой чат
После доработки веб-страницы WeChat интерфейсы для создания групповых чатов, объединения людей в группы и удаления групповых чатов больше не доступны.Теперь вы можете использовать itchat для поиска групповых чатов, отправки сообщений в групповые чаты и мониторинга информации группового чата. . , используя следующий пример кода:
import itchat
import time
@itchat.msg_register(itchat.content.TEXT, isGroupChat=True)
def reply_msg(msg):
print("收到一条群信息:", msg['ActualNickName'], msg['Content'])
def after_login():
# 获得完整的群聊列表
print("完整的群聊列表如下:")
print(itchat.get_chatrooms())
# 查找特定群聊
time.sleep(10)
# 通过群聊名查找
chat_rooms = itchat.search_chatrooms(name='小猪的Python学习交流群')
if len(chat_rooms) > 0:
itchat.send_msg('测试', chat_rooms[0]['UserName'])
if __name__ == '__main__':
itchat.auto_login(loginCallback=after_login)
itchat.run()
Результат выполнения кода следующий:
完整的群聊列表如下:
[<Chatroom: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@@60dc5027bbbb83d532aa633b8d126szcf497a98ceea5c098d2c65f0932139b88', 'NickName': '湖北人在深圳90后', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgetheadimg?seq=625714901&username=@@60dc502769a783d532aa633b8d126190f497a98ceea5c098d2c65f0932139b88&skey=@crypt_2d4a1972_ea00536c8ac4e35fae1c2a1c48dfe40d', 'ContactFlag': 3, 'MemberCount': 82, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 0, 'Signature': '', 'VerifyFlag': 0, 'OwnerUin': 0, 'PYInitial': 'HBRZSZ90H', 'PYQuanPin': 'hubeirenzaishenzhen90hou', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 0, 'Province': '', 'City': '', 'Alias': '', 'SnsFlag': 0, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': '', 'EncryChatRoomId': '', 'IsOwner': 0, 'IsAdmin': None, 'Self': <User: {'MemberList': <ContactList: []>, 'UserName': '@29b9cb6386352503319f411754e7424e383ae09e50a224feca754a4516db6a13', 'City': '', 'DisplayName': '', 'PYQuanPin': '', 'RemarkPYInitial': '', 'Province': '', 'KeyWord': '', 'RemarkName': '', 'PYInitial': '', 'EncryChatRoomId': '', 'Alias': '', 'Signature': '(´v`o)♡', 'NickName': 'Robot Pig', 'RemarkPYQuanPin': '', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=275167114&username=@29b9cb6386352503319f411754e7424e383ae09e50a224feca754a4516db6a13&skey=@crypt_2d4a1972_ea00536c8ac4e35fae1c2a1c48dfe40d', 'UniFriend': 0, 'Sex': 2, 'AppAccountFlag': 0, 'VerifyFlag': 0, 'ChatRoomId': 0, 'HideInputBarFlag': 0, 'AttrStatus': 0, 'SnsFlag': 1, 'MemberCount': 0, 'OwnerUin': 0, 'ContactFlag': 0, 'Uin': 3454488193, 'StarFriend': 0, 'Statues': 0, 'WebWxPluginSwitch': 0, 'HeadImgFlag': 1}>}> 内容过多省略... ]
收到一条群信息: 培杰 123
收到一条群信息: 培杰 你好
Скриншот истории чата:
Кроме того, кроме поиска по названию группы, групповые чаты также можно искать поusernameнайти или использовать оба вместе; в msg естьisAtполе, которое можно использовать для определения того, был ли кто-то @@.
19.2.6 Официальный аккаунт
Метод использования очень похож на групповые чаты, метод поиска публичных номеровsearch_mps, отслеживать информацию об общедоступной учетной записи, чтобы добавитьisMpChat=Trueэлемент, используйте следующий пример кода:
import itchat
@itchat.msg_register(itchat.content.TEXT, isMpChat=True)
def reply_msg(msg):
print("收到一条公众号信息:", msg['User']['NickName'], msg['Content'])
def login_after():
mps = itchat.search_mps(name='CoderPig')
if len(mps) > 0:
print(mps)
itchat.send_msg('人生苦短', toUserName=mps[0]['UserName'])
if __name__ == '__main__':
itchat.auto_login(loginCallback=login_after)
itchat.run()
Результат выполнения кода следующий:
[<MassivePlatform: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@07585e92f75be7320e49627cf0c3ad43', 'NickName': 'CoderPig', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=610904174&username=@07585e92f75be7320e49627cf0c3ad43&skey=@crypt_2d4a1972_bc443bf966f94fa11f2db8f812e456cf', 'ContactFlag': 3, 'MemberCount': 0, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 0, 'Signature': '一枚咸鱼Android开发,会点Python,分享点学习经验,总结,鸡汤,读书笔记,生活技巧', 'VerifyFlag': 8, 'OwnerUin': 0, 'PYInitial': 'CODERPIG', 'PYQuanPin': 'CoderPig', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 0, 'Province': '广东', 'City': '深圳', 'Alias': '', 'SnsFlag': 0, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': 'gh_', 'EncryChatRoomId': '', 'IsOwner': 0}>]
收到一条公众号信息: CoderPig 我用Python
Скриншот истории чата:
19.3 Практический пример: синхронизация отправки сообщений
Операция регулярной отправки сообщений очень удобна в повседневной жизни, например, поздравление с днем рождения или праздником другим и отправка их вовремя в 12 часов вечера Скрипт для регулярной отправки сообщений. Здесь мы используем модуль задач планирования времени apscheduler, введите pip install apscheduler в командной строке, чтобы завершить установку. Подробно объясняться здесь не будет, если вам интересно, вы можете перейти к официальной документации, чтобы убедиться в этом самостоятельно:Планировщик точек доступа. ознакомьтесь с документом s.io/en/latest/u…Пример кода для отправки сообщений через равные промежутки времени выглядит следующим образом:
import itchat
from apscheduler.schedulers.blocking import BlockingScheduler
import time
# 发送信息
def send_msg():
user_info = itchat.search_friends(name='培杰')
if len(user_info) > 0:
user_name = user_info[0]['UserName']
itchat.send_msg('生日快乐哦!', toUserName=user_name)
def after_login():
sched.add_job(send_msg, 'cron', year=2018, month=7, day=28, hour=16, minute=5, second=30)
sched.start()
def after_logout():
sched.shutdown()
if __name__ == '__main__':
sched = BlockingScheduler()
itchat.auto_login(loginCallback=after_login, exitCallback=after_login)
itchat.run()
Результат выполнения кода следующий:
19.4 Практический пример: интеграция Turing API для создания чат-бота
Официальный сайт робота Тьюринга:Вуху. Turing123.com/member/RO Bo…После регистрации учетной записи нажмите, чтобы создать робота, появится панель, как показано на рисунке, и вы можете настроить ее по мере необходимости.
Обычная учетная запись может создать 5 ботов с 5000 бесплатных звонков в день. Нажмите на только что созданного робота, Он войдет в интерфейс, как показано на рисунке, нам нужно только сохранитьapikey, ключ, используемый для вызова интерфейса.
Нажмите на документ об использовании API внизу или откройте его напрямую.Woohoo. Видите лазейки. Talent/Turing/Web_…
{
"reqType":0,
"perception": {
"inputText": {
"text": "附近的酒店"
},
"inputImage": {
"url": "imageUrl"
},
"selfInfo": {
"location": {
"city": "北京",
"province": "北京",
"street": "信息路"
}
}
},
"userInfo": {
"apiKey": "",
"userId": ""
}
}
Мы можем использовать Postman для имитации запроса, чтобы увидеть, доступен ли интерфейс, сначала установите заголовок запроса:
Content-Type:application/json
Host:openapi.tuling123.com
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3486.0 Safari/537.36
Далее необходимо отправить данные:
{
"reqType":0,
"perception": {
"inputText": {
"text": "你好"
}
},
"userInfo": {
"apiKey": "7e9377d760274b3499f6dec8eed37bbb",
"userId": "123"
}
}
Взгляните на возвращенный результат:
{
"emotion": {
"robotEmotion": {
"a": 0,
"d": 0,
"emotionId": 0,
"p": 0
},
"userEmotion": {
"a": 0,
"d": 0,
"emotionId": 0,
"p": 0
}
},
"intent": {
"actionName": "",
"code": 10004,
"intentName": ""
},
"results": [
{
"groupType": 1,
"resultType": "text",
"values": {
"text": "我很好,你也要好好的"
}
}
]
}
Текст в возвращаемом результате, очевидно, то, что мы хотим. Весь процесс понятен. Затем мы пишем код. Процесс выглядит следующим образом:
(1) Отслеживайте сообщения WeChat. (2) Получать информацию и получать информационное содержание. (3) Вызовите интерфейс, получите результат запроса и извлеките возвращенный текст. (4) Верните извлеченный текст тому, кто отправил сообщение.
Конкретный код реализован следующим образом:
import itchat
import requests as rq
@itchat.msg_register(itchat.content.TEXT)
def reply_msg(msg):
info = msg['Content'].encode('utf8')
# 图灵API接口
api_url = 'http://openapi.tuling123.com/openapi/api/v2'
# 接口请求数据
data = {
"reqType": 0,
"perception": {
"inputText": {
"text": str(info)
}
},
"userInfo": {
"apiKey": "7e9377d76fc7ee9499f6dec8eed37bbb",
"userId": "123"
}
}
headers = {
'Content-Type': 'application/json',
'Host': 'openapi.tuling123.com',
'User-Agent': 'Mozilla/5.0 (Wi`ndows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3486.0 '
'Safari/537.36 '
}
# 请求接口
result = rq.post(api_url, headers=headers, json=data).json()
# 提取text,发送给发信息的人
itchat.send_msg(result['results'][0]['values']['text'], msg['FromUserName'])
print()
if __name__ == '__main__':
itchat.auto_login()
itchat.run()
Результат выполнения кода показан на следующем рисунке:
19.5 Практический пример: реализация защиты от вывода информации в Wechat
Робот Тьюринга выше иногда отвечает неправильно, особенно когда есть несколько раундов вопросов и ответов, хорошо общаться и играть. Далее нам нужно использовать itchat для написания скрипта для предотвращения вывода информации WeChat. Отправка информации при мониторинге пользователей или групповых чатов Если он будет отозван, отправьте нам отозванный контент через помощника по передаче файлов и опишите общий ход мыслей.
(1) Отслеживайте все записи чатов, включая групповые чаты, сохраняйте информацию в словаре и загружайте файлы ресурсов локально. (2) После отслеживания информации об изъятии, в соответствии с идентификатором отозванной информации, найдите соответствующую информацию в словаре и отправьте ее помощнику по работе с файлами. (3) Очищать данные кеша каждые пять минут.
Процесс кажется довольно простым, а затем мы немного рассмотрим реализацию.
19.5.1 Мониторинг полученных данных
Во-первых, это информация для мониторинга, и информация делится на чат друзей и групповой чат, Как насчет того, чтобы написать код для мониторинга полученных данных?
import itchat
from itchat.content import *
# 好友信息监听
@itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isFriendChat=True)
def handle_friend_msg(msg):
print("好友信息: ", msg)
# 群聊信息监听
@itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isGroupChat=True)
def information(msg):
print("群聊信息: ", msg)
if __name__ == '__main__':
itchat.auto_login()
itchat.run()
Отправьте сообщение роботу и отправьте сообщение в групповой чат, просмотрите содержимое распечатанного сообщения, сначала информацию о друзьях.
好友信息: {'MsgId': '5500935424291030814', 'FromUserName': '@8fd8b5b2bd0862ed5d0d573bc6c08362', 'ToUserName': '@913c3124d973db6ae25924bd0598b48a0028e0c2d01e18d8095cc6fd58db116b', 'MsgType': 1, 'Content': '123', 'Status': 3, 'ImgStatus': 1, 'CreateTime': 1533010285, 'VoiceLength': 0, 'PlayLength': 0, 'FileName': '', 'FileSize': '', 'MediaId': '', 'Url': '', 'AppMsgType': 0, 'StatusNotifyCode': 0, 'StatusNotifyUserName': '', 'RecommendInfo': {'UserName': '', 'NickName': '', 'QQNum': 0, 'Province': '', 'City': '', 'Content': '', 'Signature': '', 'Alias': '', 'Scene': 0, 'VerifyFlag': 0, 'AttrStatus': 0, 'Sex': 0, 'Ticket': '', 'OpCode': 0}, 'ForwardFlag': 0, 'AppInfo': {'AppID': '', 'Type': 0}, 'HasProductId': 0, 'Ticket': '', 'ImgHeight': 0, 'ImgWidth': 0, 'SubMsgType': 0, 'NewMsgId': 5500935424291030814, 'OriContent': '', 'EncryFileName': '', 'User': <User: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@8fd8b5b2bd0862ed5d0d573bc6c08362', 'NickName': 'CoderPig', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=625711027&username=@8fd8b5b2bd0862ed5d0d573bc6c08362&skey=@crypt_2d4a1972_26dc3be99a177455b82518b3ca6e6cc5', 'ContactFlag': 3, 'MemberCount': 0, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 1, 'Signature': '不服气,就用行动去证明,少说多做...2018.7.29', 'VerifyFlag': 0, 'OwnerUin': 0, 'PYInitial': 'CODERPIG', 'PYQuanPin': 'CoderPig', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 33783847, 'Province': '广东', 'City': '江门', 'Alias': '', 'SnsFlag': 17, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': 'zpj', 'EncryChatRoomId': '', 'IsOwner': 0}>, 'Type': 'Text', 'Text': '123'}
Проанализируйте данные, которые необходимо собрать,MsgId(Идентификация информации WeChat, используемой в качестве ключа),NickName(имя пользователя отправителя),Content(Информация),CreateTime(время создания),Type(тип информации). Затем идет информация о групповом чате:
群聊信息: {'MsgId': '3177606925001563512', 'FromUserName': '@@16521484d35b2fe9c953282d98ec4f11456607924b3a7cc6d7fb671fe7e3081c', 'ToUserName': '@913c3124d973db6ae25924bd0598b48a0028e0c2d01e18d8095cc6fd58db116b', 'MsgType': 1, 'Content': '嘿嘿', 'Status': 3, 'ImgStatus': 1, 'CreateTime': 1533010298, 'VoiceLength': 0, 'PlayLength': 0, 'FileName': '', 'FileSize': '', 'MediaId': '', 'Url': '', 'AppMsgType': 0, 'StatusNotifyCode': 0, 'StatusNotifyUserName': '', 'RecommendInfo': {'UserName': '', 'NickName': '', 'QQNum': 0, 'Province': '', 'City': '', 'Content': '', 'Signature': '', 'Alias': '', 'Scene': 0, 'VerifyFlag': 0, 'AttrStatus': 0, 'Sex': 0, 'Ticket': '', 'OpCode': 0}, 'ForwardFlag': 0, 'AppInfo': {'AppID': '', 'Type': 0}, 'HasProductId': 0, 'Ticket': '', 'ImgHeight': 0, 'ImgWidth': 0, 'SubMsgType': 0, 'NewMsgId': 3177606925001563512, 'OriContent': '', 'EncryFileName': '', 'ActualNickName': '易♂建♂联', 'IsAt': False, 'ActualUserName': '@8fd8b5b2bd0862ed5d0d573bc6c08362', 'User':
Аналогичным образом проанализируйте данные, которые необходимо собрать,MsgId(Идентификация информации WeChat),ActualNickName(имя группы отправителей),Content(Информация),CreateTime(время создания),Type(тип информации). Измените нашу программу, чтобы извлечь и распечатать их все.
import itchat
from itchat.content import *
# 好友信息监听
@itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isFriendChat=True)
def handle_friend_msg(msg):
msg_id = msg['MsgId']
msg_from_user = msg['User']['NickName']
msg_content = msg['Content']
msg_create_time = msg['CreateTime']
msg_type = msg['Type']
print("收到信息: ", msg_id, msg_from_user, msg_content, msg_create_time,msg_type)
# 群聊信息监听
@itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isGroupChat=True)
def information(msg):
msg_id = msg['MsgId']
msg_from_user = msg['ActualNickName']
msg_content = msg['Content']
msg_create_time = msg['CreateTime']
msg_type = msg['Type']
print("群聊信息: ",msg_id, msg_from_user, msg_content, msg_create_time,msg_type)
if __name__ == '__main__':
itchat.auto_login()
itchat.run()
Результат выполнения кода следующий:
群聊信息: 2254622820807367335 胡小韬 对手公司 1533023277 Text
群聊信息: 1765614482944449471 xia_ang 还有自干五 1533023285 Text
好友信息: 615083621872361432 CoderPig 哈哈 1533023293 Text
好友信息: 7292909308782687092 CoderPig 你好哦 1533023302 Text
19.5.2 Проверка различных типов информации и соответствующих методов обработки
Что ж, извлечение информации прошло успешно, следующее, что нужно проверить, это различные типы информации и соответствующие методы обработки, текст, изображение (выражение), аудио, видео, файл пять, последние четыре необходимо загрузить локально, предоставленный в itchat Способ скачивать файлы**msg['Text'](文件存储路径)
**, вызовите этот метод, чтобы завершить загрузку файла, измененный код выглядит следующим образом:
import itchat
from itchat.content import *
import os
import time
# 文件临时存储页
rec_tmp_dir = os.path.join(os.getcwd(), 'tmp/')
# 存储数据的字典
rec_msg_dict = {}
# 好友信息监听
@itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isFriendChat=True)
def handle_friend_msg(msg):
msg_id = msg['MsgId']
msg_from_user = msg['User']['NickName']
msg_content = ''
# 收到信息的时间
msg_time_rec = time.strftime("%Y-%m-%d %H:%M%S", time.localtime())
msg_create_time = msg['CreateTime']
msg_type = msg['Type']
if msg['Type'] == 'Text':
msg_content = msg['Content']
elif msg['Type'] == 'Picture' \
or msg['Type'] == 'Recording' \
or msg['Type'] == 'Video' \
or msg['Type'] == 'Attachment':
msg_content = r"" + msg['FileName']
msg['Text'](rec_tmp_dir + msg['FileName'])
rec_msg_dict.update({
msg_id: {
'msg_from_user': msg_from_user,
'msg_time_rec': msg_time_rec,
'msg_create_time': msg_create_time,
'msg_type': msg_type,
'msg_content': msg_content
}
})
print(msg)
# 群聊信息监听
@itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isGroupChat=True)
def information(msg):
msg_id = msg['MsgId']
msg_from_user = msg['ActualNickName']
msg_content = ''
# 收到信息的时间
msg_time_rec = time.strftime("%Y-%m-%d %H:%M%S", time.localtime())
msg_create_time = msg['CreateTime']
msg_type = msg['Type']
if msg['Type'] == 'Text':
msg_content = msg['Content']
elif msg['Type'] == 'Picture' \
or msg['Type'] == 'Recording' \
or msg['Type'] == 'Video' \
or msg['Type'] == 'Attachment':
msg_content = r"" + msg['FileName']
msg['Text'](rec_tmp_dir + msg['FileName'])
rec_msg_dict.update({
msg_id: {
'msg_from_user': msg_from_user,
'msg_time_rec': msg_time_rec,
'msg_create_time': msg_create_time,
'msg_type': msg_type,
'msg_content': msg_content
}
})
print(msg)
if __name__ == '__main__':
if not os.path.exists(rec_tmp_dir):
os.mkdir(rec_tmp_dir)
itchat.auto_login()
itchat.run()
После выполнения кода протестируйте и отправьте различные файлы, чтобы увидеть, все ли они кэшированы, как показано на рисунке.
19.5.3 Мониторинг информации о снятии средств и извлечение данных
Затем для мониторинга изымаемой информации тип изымаемой информацииNOTE, давайте проследим за ним, чтобы увидеть конкретное содержание изъятой информации.
{'MsgId': '7399110162640182490', 'FromUserName': '@9c1a8bf4e28771a6b3ab635991dea2a1', 'ToUserName': '@49d1d90b90371099297a08da1009f3cdd042f21194239ef47b60e8f0b52e4553', 'MsgType': 10002, 'Content': '<sysmsg type="revokemsg"><revokemsg><session>zpj779878443</session><oldmsgid>1625723544</oldmsgid><msgid>3154925139554625499</msgid><replacemsg><![CDATA["CoderPig" 撤回了一条消息]]></replacemsg></revokemsg></sysmsg>', 'Status': 4, 'ImgStatus': 1, 'CreateTime': 1533103679, 'VoiceLength': 0, 'PlayLength': 0, 'FileName': '', 'FileSize': '', 'MediaId': '', 'Url': '', 'AppMsgType': 0, 'StatusNotifyCode': 0, 'StatusNotifyUserName': '', 'RecommendInfo': {'UserName': '', 'NickName': '', 'QQNum': 0, 'Province': '', 'City': '', 'Content': '', 'Signature': '', 'Alias': '', 'Scene': 0, 'VerifyFlag': 0, 'AttrStatus': 0, 'Sex': 0, 'Ticket': '', 'OpCode': 0}, 'ForwardFlag': 0, 'AppInfo': {'AppID': '', 'Type': 0}, 'HasProductId': 0, 'Ticket': '', 'ImgHeight': 0, 'ImgWidth': 0, 'SubMsgType': 0, 'NewMsgId': 7399110162640182490, 'OriContent': '', 'EncryFileName': '', 'User': <User: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@9c1a8bf4e28771a6b3ab635991dea2a1', 'NickName': 'CoderPig', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=625711027&username=@9c1a8bf4e28771a6b3ab635991dea2a1&skey=@crypt_2d4a1972_e0963a9b961045c2e06293043f1c98a8', 'ContactFlag': 3, 'MemberCount': 0, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 1, 'Signature': '不服气,就用行动去证明,少说多做...2018.7.29', 'VerifyFlag': 0, 'OwnerUin': 0, 'PYInitial': 'CODERPIG', 'PYQuanPin': 'CoderPig', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 33783847, 'Province': '广东', 'City': '江门', 'Alias': '', 'SnsFlag': 17, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': 'zpj', 'EncryChatRoomId': '', 'IsOwner': 0}>, 'Type': 'Note', 'Text': '"CoderPig" 撤回了一条消息'}
Первый заключается в том, чтобы судить о том, что системная информация удалила часть информации по умолчанию, содержание:
Отобразите информацию для оценки того, отозван ли он.Из приведенного выше вы можете увидеть такую строку:<![CDATA["CoderPig" 撤回了一条消息]]>
, нам нужно только написать обычное решение, чтобы увидеть, есть ли такой контент, есть ли напоминание о том, что он отозван, а затем найти отозванную информацию MsgId, которая находится перед приведенной выше строкой информации:<msgid>3154925139554625499</msgid>
, а также использовать обычное извлечение. Следующее, что нужно сделать, это взять MsgId для поиска в словаре сообщения, склейки текста или текста плюс файлы в соответствии с типом информации, а затем отправить его помощнику по передаче файлов. Конкретный код выглядит следующим образом:
@itchat.msg_register([NOTE], isFriendChat=True, isGroupChat=True)
def revoke_msg(msg):
if revoke_msg_compile.search(msg['Content']) is not None:
old_msg_id = extract_msgid_compile.search(msg['Content']).group(1)
old_msg = rec_msg_dict.get(old_msg_id, {})
# 先发送一条文字信息
itchat.send_msg(str(old_msg.get('msg_from_user') + "撤回了一条信息:"
+ old_msg.get('msg_content')), toUserName="filehelper")
# 判断文msg_content是否存在,不存在说明可能是
if os.path.exists(os.path.join(rec_tmp_dir, old_msg.get('msg_content'))):
if old_msg.get('msg_type') == 'Picture':
itchat.send_image(os.path.join(rec_tmp_dir, old_msg.get('msg_content')),
toUserName="filehelper")
elif old_msg.get('msg_type') == 'Video':
itchat.send_video(os.path.join(rec_tmp_dir, old_msg.get('msg_content')),
toUserName="filehelper")
elif old_msg.get('msg_type') == 'Attachment' \
or old_msg.get('msg_type') == 'Recording':
itchat.send_file(os.path.join(rec_tmp_dir, old_msg.get('msg_content')),
toUserName="filehelper")
После запуска теста отправьте информацию, а затем отозвайте ее, чтобы увидеть, подействует ли она.Результат теста показан на рисунке.
19.5.4 Регулярно очищайте кеш
Кроме того, наша информация хранится в словаре.Со временем данных будет много, и будет накапливаться все больше и больше файлов изображений.Мы можем добавить запланированное задание, например, очистка каждые пять минут.Время создания превышает 2 минуты информации и соответствующей документации. Соответствующий код выглядит следующим образом:
# 每隔五种分钟执行一次清理任务
def clear_cache():
# 当前时间
cur_time = time.time()
# 遍历字典,如果有创建时间超过2分钟(120s)的记录,删除,非文本的话,连文件也删除
for key in list(rec_msg_dict.keys()):
if int(cur_time) - int(rec_msg_dict.get(key).get('msg_create_time')) > 120:
if not rec_msg_dict.get(key).get('msg_type') == 'Text':
file_path = os.path.join(rec_tmp_dir, rec_msg_dict.get(key).get('msg_content'))
print(file_path)
if os.path.exists(file_path):
os.remove(file_path)
rec_msg_dict.pop(key)
# 开始轮询任务
def start_schedule():
sched.add_job(clear_cache, 'interval', minutes=2)
sched.start()
# 退出停止所有任务并清空缓存文件夹
def after_logout():
sched.shutdown()
shutil.rmtree(rec_tmp_dir)
if __name__ == '__main__':
sched = BlockingScheduler()
if not os.path.exists(rec_tmp_dir):
os.mkdir(rec_tmp_dir)
itchat.auto_login(exitCallback=after_logout)
itchat.run(blockThread=False)
start_schedule()
19.6 Резюме
В этой главе мы изучили библиотеку itchat, библиотеку с открытым исходным кодом для веб-интерфейса WeChat. Я полагаю, что благодаря трем практическим примерам кода у вас уже есть общее представление об этой библиотеке. Вы также можете настроить робота в соответствии со своими потребностями, такие как добавление автоматических ответов, пересылка конкретной информации для мониторинга и т. д. Кроме того, если вы хотите, чтобы ваш робот работал все время, вы можете развернуть скрипт на сервере для запуска.Подробности см. в главе, посвященной поисковым роботам.