まず、微信の閉鎖的なエコシステムについて少し愚痴を言いたいと思います。搜狗という検索エンジンに微信公式アカウントを検索するための API を提供している以外は、ほとんど利用できる API がありません。これは確かにセキュリティの観点から考えられていることですが、それによっていくつかの興味深い機能が実現できなくなります。例えば、ロボットです。また、いくつかの実用的な機能は、公式のクライアントで実装されていません。
要件#
Chrome 上の Web 版微信をベースに、Chrome の標準のコンソールと JavaScript を利用して、自動的にメッセージを送信する。
施工#
まず、事前に JavaScript という言語については全く知りませんでした。すべては検索エンジンを駆使して一歩一歩実現されたものですので、この記事を見ている方々には、何か問題があればコメントで指摘していただければと思います。
ウェブページのソースコード
まず、もちろんウェブ版微信にログインし、ついでに F12 開発者ツールを開いて、いくつかのメッセージを送信して、ネットワークタブでウェブページのアクティビティを観察しました。すると、
<pre id="editArea" contenteditable-directive="" mm-paste="" class="flex edit_area ng-isolate-scope ng-pristine ng-valid" contenteditable="true" ng-blur="editAreaBlur($event)" ng-model="editAreaCtn" ng-click="editAreaClick($event)" ng-keyup="editAreaKeyup($event)" ng-keydown="editAreaKeydown($event)"></pre>
しかし、何の効果もありませんでした...
Google 検索
その後、微信、メッセージの送信、Chrome、コンソール、JavaScript をそれぞれキーワードにして検索を行い、最終的にこの記事 ->用 javascriptt 脚本实现微信定时发送信息を見つけました。キーワードに一致しました。それで開いてみると、まさに私が求めていたものでした。
コードの修正
// 月曜日から金曜日:午前6:50に相手に起きるように促す、午後9:30に相手に寮に戻るように促す
var appElement = document.querySelector('[ng-controller=chatSenderController]');
var $scope = angular.element(appElement).scope();
setInterval(function(){
var localTime = new Date();
if(localTime.getDay() < 6){ //週末でない場合
var localTimeString = localTime.toLocaleTimeString();
if(localTimeString.indexOf('上午6:49:00') === 0){
$scope.editAreaCtn = "6.50了,你该起床了!";
$scope.sendTextMessage();
}else if(localTimeString.indexOf('上午6:54:00') === 0){
$scope.editAreaCtn = "今天又是新的一天,祝你好运!";
$scope.sendTextMessage();
}else if(localTimeString.indexOf('下午9:28:00') === 0){
$scope.editAreaCtn = "时间快到9:30了,你该回去了!";
$scope.sendTextMessage();
}
}
},1000);
この記事では、メッセージを送信する前にいくつかの判断を行う必要がありますが、私は必要ありません。ただ送信するだけで十分です(そうです、インターバル時間を設定する必要もあります。そうしないとフラッドになってしまいます)。最終的には次のように変更しました:
var appElement = document.querySelector('[ng-controller=chatSenderController]');
var $scope = angular.element(appElement).scope();
setInterval(function(){
$scope.editAreaCtn = "メッセージ内容";
$scope.sendTextMessage();
},1000);
そして、この小さなコードスニペットをコンソールに入力して実行しましたが、あら、速すぎます。急いで停止しましたが、Chrome はメッセージを送信するために全力を注いでいてフリーズしてしまいました... 仕方なく Chrome のプロセスを終了しました。
sleep の追加と最終成果
その後、Python には sleep という使い方があることを思い出し、すぐに検索してみましたが、JavaScript では sleep というものはありません。
最終的にコードを修正し、for ループと組み合わせて無限ループを作成しました。最終的な成果物は以下のようになります:
var appElement = document.querySelector('[ng-controller=chatSenderController]');
var $scope = angular.element(appElement).scope();
async function test() {
$scope.editAreaCtn = "送信内容";
$scope.sendTextMessage();
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
i = 0
for (; ; i++) {
test()
await sleep(1000000)
}
それでは、Web 版微信にログインし、メッセージを送信したいチャットウィンドウを特定し、実行するだけです!
続き
前の記事を書いた後、問題が発生しました。ある人が私のコードに暗号化が付いていると笑いましたので、彼の要求に応じて修正し、10〜15 分のランダムなインターバル時間を追加しました。コードは以下のようになります:
var appElement = document.querySelector('[ng-controller=chatSenderController]');
var $scope = angular.element(appElement).scope();
var n = 10;
var m = 15;
//sleepをインポート
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
//メッセージを送信
async function test() {
$scope.editAreaCtn = "メッセージ内容";
$scope.sendTextMessage();
}
//n〜mのランダムな数を生成
function rd(n,m){
var c = m-n+1;
return Math.floor(Math.random() * c + n);
}
//無限ループ
while(true){
test();
t = rd(n,m)
console.log(t)
await sleep(t * 10000);
}
本日の水文は以上です。