V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MaskRay
V2EX  ›  微信

wechatircd——用 IRC 客户端控制微信网页版

  •  
  •   MaskRay · 2016-02-21 16:47:02 +08:00 · 4135 次点击
    这是一个创建于 3202 天前的主题,其中的信息可能已经有所发展或是发生改变。

    wechatircd 类似于 bitlbee ,在微信网页版和 IRC 间建起桥梁,可以使用 IRC 客户端收发微信朋友、群消息、设置群名、邀请删除成员等。

    代码:https://github.com/MaskRay/wechatircd

    原理

    修改网页版微信用的 JS ,通过 WebSocket 把信息发送到服务端,服务端兼做 IRC 服务端,把 IRC 客户端的命令通过 WebSocket 传送到网页版 JS 执行。

    运行

    HTTPS 、 WebSocket over TLS

    推荐使用 TLS 。

    • openssl req -newkey rsa:2048 -nodes -keyout a.key -x509 -out a.crt -subj '/CN=127.0.0.1'创建密钥与证书。
    • Chrome 访问chrome://settings/certificates,导入 a.crt ,在 Authorities 标签页选择该证书, Edit->Trust this certificate for identifying websites.
    • Chrome 安装 Switcheroo Redirector 扩展,把https://res.wx.qq.com/zh_CN/htmledition/v2/js/webwxApp2aeaf2.js重定向至https://127.0.0.1:9000/webwxapp.js
    • ./wechatircd.py --tls-cert a.crt --tls-key a.key,会监听 127.1:6667 的 IRC 和 127.1:9000 的 HTTPS 与 WebSocket over TLS

    HTTP 、 WebSocket

    如果嫌 X.509 太麻烦的话可以不用 TLS ,但 Chrome 会在 console 里给出警告。

    IRC 客户端

    • IRC 客户端连接 127.1:6667 ,会自动加入+status channel ,并给出 UUID Version 1 的 token
    • 登录https://wx.qq.com,对“文件传输助手”(filehelper)或其他人 /群(还是不要骚扰别人吧)发这个 token
    • 回到 IRC 客户端,可以看到微信朋友加入了+status channel ,在这个 channel 发信并不会群发,只是为了方便查看有哪些朋友。
    • 微信朋友的 nick 优先选取备注名(RemarkName),其次为DisplayName(原始 JS 根据昵称等自动填写的一个名字)

    +status channel 可以执行一些命令:

    • help,帮助
    • status,已获取的微信朋友、群列表
    • eval $password $expr: 如果运行时带上了--password $password选项,这里可以 eval ,方便调试,比如eval $password client.wechat_users

    如果微信网页版显示 QR code 要求重新登录,登录后继续对“文件传输助手” 32 个十六进制数字的 token 即可。
    服务端或客户端重启,根据+status channel 上新的 token(或者在+status channel 发送new消息重新获取一个),在微信网页版上对“文件传输助手”输入 token 。

    IRC 命令

    wechatircd 是个简单的 IRC 服务器,可以执行通常的 IRC 命令,可以对其他客户端私聊,创建 standard channel(以#开头的 channel)。另外若用 token 与某个微信网页版连接的,就能看到微信联系人(朋友、群联系人)显示为特殊 nick 、微信群显示为特殊 channel(以&开头,根据群名自动设置名称)

    这些特殊 nick 与 channel 只有当前客户端能看到,因此一个服务端支持多个微信帐号同时登录,每个用不同的 IRC 客户端控制。另外,以下命令会有特殊作用:

    • /query nick打开与$nick的私聊窗口,与之私聊即为在微信上和他 /她 /它对话
    • /list列出所有微信群
    • 程序默认选项为--join auto,收到某个微信群的第一条消息后会自动加入对应的 channel ,即开始接收该微信群的消息。/part [channel]的 IRC 原义为离开 channel ,转换为微信代表在当前 IRC 会话中不再接收该微信群的消息。不用担心, wechatircd 并没有主动退出群的功能
    • /join [chatroom]表示继续接收该微信群的消息
    • /invite nick [channel]为邀请微信朋友加入群
    • 在微信群的 channel 里/kick nick即为删除成员。因为网页版数据限制,无法立即获悉成员变动, channel 里可能看不到改变,但实际已经生效了
    • /topic topic为重命名群,因为 IRC 不支持 channel 改名,实现方式为会自动退出原名称的 channel 并加入新名称的 channel

    Emoji 会显示成<img class="qqemoji qqemoji0" text="[Smile]_web" src="/zh_CN/htmledition/v2/images/spacer.gif">样,发送时用[Smile]即可(相当于在网页版文本输入框插入文本后点击发送)

    详见 https://maskray.me/blog/2016-02-21-wechatircd

    4 条回复    2016-03-16 20:48:46 +08:00
    jonechenug
        1
    jonechenug  
       2016-02-21 18:10:42 +08:00 via Android
    很屌,不过暂时没这个需求
    DesignerSkyline
        2
    DesignerSkyline  
       2016-02-21 19:50:37 +08:00
    赞一个!
    e6nian
        3
    e6nian  
       2016-02-21 21:45:32 +08:00
    很棒,你再挂一个 bot ,微信的 log 就有地方送了:)
    MaskRay
        4
    MaskRay  
    OP
       2016-03-16 20:48:46 +08:00
    多支持两个命令
    `/dcc send nick/channel filename`,给微信朋友或微信群发图片 /文件。参见<https://en.wikipedia.org/wiki/Direct_Client-to-Client#DCC_SEND>
    `/summon nick message`,添加朋友, message 为验证信息
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4853 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:01 · PVG 12:01 · LAX 20:01 · JFK 23:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.