简体中文
wechatircd внедряет JavaScript ( injector.js
) в wx.qq.com, который использует WebSocket для связи с IRC-сервером ( wechatircd.py
), тем самым позволяя IRC-клиентам, подключенным к серверу, отправлять и получать сообщения от WeChat, устанавливать темы, приглашать /удалить участников, ...
IRC WebSocket HTTPS
IRC client --- wechatircd.py --------- browser ----- wx.qq.com
injector.user.js
injector.js
Обсудите wechatircd, присоединившись к #wechatircd на freenode или к группе пользователей в Telegram. Видео об использовании WeChat в WeeChat
yaourt -S wechatircd-git
. Он сгенерирует самоподписанную пару ключ/сертификат CA /etc/wechatircd/ca.{cert,key}.pem
и пару ключ/сертификат {cert,key}.pem
(см. ниже)./etc/wechatircd/ca.cert.pem
в браузер (см. ниже).systemctl start wechatircd
, который запускает /usr/bin/wechatircd --http-cert /etc/wechatircd/cert.pem --http-key /etc/wechatircd/key.pem --http-root /usr/share/wechatircd
. Возможно, вы захотите настроить /etc/systemd/system/wechatircd.service
. wechatircd.py
(сервер) будет прослушивать 127.0.0.1:6667 (IRC) и 127.0.0.1:9000 (HTTPS + WebSocket через TLS).
Если вы запускаете сервер на другом компьютере, рекомендуется настроить IRC поверх TLS и пароль для подключения IRC с несколькими дополнительными параметрами: --irc-cert /path/to/irc.key --irc-key /path/to/irc.cert --irc-password yourpassword
. В качестве альтернативы паролю подключения IRC вы можете указать --sasl-password yourpassword
и выполнить аутентификацию с помощью SASL PLAIN. Вы можете повторно использовать сертификат + ключ HTTPS. Если вы используете WeeChat и вам сложно настроить действительный сертификат (gnutls проверяет имя хоста), введите в WeeChat следующие строки:
/set irc.server.wechat.ssl on
/set irc.server.wechat.ssl_verify off
/set irc.server.wechat.password yourpassword
pip install -r requirements.txt
openssl req -x509 -newkey rsa:2048 -sha256 -nodes -keyout ca.key.pem -out ca.cert.pem -days 9999 -subj ' /CN=127.0.0.1 '
openssl req -new -newkey rsa:2048 -sha256 -nodes -keyout key.pem -subj ' /CN=127.0.0.1 ' |
openssl x509 -req -out cert.pem -CAkey ca.key.pem -CA ca.cert.pem -set_serial 2 -days 9999 -extfile <(
printf " subjectAltName = IP:127.0.0.1, DNS:localhost " )
ca.cert.pem
в браузер../wechatircd.py --http-cert cert.pem --http-key key.pem
IP-адрес или имя домена, используемые для обслуживания injector.js
и injector.user.js
должны соответствовать полям subjectAlternativeName
. Начиная с версии 58, Chrome удалил поддержку сопоставления commonName
в сертификатах. Подробности см. на странице https://developers.google.com/web/updates/2017/03/chrome-58-deprecations#remove_support_for_commonname_matching_in_certificates.
Хром/Хром
chrome://settings/certificates
, импортируйте ca.cert.pem
, перейдите на вкладку Authorities
, выберите сертификат 127.0.0.1
, выберите «Правка» -> «Доверять этому сертификату» для идентификации веб-сайтов.127.0.0.1:9000
если вы хотите, чтобы wechatircd прослушивал другой адрес.Firefox
По умолчанию сервер обслуживает соединения injector.js
и WebSocket по адресу 127.0.0.1:9000, который можно переопределить с помощью --http-listen 0.0.0.0 --http-port 9000
.
Вы можете включить HTTPS двумя способами:
--http-cert cert.pem --http-key key.pem
чтобы wechatircd обслуживал HTTPS--http-cert --http-key
, чтобы wechatircd обслуживал HTTP, и используйте Nginx (с включенным HTTPS) в качестве обратного прокси-сервера. В этом случае вам необходимо передать Host:
в wechatircd ( proxy_set_header Host $http_host;
), поскольку он изменяет URL-адрес WebSocket, определенный в injector.js
в соответствии с Host:
указанным браузером. wechatircd.py
injector.run()
Вы автоматически присоединитесь к каналу +wechat
и найдете там свой список контактов. Доступны некоторые команды:
help
eval
, оценивает выражение Python, например: eval server.nick2special_user
eval server.name2special_room
status
, показать контакты/каналыreload_contact __all__
, перезагрузить всю контактную информацию, если no such nick/channel
в privmsgСервер может быть привязан только к одной учетной записи wx.qq.com, однако к серверу может быть подключено более одного IRC-клиента.
#
.&
. Название канала генерируется из названия группы. SpecialChannel#update
+v
(голос, обычно отображается с префиксом +
). SpecialChannel#update_detail
!m line0nline1
!html line0<br>line1
nick0: nick1: test
будет преобразован в @GroupAlias0 @GroupAlias1 test
, где GroupAlias0
— это My Alias in Group
/ Name
в профиле/ WeChat ID
, установленный этим пользователем. Он соответствует On-screen names
в мобильном приложении.@1234 !m multinlinenreply
, которое будет отправлено как 「Re GroupAlias: text」text
!m @123456 multinlinenreply
@2 reply
--http-url https://127.0.0.1:9000
если вы хотите сократить URL-адреса мультимедиа до https://127.0.0.1:9000/media/0
!m
, @3
, nick:
можно располагать в любом порядке.
Что касается WeeChat, его механизм защиты от флуда предотвратит отправку двух пользовательских сообщений на IRC-сервер одновременно. Отключите защиту от флуда, чтобы включить обнаружение вставки.
/set irc.server.wechat.anti_flood_prio_high 0
расширение server-time
из IRC версии 3.1, 3.2. wechatircd.py
включает в сообщения метку времени (полученную из JavaScript), чтобы сообщить IRC-клиентам, что сообщение произошло в заданное время. См. http://ircv3.net/irc/. См. http://ircv3.net/software/clients.html для поддержки клиентов IRCv3.
Конфигурация для WeeChat:
/set irc.server_default.capabilities "account-notify,away-notify,cap-notify,multi-prefix,server-time,znc.in/server-time-iso,znc.in/self-message"
Поддерживаемые команды IRC:
/cap
, поддерживаемые возможности./dcc send $nick/$channel $filename
, отправить изображение или файл. Эта функция заимствует команду /dcc send
, которая хорошо поддерживается в клиентах IRC. См. https://en.wikipedia.org/wiki/Direct_Client-to-Client#DCC_SEND./invite $nick [$channel]
, пригласить контакт в группу./kick $nick
, удалить члена группы. Для этого вы должны быть лидером группы. Из-за дефекта веб-клиента вы можете не получать уведомления о смене участников./kill $nick [$reason]
, закрывает соединение этого клиента/list
, список групп./mode +m
, нет повторного подключения в --join new
режиме. /mode -m
для возврата./motd
, просмотрите последние 5 коммитов этого репозитория/names
, обновить ники на канале./part [$channel]
больше не получать сообщения с канала. Он просто заимствует команду /part
и не покидает группу./query $nick
, открыть окно чата с $nick
./squit $any
, выйти из системы/summon $nick $message
,добавить контакт./topic topic
— изменить тему группы. Поскольку IRC не поддерживает переименование канала, вы покинете канал со старым названием и присоединитесь к каналу с новым именем./who $channel
, см. список участников.MSGTYPE_TEXT
,текст или приглашение на голосовой/видеовызовMSGTYPE_IMG
,изображение, отображается как [Image] $url
MSGTYPE_VOICE
,аудио, отображается как [Voice] $url
MSGTYPE_VIDEO
,видео, отображается как [Video] $url
MSGTYPE_MICROVIDEO
,микровидео?,отображается как [MicroVideo] $url
MSGTYPE_APP
,статьи из учетных записей подписки, Red Packet, URL, ..., отображаются как [App] $title $url
Смайлы QQ отображаются как <img class="qqemoji qqemoji0" text="[Smile]_web" src="/zh_CN/htmledition/v2/images/spacer.gif">
, [Smile]
в отправленных сообщениях будет заменена на смайлик .
Эмодзи отображаются как <img class="emoji emoji1f604" text="_web" src="/zh_CN/htmledition/v2/images/spacer.gif">
. Каждый смайлик будет преобразован в один символ перед доставкой клиенту IRC. Эмодзи могут перекрываться, поскольку эмуляторы терминала могут не знать, что эмодзи имеют ширину 2, см. раздел «Эмодзи в формате Emoji».
--config
, короткая опция -c
, путь к файлу конфигурации, см. конфигурацию--http-cert cert.pem
, сертификат TLS для HTTPS/WebSocket. Вы можете объединить сертификат+ключ, указать один файл PEM и опустить --http-key
. Используйте HTTP, если не указаны ни --http-cert
, ни --http-key
.--http-key key.pem
, ключ TLS для HTTPS/WebSocket--http-listen 127.1 ::1
, измените адрес прослушивания HTTPS/WebSocket на 127.1
и ::1
, переопределив --listen
--http-port 9000
, измените порт прослушивания HTTPS/WebSocket на 9000--http-root .
, корневой каталог для обслуживания injector.js
--http-url https://127.0.0.1:9000
, если указано, отображать медиа-ссылки как https://127.0.0.1:9000/document/$id ; если нет, https://wx.qq.com/cgi-bin/...
--ignore '&fo[o]' '&bar'
, не присоединяться автоматически к каналам, имена которых (сгенерированные из имени группы) частично соответствуют регулярному выражению &fo[o]
или &bar
--ignore-display-name 'fo[o]' bar
, короткая опция -I
, не присоединяться автоматически к каналам, имя группы которых частично соответствует регулярному выражению fo[o]
или bar
--ignore-brand
, игнорировать сообщения от учетных записей подписки ( MM_USERATTRVERIFYFALG_BIZ_BRAND
)--irc-cert cert.pem
, сертификат TLS для IRC через TLS. Вы можете объединить сертификат+ключ, указать один файл PEM и опустить --irc-key
. Используйте простой IRC, если не указаны ни --irc-cert, ни --irc-key.--irc-key key.pem
, ключ TLS для IRC через TLS.--irc-listen 127.1 ::1
, измените адрес прослушивания IRC на 127.1
и ::1
, переопределив --listen
.--irc-nicks ray ray1
, уважаемые ники для клиентов. SpecialUser
не будет иметь этих ников.--irc-password pass
, установить пароль соединения для pass
.--irc-port 6667
, порт прослушивания IRC-сервера.-j
--join auto
, по умолчанию: присоединиться к каналу после получения первого сообщения, не возвращаться после отправки /part
и получать сообщения позже--join all
: присоединиться ко всем каналам--join manual
: нет автоматического соединения--join new
: аналогично auto
, но присоединяться снова, когда приходят новые сообщения, даже если после /part
--listen 127.0.0.1
, короткая опция -l
, измените адрес прослушивания IRC/HTTP/WebSocket на 127.0.0.1
.--logger-ignore '&test0' '&test1'
, список игнорируемых регулярных выражений, не регистрировать контакты/группы, имена которых частично совпадают--logger-mask '/tmp/wechat/$channel/%Y-%m-%d.log'
, формат имен файлов журналов--logger-time-format %H:%M
, формат времени записей журнала на стороне сервера--paste-wait 0.1
, строки будут удерживаться до 0,1 секунды перед отправкой, строки в этом интервале будут упакованы в многострочное сообщение--sasl-password pass
, установить пароль SASL для pass
.--special-channel-prefix
, варианты: &
, !
, #
, ##
, префикс для SpecialChannel. Quassel, похоже, не поддерживает каналы с префиксами &
, --special-channel-prefix '##'
чтобы сделать Quassel счастливым. См. wechatircd.service для получения шаблона /etc/systemd/system/wechatircd.service
.
injector.js
contactFactory#{addContact,deleteContact}
чтобы отслеживать изменения в контактах.CtrlServer#onmessage
, обрабатывает команды (текстовые/файловые сообщения, приглашение кого-либо в группу,...) с сервера.CtrlServer#seenLocalID
запрещает клиенту получать сообщения, отправленные им самим. wechatircd.py
.
├── Web HTTP(s)/WebSocket server
├── Server IRC server
├── Channel
│ ├── StandardChannel IRC channels
│ ├── StatusChannel `+wechat`
│ └── SpecialChannel WeChat groups
├── (User)
│ ├── Client IRC clients
│ ├── SpecialUser WeChat users
├── (IRCCommands)
│ ├── UnregisteredCommands available commands: CAP NICK PASS USER QUIT
│ ├── RegisteredCommands
Если вы не можете терпеть ежедневное сканирование QR-кодов на телефоне, см. раздел «IRC版微信和QQ:wechatircd、webqqircd».
UserName
некоторых специальных учетных записей не имеет префикса @
: newsapp,fmessage,filehelper,weibo,qqmail,fmessage
. UserName
стандартных учетных записей начинается с @
; UserName
в группах начинается с @@
. UserName
различаются в зависимости от сеанса. Uin
выглядит как уникальный идентификатор, но в большинстве случаев его значение равно 0. OwnerUin
группы — это Uin
владельцев, но в большинстве случаев Uin
равно 0.
Мой счет
angular . element ( document . body ) . scope ( ) . account
Список всех контактов
angular . element ( $ ( '#navContact' ) [ 0 ] ) . scope ( ) . allContacts
Удаление участника из группы
var injector = angular . element ( document ) . injector ( )
# 这里获取了chatroomFactory,还可用于获取其他factory、service、controller等
var chatroomFactory = injector . get ( 'chatroomFactory' )
# 设置其中的`room`与`userToRemove`
chatroomFactory . delMember ( room . UserName , userToRemove . UserName ) `
Отправить сообщение в текущий чат
angular . element ( 'pre:last' ) . scope ( ) . editAreaCtn = "Hello,微信" ;
angular . element ( 'pre:last' ) . scope ( ) . sendTextMessage ( ) ;
Если вы не можете терпеть ежедневное сканирование QR-кодов на телефоне, вы можете запустить браузер и wechatircd на сервере.
chromium --user-data-dir=$HOME/.config/chromium-wechatircd
и выполните вышеупомянутую настройку (сертификат для injector.js
, Tampermonkey, injector.user.js
), затем закройте браузер.xorg-server-xvfb
в Arch Linux)xvfb-run -n 99 chromium --user-data-dir=$HOME/.config/chromium-wechatircd https://wx.qq.com
DISPLAY=:99 import -window root /tmp/a.jpg && $your_image_viewer /tmp/a.jpg
, сделайте снимок экрана и отсканируйте QR-код с помощью мобильного приложения.Взаимодействовать с браузером можно с помощью VNC:
x11vnc -localhost -display :99
vncviewer localhost
Альтернативой является x2go, см. 无需每日扫码的IRC版微信和QQ:wechatircd、webqqircd.
В мобильном приложении On-screen Names
пользователей разрешаются в следующем порядке:
Set Remark and Tag
если они установлены.My Alias in Group
( Group Alias
), если установленName
в его профилеWeChat ID
Контактная информация указана в API-интерфейсах batchgetcontact
и webwxsync
. Сериализация JSON использует вводящие в заблуждение имена полей.
Друг WeChat в contactFactory#addContact
:
.Alias
: Name
в его/ее профиле..NickName
: WeChat ID
.RemarkName
: Set Remark and Tag
Друзья/неконтактные лица WeChat в .MemberList
:
.DisplayName
: My Alias in Group
.NickName
: Name
в его/ее профиле или WeChat ID
JSON для одного пользователя может возвращаться повторно, и все эти поля могут быть пустыми. Ники пользователей генерируются путем поиска первого непустого значения в следующих полях: .RemarkName
, .NickName
, .DisplayName
. Вы можете увидеть xx now known as yy
в вашем IRC-клиенте, если контакт в комнате делит с вами несколько комнат.
Uncaught TypeError: angular.extend is not a function
Вы можете увидеть эти сообщения в консоли DevTools:
Uncaught TypeError: angular.extend is not a function
at Object.setUserInfo (index_0c7087d.js:4)
at index_0c7087d.js:2
at c (vendor_2de5d3a.js:11)
at vendor_2de5d3a.js:11
at c.$eval (vendor_2de5d3a.js:11)
at c.$digest (vendor_2de5d3a.js:11)
at c.$apply (vendor_2de5d3a.js:11)
at l (vendor_2de5d3a.js:11)
at m (vendor_2de5d3a.js:11)
at XMLHttpRequest.C.onreadystatechange (vendor_2de5d3a.js:11)
Uncaught TypeError: angular.forEach is not a function
injector.js
должен выполняться vendor_*.js
и до index_*.js
. Однако TamperMonkey не может точно контролировать время выполнения из-за ограничений Chrome.
В этом случае соединение WebSocket с wechatircd.py
должно быть закрыто. Сообщите пользователям, что им следует перезагрузить веб-страницу.
:
) в Windows.PART (Change name)
JOIN
. Названия каналов генерируются из .NickName
(имя группы), и имя группы может измениться. Я не знаю постоянного идентификатора учетной записи/группы, поскольку UserName
меняется в каждом новом сеансе.