简体中文
wechatircd 向 wx.qq.com 注入 JavaScript( injector.js
),wx.qq.com 使用 WebSocket 与 IRC 服务器( wechatircd.py
)通信,从而使连接到服务器的 IRC 客户端能够与微信发送和接收消息、设置主题、邀请/删除成员,...
IRC WebSocket HTTPS
IRC client --- wechatircd.py --------- browser ----- wx.qq.com
injector.user.js
injector.js
通过加入 freenode 上的 #wechatircd 或 Telegram 上的用户组来讨论 wechatircd。在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 over TLS)。
如果您在另一台计算机上运行服务器,建议使用更多选项设置 IRC over 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
用于服务injector.js
和injector.user.js
IP地址或域名应与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
。火狐浏览器
默认情况下,服务器在 127.0.0.1:9000 上提供injector.js
和 WebSocket 连接,可以使用--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;
),因为它会根据浏览器指定的Host:
更改injector.js
中定义的 WebSocket URL。 wechatircd.py
injector.run()
您将自动加入+wechat
频道并在那里找到您的联系人列表。一些命令可用:
help
eval
,eval 一个 Python 表达式,如: eval server.nick2special_user
eval server.name2special_room
status
,显示联系人/频道reload_contact __all__
,如果 privmsg 中no such nick/channel
则重新加载所有联系信息服务器只能绑定一个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
IRC 版本 3.1、3.2 的server-time
扩展。 wechatircd.py
在消息中包含时间戳(从 JavaScript 获取),以告诉 IRC 客户端消息在给定时间发生。请参阅http://ircv3.net/irc/。有关 IRCv3 的客户端支持,请参阅http://ircv3.net/software/clients.html。
微信配置:
/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
,发送图像或文件。该功能借用了 IRC 客户端中很好支持的/dcc send
命令。请参阅 https://en.wikipedia.org/wiki/Direct_Client-to-Client#DCC_SEND。/invite $nick [$channel]
,邀请联系人加入群组。/kick $nick
,删除群组成员。您必须是小组负责人才能执行此操作。由于Web客户端的缺陷,您可能无法收到会员变更的通知。/kill $nick [$reason]
,导致该客户端的连接关闭/list
,列出组。/mode +m
,在--join new
模式下不重新加入。 /mode -m
恢复。/motd
,查看此 repo 的最新 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
,来自订阅号、红包、网址等的文章,显示为[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,请参阅终端模拟器下使用双倍宽度多色表情符号字体。
--config
,短选项-c
,配置文件路径,参见 config--http-cert cert.pem
,HTTPS/WebSocket 的 TLS 证书。您可以连接证书+密钥,指定单个 PEM 文件并省略--http-key
。如果未指定--http-cert
和--http-key
,则使用 HTTP。--http-key key.pem
,HTTPS/WebSocket 的 TLS 密钥--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-cert 和 --irc-key,则使用普通 IRC。--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
如果你无法忍受每天用手机扫描二维码,请参阅每日扫码的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 ( ) ;
如果你不能忍受每天用手机扫描二维码,你可以在服务器上运行浏览器和wechatircd。
chromium --user-data-dir=$HOME/.config/chromium-wechatircd
创建一个新的浏览器用户配置文件,并执行上述配置( injector.js
、Tampermonkey、 injector.user.js
的证书),然后关闭浏览器。xorg-server-xvfb
)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
,截图并使用移动应用程序扫描二维码。您可以使用 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 序列化使用误导性的字段名称。
contactFactory#addContact
中的微信好友:
.Alias
:他/她的个人资料中的Name
.NickName
: WeChat ID
.RemarkName
: Set Remark and Tag
.MemberList
中的微信好友/非联系人:
.DisplayName
: My Alias in Group
.NickName
: 个人资料或WeChat ID
中的Name
一个用户的 JSON 可能会重复返回,并且所有这些字段可能为空。用户的昵称是通过从以下字段中查找第一个非空值来生成的: .RemarkName
、 .NickName
、 .DisplayName
。如果房间联系人与您共享多个房间,您可能会在 IRC 客户端中看到xx now known as yy
。
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
之前执行。但由于Chrome的限制,TamperMonkey无法精细控制执行时间。
在这种情况下,应关闭与wechatircd.py
的 WebSocket 连接,让用户知道他们应该重新加载网页。
:
PART (Change name)
JOIN
消息而分心。频道名称是从.NickName
(组名称)生成的,组名称可能会更改。我不知道帐户/组的任何持久 ID,因为UserName
在每个新会话中都会更改。