wechatircd用 IRC 客户端控制微信网页版 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MaskRay
V2EX    微信

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

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

    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
    赞一个!
    bed
        3
    bed  
       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     Solana     1017 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 22:52 PVG 06:52 LAX 15:52 JFK 18:52
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86