简体中文
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
freenode の #wechatircd に参加するか、Telegram のユーザー グループに参加して、wechatircd について話し合います。 WeeChat での WeChat の使用に関するビデオ
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
フィールドと一致する必要があります。 Chrome では、バージョン 58 以降、証明書での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
証明書を選択し、[Edit] -> [Web サイトの識別にこの証明書を信頼する] を選択します。127.0.0.1:9000
変更する必要があります。Firefox
サーバーは、デフォルトで 127.0.0.1:9000 でinjector.js
および WebSocket 接続を提供しますが、これは--http-listen 0.0.0.0 --http-port 9000
でオーバーライドできます。
HTTPS は次の 2 つの方法で有効にできます。
--http-cert cert.pem --http-key key.pem
wechatircd が HTTPS を使用できるようにするため)--http-cert --http-key
省略すると、wechatircd が HTTP を提供し、リバース プロキシとして Nginx (HTTPS が有効になっている) が使用されます。この場合、ブラウザによって指定されたHost:
に従って、 injector.js
で定義された WebSocket URL が変更されるため、 Host:
を wechatircd ( proxy_set_header Host $http_host;
) に渡す必要があります。 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
場合にすべての連絡先情報をリロードしますサーバーは 1 つの 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 の場合、そのフラッド防止メカニズムにより、2 つのユーザー メッセージが同時に 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 を参照してください。
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
、画像またはファイルを送信します。この機能は、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
、このリポジトリの最新の 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
、サブスクリプション アカウント、レッド パケット、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 クライアントに配信される前に 1 つの文字に変換されます。端末エミュレータは絵文字の幅が 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 は、Quassel を満足させるための接頭辞&
、 --special-channel-prefix '##'
を持つチャンネルをサポートしていないようです/etc/systemd/system/wechatircd.service
のテンプレートについては、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
)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 シリアル化では、誤解を招くフィールド名が使用されています。
contactFactory#addContact
の WeChat 友人:
.Alias
: プロフィール内のName
.NickName
: WeChat ID
.RemarkName
: Set Remark and Tag
.MemberList
の WeChat 友人/非連絡先:
.DisplayName
: My Alias in Group
.NickName
: プロフィール内のName
またはWeChat ID
1 人のユーザーの 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
の前に実行する必要があります。ただし、TamperMonkey は Chrome の制限により実行時間を細かく制御できません。
この場合、 wechatircd.py
への WebSocket 接続を閉じる必要があり、Web ページをリロードする必要があることをユーザーに通知します。
:
:) が含まれる場合がありますPART (Change name)
JOIN
メッセージに気を取られることがなくなります。チャンネル名は.NickName
(グループ名) から生成され、グループ名は変更される場合があります。新しいセッションごとにUserName
が変わるため、アカウント/グループの永続 ID がわかりません。